从经过身份验证的用户在Firebase中创建用户

时间:2019-10-02 02:51:52

标签: flutter dart

我已经设置了一个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");
  }
}

无法上班。控制台打印不显示任何记录。

请告诉我我做错了什么?

谢谢

1 个答案:

答案 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/