【问题标题】:Flutter Web - Authentication. User ID lost on hot reloadFlutter Web - 身份验证。热重载时用户 ID 丢失
【发布时间】:2020-03-16 03:58:44
【问题描述】:

我对 Flutter Web 非常陌生,并且一直在努力解决这个问题。这正是我在移动设备上对用户进行身份验证的方式,但由于某种原因,当我在 Flutter Web 上使用热重载时,用户身份验证丢失并返回 null 并显示 CircularProgressIndicator(CPI)。

为什么要这样做?如果 null 被调用,那么它肯定应该显示 LoginPage() - 这是页面最初加载时所做的 - 但是一旦我热重新加载它就会返回 null 和 CPI。

进一步 - 我添加了一个打印语句来帮助我跟踪用户调用 - 并且注意到每次我导航到新页面时都会打印用户 ID,并想知道这是为什么?

我想要达到的目标:

  1. 如果 snapshot.data == null,登录页面会将用户引导至登录页面
  2. 如果 snapshot.data != null,着陆页会将用户引导至主页
  3. 如果 ConnectionState.waiting,则返回循环进度指示器
  4. 如上所述修复错误

    class Landing extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
    final auth = Provider.of<UserRepository>(context, listen: false);
    return StreamBuilder(
      stream: auth.onAuthStateChanged,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.active) {
          User user = snapshot.data;
          print(user);
          return user == null ? LoginPage() : HomePage();
        } else
          return Scaffold(
            body: Center(
              child: CircularProgressIndicator(),
            ),
          );
      },
    );
     }
      }
    

【问题讨论】:

  • 请提供您希望达到的具体问题。
  • 我认为问题在于您的快照始终处于等待重新加载的连接状态。如果是这种情况,一个潜在的解决方案可能是将您的 onAuthStateChanged 流包装在来自 RxDart 的 BehaviorSubject 中。然后,您可以在 StreamBuilder 中向BehaviorSubjectvalue 提供initialData,如果我没记错的话,它会记住最近登录的用户(并且流将始终具有正确的initialData )。如果您需要代码示例,我可以将其转换为答案。

标签: firebase-authentication flutter-web


【解决方案1】:

我是通过 F5 而不是 flutter run -d chrome 运行程序 通过 F5 运行程序可以按下 VScode 上的热重载按钮,但重要的是,Flutter Web 目前不支持热重载。

我相信这部分回答了我的问题。

【讨论】:

    【解决方案2】:

    您正在将流传递到无状态小部件。 将无状态小部件更改为有状态小部件,这将解决您的问题。

    【讨论】:

    • 感谢您的回复,但我不认为这是一个修复。 StreamBuilder 不需要 StatefulWidget。
    • 你的供应商呢?
    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2021-09-17
    • 2014-09-22
    • 2018-09-06
    • 2018-05-28
    • 1970-01-01
    • 2017-01-24
    相关资源
    最近更新 更多