繁体   English   中英

颤振:StreamProvider<FirebaseUser> 使用 onAuthStateChanged 总是返回 null 作为第一个值

[英]Flutter: StreamProvider<FirebaseUser> with onAuthStateChanged always returns null as a first value

我正在尝试根据身份验证状态创建一个简单的导航到 Firebase,但由于某种原因Provider.of<FirebaseUser>(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(),
    );
  }
}

我正在尝试根据对Firebase的身份验证状态创建一个简单的导航,但是由于某种原因, Provider.of<FirebaseUser>(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(),
    );
  }
}

您可以订阅 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<FirebaseUser>(context);上的身份验证状态final user = Provider.of<FirebaseUser>(context); . 如果用户登录时未更新提供程序,则它将始终为空。 您可能希望改用FirebaseAuth.instance.currentUser()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM