繁体   English   中英

Flutter 安卓 | Firebase 使用 Firestore 的身份验证持久性

[英]Flutter Androit | Firebase Authentication Persistance with Firestore

我不想保留在 Firebase Auth 中注册的用户的身份验证 state。 用户在 Firestore DB 中有数据。

我最后的尝试:

主要.dart

@override
  Widget build(BuildContext context) {
    return StreamProvider<AppUser?>.value(
      value: AuthenticationService().user,
      initialData: null,
      child: const ....
    );
  }

家.dart

@override
  Widget build(BuildContext context) {
    var user = Provider.of<AppUser?>(context);
    print(user);
    Home.user = user;
    ...
  }

身份验证.dart

class AuthenticationService {
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final FirebaseFirestore _db = FirebaseFirestore.instance;
  final CollectionReference _usersCollection = FirebaseFirestore.instance.collection('users');

  Stream<AppUser?> get user {
    return _auth.authStateChanges().map((firebaseUser) {
      AppUser? user;
      _usersCollection.doc(firebaseUser!.uid).get().then((DocumentSnapshot userSnapshot) {
        user = _toAppUser(firebaseUser, userSnapshot);
      });
      return user;
    });
  }
}

但是使用这段代码,获取用户始终是 null,即使只是在登录之后

因此,经过数十次更改后,以下代码“有效”:

主要.dart

  @override
  Widget build(BuildContext context) {
    cart.cache();
    return const MaterialApp(
      title: 'CharleMi\'App',
      debugShowCheckedModeBanner: false,
      home: Home(),
    );
  }

家.dart

@override
  Widget build(BuildContext context) {
    return StreamBuilder<User?>(
        stream: FirebaseAuth.instance.authStateChanges(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            AuthenticationService.delegate(snapshot.data).then((user) {
              if (user != null) {
                Home.user = user;
              }
            });
          } else if (snapshot.hasError) {
            print(snapshot.error);
          }
          return ....

身份验证.dart

static Future<AppUser?> delegate(User? data) async {
    return AuthenticationService()._toAsyncAppUser(data, null);
  }

Future<AppUser?> _toAsyncAppUser(User? user) async {
    AppUser _user = AppUser(uid: user!.uid);
    var exists = await _user.init(); //Return true, get vars from firestore
    if (exists) {
      return _user; //Returned here when logging in (because exists)
    }
    return null;
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM