【发布时间】:2020-03-16 03:58:44
【问题描述】:
我对 Flutter Web 非常陌生,并且一直在努力解决这个问题。这正是我在移动设备上对用户进行身份验证的方式,但由于某种原因,当我在 Flutter Web 上使用热重载时,用户身份验证丢失并返回 null 并显示 CircularProgressIndicator(CPI)。
为什么要这样做?如果 null 被调用,那么它肯定应该显示 LoginPage() - 这是页面最初加载时所做的 - 但是一旦我热重新加载它就会返回 null 和 CPI。
进一步 - 我添加了一个打印语句来帮助我跟踪用户调用 - 并且注意到每次我导航到新页面时都会打印用户 ID,并想知道这是为什么?
我想要达到的目标:
- 如果 snapshot.data == null,登录页面会将用户引导至登录页面
- 如果 snapshot.data != null,着陆页会将用户引导至主页
- 如果 ConnectionState.waiting,则返回循环进度指示器
-
如上所述修复错误
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 中向BehaviorSubject的value提供initialData,如果我没记错的话,它会记住最近登录的用户(并且流将始终具有正确的initialData )。如果您需要代码示例,我可以将其转换为答案。
标签: firebase-authentication flutter-web