当用户注销并重新登录时,Firestore 侦听器停止侦听
Firestore listeners stops listening when the user is signed out and re-signed in
最小可重现代码
@override
void initState() {
super.initState();
final col = FirebaseFirestore.instance.collection('foo');
col.doc('bar').snapshots().listen((event) {
print('Data = ${event.data()}');
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
ElevatedButton(
onPressed: () => FirebaseAuth.instance.signInAnonymously(),
child: Text('Sign in'),
),
ElevatedButton(
onPressed: () => FirebaseAuth.instance.signOut(),
child: Text('Sign out'),
),
],
),
);
}
我的安全规则是:
allow read, write: if request.auth != null;
当我注销并再次登录时,我的听众停止收听。这是设计使然吗?每次出现注销事件时,我都应该重新设置我的监听器吗?
是的,您看到的是预期的行为。
由于您的安全规则要求有登录用户才能读取数据,因此退出当前用户会取消所有现有的侦听器(因为它们不再满足要求)。
您必须在新用户完成登录后(重新)附加监听器。
最小可重现代码
@override
void initState() {
super.initState();
final col = FirebaseFirestore.instance.collection('foo');
col.doc('bar').snapshots().listen((event) {
print('Data = ${event.data()}');
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
ElevatedButton(
onPressed: () => FirebaseAuth.instance.signInAnonymously(),
child: Text('Sign in'),
),
ElevatedButton(
onPressed: () => FirebaseAuth.instance.signOut(),
child: Text('Sign out'),
),
],
),
);
}
我的安全规则是:
allow read, write: if request.auth != null;
当我注销并再次登录时,我的听众停止收听。这是设计使然吗?每次出现注销事件时,我都应该重新设置我的监听器吗?
是的,您看到的是预期的行为。
由于您的安全规则要求有登录用户才能读取数据,因此退出当前用户会取消所有现有的侦听器(因为它们不再满足要求)。
您必须在新用户完成登录后(重新)附加监听器。