簡體   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