【发布时间】:2020-10-09 13:37:06
【问题描述】:
我用下一个简单的代码来完成登录/注册的整个过程:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<FirebaseUser>.value(
value: _auth.onAuthStateChanged,
child: MaterialApp(
home: Wrapper(),
),
);
}
}
class Wrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final firebaseuser = Provider.of<FirebaseUser>(context);
// return either Home or Authenticate widget:
if (firebaseuser == null) {
return WelcomeScreen();
} else {
return StreamProvider<MyUser>.value(
value: FirestoreService(uid: firebaseuser.uid).user,
child: MaterialApp(
home: HomeWrapper(),
),
);
}
}
}
如您所见,我为我的用户模型(带有用户数据)使用了第二个StreamProvider,该模型在创建或登录的同时填充:
@override
Future<MyUser> signUp(String email, String password, Extrainfo info) async {
try {
AuthResult result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
FirebaseUser firebaseUser = result.user;
// create a new document for the user with the uid
FirestoreService().createUser(firebaseUser.uid,email,extrainfo);
return _userFromFirebaseUser(firebaseUser);
} catch (e) {
//print(e.toString());
//return e.toString();
}
}
通常用户注册/登录WelcomeScreen(),然后第二个stream(属于MyUser)触发HomeWrapper() 的构建(从那里我可以获得所有用户的数据)。用户会自动重定向到这里。
问题是:一切正常除非我在WelcomeScreen() 中引入导航。我需要在其中包含一些屏幕,但是一旦这样做,注册屏幕时不会自动更改为HomeWrapper()(尽管流的值被调用)。登录时不会发生这种情况,因为调用了 onAuthStateChanged 并且在小部件树的较高位置触发了重新构建。
我想问题是第二个 Provider 超出了导航范围,但我不知道如何以适当的方式解决这个问题。
【问题讨论】:
标签: firebase flutter google-cloud-firestore firebase-authentication