我已经设置了一个Auth类来处理所有存储经过身份验证的用户的登录方法。
将我已通过身份验证的用户传递到登录页面上的提供者,以决定是否经过身份验证的页面流。
Widget build(BuildContext context) {
final auth = Provider.of<AuthBase>(context);
//get provider instace
return StreamBuilder<User>(
stream: auth.onAuthStateChanged,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
User user = snapshot.data;
if (user == null) {
return SignInScreen();
} else //add this user to proivders
return Provider<RegisteredUser>(
builder: (context) => FireStoreDatabase( uid: user.uid),
child: HomeScreen());
} else {
return Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
}
});
}
如果用户已通过身份验证,请返回到HomeScreen。
我为注册用户提供了另一个提供商。从这里,我将Auth用户传递给提供程序,以检查Firebase文档中是否存在经过身份验证的用户。
如果没有,则经过身份验证的用户将进入“注册”页面并弹出详细信息,然后在Firebase数据库中设置信息,并将值传递给新变量> user
abstract class RegisteredUser {
Future<void> creatUserInFirestore(context, uid);
}
class FireStoreDatabase implements RegisteredUser {
FireStoreDatabase({this.uid}) : assert(uid != null);
final String uid;
Future<void> creatUserInFirestore(context, uid) async {
User user = uid;
DocumentSnapshot doc = await usersRef.document(user.uid).get();
if (!doc.exists) {
final username = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CreateAccount(),
),
);
usersRef.document(user.uid).setData({
"id": user.uid,
"username": username,
"photoUrl": user.photoUrl,
"email": user.email,
"displayName": user.displayName,
"bio": "",
"timestamp": timestamp,
"travelMethod": "",
"website": "",
});
doc = await usersRef.document(user.uid).get();
}
user = User.fromDocument(doc);
print(user.displayName);
print("This is the uid: $uid");
}
}
无法上班。控制台打印不显示任何记录。
请告诉我我做错了什么?
谢谢
答案 0 :(得分:0)
final username = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CreateAccount(),
),
);`
我想username
是无效的,请记住,您也在等待返回。
返回一个完整的[Future],该值传递到传递给
result
的值 从导航器弹出被推入路线时[pop]。
也不要仅将上下文传递给服务类,以便您可以导航。 auth / user api的实现应在auth / user api类中。
将由于相同原因而发生变化的事物聚集在一起。分离 那些由于不同原因而改变的东西。
我遵循的是我强烈推荐的出色架构: https://www.filledstacks.com/post/flutter-provider-v3-architecture/
对于您的路由上下文问题: https://www.filledstacks.com/post/navigate-without-build-context-in-flutter-using-a-navigation-service/