Flutter Firebase验证块在同一流中返回Firebase验证用户和firestore数据



我正在尝试使用BloC处理firebase身份验证并访问云firestore中的用户数据。我使用bloc库中的flutter firebase登录教程。在本教程中,我们可以使用firebase操作用户身份验证,并从authStateChanges((中获取auth-user数据,并创建更改流。我想从cloudfirestore中读取数据,并将这些数据添加到同一个流中。

来自authentication_resposiroty.dart:的原始流

/// Stream of [User] which will emit the current user when
/// the authentication state changes.
///
/// Emits [User.empty] if the user is not authenticated.
Stream<User> get user {
return _firebaseAuth.authStateChanges().map((firebaseUser) {
print('User: $firebaseUser');

final user = firebaseUser == null ? User.empty : firebaseUser.toUser;
_cache.write(key: userCacheKey, value: user);
return user;
});
}
extension on firebase_auth.User {
User get toUser {
return User(
id: uid,
email: email,
photo: photoURL,
emailVerified: emailVerified,
);
}
}

我试着这样做:

/// Stream of [User] which will emit the current user when
/// the authentication state changes.
///
/// Emits [User.empty] if the user is not authenticated.
Stream<User> get user {
return _firebaseAuth.authStateChanges().asyncExpand<User>((firebaseUser) {
print('User: $firebaseUser');
if (firebaseUser == null) {
final user = User.empty;
_cache.write(key: userCacheKey, value: user);
print('User: firebaseUser == null :  $user');
return Stream.value(user);
} else {
return _firebaseFirestore
.collection('Users')
.doc(firebaseUser.uid)
.snapshots()
.map((snapshot) {
final user = User(
id: firebaseUser.uid,
email: firebaseUser.email,
emailVerified: firebaseUser.emailVerified,
datas: snapshot.data(),
);
_cache.write(key: userCacheKey, value: user);
print('User: firebaseUser not null $user');
return user;
});
}
});
}

这项工作,我可以从firestore读取我的用户数据,如果我修改我的数据drome firestore更新得很好,但我有一些问题,当我尝试登录时,流需要时间,我的重定向不起作用,因为我检查user.emailVerified是否为True,流在我验证后更新,我必须再次按下我的loggin按钮。。。然后当我想注销时,我会出现下一个错误,这是我以前没有的原始代码:

I/flutter (22885): AppLogoutRequested()
D/FirebaseAuth(22885): Notifying id token listeners about a sign-out event.
D/FirebaseAuth(22885): Notifying auth state listeners about a sign-out event.
W/Firestore(22885): (24.2.1) [Firestore]: Listen for Query(target=Query(Users/YyvBbHtujyNXZser92XfEfDSRqY2 order by __name__);limitType=LIMIT_TO_FIRST) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
E/flutter (22885): [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: [cloud_firestore/permission-denied] The caller does not have permission to execute the specified operation.
E/flutter (22885):

看起来我没有登录,但我。

我从颤动开始,很抱歉,如果不清楚的话。。。

提前感谢您的回答。

如果我理解正确,Users集合的安全规则要求用户登录以读取/他们的数据。

当用户登录时,您的代码似乎成功地订阅了Firestore中的数据,这意味着您有一个持久的侦听器来检查该数据的更新。

但是,当用户注销时,侦听器不再满足安全规则的要求,因此Firestore会自动取消它。这就是您收到错误消息的时候。

为了防止收到错误消息,可以在用户注销之前分离侦听器。最终结果将是相同的,但通过按时分离它,您将不会从服务器获得错误消息。

最新更新