flutter - 注册或登录时 Flutter onAuthStateChanged 流未更新子项
问题描述
我将我的应用程序包装在 StreamProvider.value 中,其中值是 onAuthStateChanged 流,子项是主 MaterialApp。我的主要包装器使用 Provider.of 监听这个值。这适用于退出;一旦我退出,StreamProvider 就会通知我的主包装器,并且应用程序被重定向到欢迎屏幕。
但是,当我尝试创建帐户或登录时,似乎 StreamProvider 没有收到 onAuthStateChanged 流的通知。这就是为什么它如此奇怪,如果流不起作用,那么退出也不应该起作用。此外,当我热重启时,我会被重定向到主屏幕。我分散了互联网:没有运气。这是适当的代码:
在 main.dart
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<FirebaseUser>.value(
value: AuthService().userStream,
child: MaterialApp(
home: Wrapper(),
theme: ThemeData.light().copyWith(
appBarTheme: AppBarTheme(color: Colors.lightBlue),
scaffoldBackgroundColor: Colors.white,
),
),
);
}
}
在 wrapper.dart
class Wrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
print('Rebuilding');
final user = Provider.of<FirebaseUser>(context);
if (user == null) {
return Welcome();
} else {
return Home();
}
}
}
在 auth_service.dart
class AuthService {
FirebaseAuth _auth = FirebaseAuth.instance;
Stream<FirebaseUser> get userStream {
return _auth.onAuthStateChanged;
}
Future registerWithEmailAndPassword(String email, String password) async {
try {
AuthResult result = await _auth.createUserWithEmailAndPassword(
email: email, password: password);
FirebaseUser user = result.user;
return user;
} catch (e) {
print(e.toString());
return null;
}
}
Future signInWithEmailAndPassword(String email, String password) async {
try {
AuthResult result = await _auth.signInWithEmailAndPassword(
email: email, password: password);
FirebaseUser user = result.user;
return user;
} catch (e) {
print(e.toString());
return null;
}
}
void signOut() {
try {
_auth.signOut();
} catch (e) {
print(e);
}
}
}
此外,在我的welcome.dart 中,我将其设置为测试:
onPressed: () {
FirebaseAuth.instance.onAuthStateChanged
.listen((event) {
print('$event from .listen');
});
}
这确实会在我每次登录、注销或注册时通知我,这告诉我 onAuthStateChanged 或我的设置方式没有任何问题。
如果您需要更多信息,请告诉我。我不想再提这个问题了。谢谢您的帮助!
解决方案
推荐阅读
- android - 正确编辑android清单
- python - 如何在 tensorflow 2.4 签名中的两个版本的函数之间共享资源?
- firebase - 如何使用本地模拟器对 Firebase Functions 进行集成测试?
- asp.net-mvc - 这是什么意思
全部 和没有任何 在 - javascript - 使用 Vue 3 安装插件时遇到问题
- python - 拆分字符串并将 Discord 表情符号替换为 [name]
- haskell - 查找 Haskell 模块所属的包
- javascript - 是否有机会在不更新本机状态的情况下获取当前时间(每秒)
- c# - Postgresql 查询返回 NullReferenceException
- android - 文件结构未在颤振项目中加载