flutter - 颤动的firebase身份验证提供者未通知
问题描述
我正在使用颤振进行登录并使用电子邮件注册。我的登录方法工作正常,我的注册(注册)方法基本相同,所以它们应该有相同的结果,但是注册函数中用户状态的变化不会通知包装器中的提供者,所以它无法切换到主屏幕。
在 AuthService 中的代码是这样的:
final FirebaseAuth _auth = FirebaseAuth.instance;
Stream<User> get user {
print(_auth.authStateChanges());
return _auth.authStateChanges();
}
Future signInWithEP (String email, String password) async {
try{
UserCredential result = await _auth.signInWithEmailAndPassword(email: email, password: password);
User user = result.user;
return user;
} catch (e) {
print(e.toString());
return null;
}
}
Future signUpWithEP(String email, String password) async {
try{
UserCredential result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
User user = result.user;
return user;
} catch (e) {
print(e.toString());
return null;
}
}
在 main.dart
return MultiProvider(
providers: [
StreamProvider<User>.value(
value: AuthService().user,
),
],
child: MaterialApp(
home: Wrapper(),
routes: {
'/signin': (context) => SignIn(),
'/register': (context) => Register(),
},
),
在 wrapper.dart 中,
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
print("wrappper $user");
if(user == null) {
return SignIn();
} else {
return Home();
}
}
在这两种情况下(登录和注册),当点击按钮时,它会显示
D/FirebaseAuth( 4977): Notifying id token listeners about user ( some UID ).
D/FirebaseAuth( 4977): Notifying auth state listeners about user ( some UID ).
其中,我相信可能意味着用户状态已更改,但登录时会打印“包装器”+用户;在注册功能中它不会,这意味着包装器中的提供者没有收到更改,并且无法显示主屏幕。谁能告诉我我哪里做错了?
解决方案
我认为您忘记了方法中的 notifyListeners()
Future signInWithEP (String email, String password) async {
try{
UserCredential result = await _auth.signInWithEmailAndPassword(email: email, password: password);
User user = result.user;
notifyListeners(); // add here notify
return user;
} catch (e) {
print(e.toString());
return null;
}
和这里
final user = Provider.of<User>(context)
将其更改为
final user = context.watch<AuthUser>().user
推荐阅读
- spring-boot - 使用 MockitoJunitRunner 进行单元测试:thenReturn 总是为任何(...)匹配器返回 null
- sql - Redshift percentile_disc 查询和分组依据
- mysql - 将两个查询合二为一,条件不同
- r - 如何在 r 中分别导出不同大小的列表及其名称?
- reactjs - React Highcharts 多次触发 setExtremes 事件
- tensorflow - 程序在测试 Tensorflow-gpu 2.0.0 的最后一步崩溃
- android - 从 API 响应创建动态 strings.xml 文件
- c# - x64 中的 COM 异常:检索具有 CLSID {} 的组件的 COM 类工厂失败,原因是以下错误:80080005
- java - 使用 JPA 实现树迭代器
- csv - 使用 Thingsboard 2.2-PE 导出 XLS/CSV 数据