gpt4 book ai didi

Flutter:带有 onAuthStateChanged 的​​ StreamProvider 总是返回 null 作为第一个值

转载 作者:行者123 更新时间:2023-12-03 03:54:06 25 4
gpt4 key购买 nike

我正在尝试根据 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); .如果用户登录时未更新提供程序,则它将始终为空。您可能想使用 FirebaseAuth.instance.currentUser()反而。

关于Flutter:带有 onAuthStateChanged 的​​ StreamProvider<FirebaseUser> 总是返回 null 作为第一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62028462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com