Flutter:带有 onAuthStateChanged 的​​ StreamProvider<FirebaseUser> 始终返回 null 作为第一个值

Posted

技术标签:

【中文标题】Flutter:带有 onAuthStateChanged 的​​ StreamProvider<FirebaseUser> 始终返回 null 作为第一个值【英文标题】:Flutter: StreamProvider<FirebaseUser> with onAuthStateChanged always returns null as a first value 【发布时间】:2020-09-13 15:06:04 【问题描述】:

我正在尝试根据身份验证状态创建一个简单的导航到 Firebase,但出于某种原因 Provider.of&lt;FirebaseUser&gt;(context) 在小部件构建方法中始终返回 null 作为第一个值。所以我的应用程序总是导航到身份验证屏幕,然后从 Firebase 获取真实的用户状态。 我在这里想念什么?

Future<void> main() async 
  WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
      .then((_) => runApp(App()));


class App extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return StreamProvider<FirebaseUser>.value(
//value of user always corresponds to the right auth status
      value: FirebaseAuth.instance.onAuthStateChanged.map((FirebaseUser user) 
        AuthService.instance.user = user;
        return user;
      ),
      child: MaterialApp(
        title: 'Title',
        theme: lightTheme,
        home: LandingScreen(),
      ),
    );
  


class LandingScreen extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
//Even though the user is logged in it returns null for the first build() call            
    final user = Provider.of<FirebaseUser>(context);

    return AnimatedSwitcher(
      duration: const Duration(milliseconds: 3000),
      transitionBuilder: ...,
      child: user != null ? const MainScreen() : const AuthScreen(),
    );
  

【问题讨论】:

你既没有初始值也没有值参数。 谢谢。调用 await FirebaseAuth.instance.currentUser() 并将其值传递给 StreamProvider initialData 对我有用。 StreamProvider(不带 initialData 参数)是否总是返回 null 作为其第一个值? 请阅读答案 觉得有用请点赞和点赞 【参考方案1】:

您可以订阅 FirebaseAuth authStateChanges() 流来监听用户当前的身份验证状态。

FirebaseAuth.instance
  .authStateChanges()
  .listen((User? user) 
    if (user == null) 
      print('User is currently signed out!');
     else 
      print('User is signed in!');
    
  
);

但是检查您提供的代码,验证状态正在final user = Provider.of&lt;FirebaseUser&gt;(context); 上获取。如果提供者在用户登录时没有更新,那么它将始终为空。您可能想改用FirebaseAuth.instance.currentUser()

【讨论】:

以上是关于Flutter:带有 onAuthStateChanged 的​​ StreamProvider<FirebaseUser> 始终返回 null 作为第一个值的主要内容,如果未能解决你的问题,请参考以下文章

带有标题的 Flutter GridView

Flutter - 选择带有显示和返回值的列表

Flutter:带有初始网络请求的 ChangeNotifierProvider

带有滚动条的 Flutter Listview

发送带有附件的电子邮件 Flutter(IOS)

使用带有Flutter的完整Dart SDK