StreamBuilder不更新Flutter中的Firestore数据



我正在制作一个Flutter应用程序,我试图在应用程序中获取用户的数据。

基本上,用户注册了他的信息(姓名,电子邮件,密码),当他登录时,这些数据显示在ProfilePage中。

根据Firestore文档,我应该使用StreamBuilder来获取他的数据。

现在一切正常。

问题是当用户退出时,另一个用户登录时,ProfilePage显示前一个用户的数据(该用户退出)

只有当我重新启动应用程序,然后我得到正确的数据。

这是我的ProfilePage:

class UserInformation extends StatefulWidget {
@override
_UserInformationState createState() => _UserInformationState();
}
class _UserInformationState extends State<UserInformation> {
final _uid = FirebaseAuth.instance.currentUser!.uid;
final Stream<QuerySnapshot> _usersStream =
FirebaseFirestore.instance.collection('Users')
.doc(_uid)
.collection('UserData')
.snapshots();
@override
Widget build(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
key: Key(_uid),
stream: _usersStream,
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) {
return const Text('Something went wrong');
}
if (snapshot.connectionState == ConnectionState.waiting) {
return const Text("Loading");
}
return ListView(
children: snapshot.data!.docs
.map((DocumentSnapshot document) {
Map<String, dynamic> data =
document.data()! as Map<String, dynamic>;
return ListTile(
title: Text(data['full_name']),
subtitle: Text(data['company']),
);
})
.toList()
.cast(),
);
},
);
}
}

我看到这个问题在SO上问了好几次,但我找不到一个好的解决方案。我试着在StreamBuilder中添加一个唯一的键,但它不能解决问题。

我也看到didUpdateWidget的使用,但我不明白如何使用它。

try replace this:

final _uid = FirebaseAuth.instance.currentUser!.uid;

与这个:

late final _uid;
@override
initState() {
_uid = FirebaseAuth.instance.currentUser!.uid;
super.initState();
}

然后重新启动你的应用程序,并模拟你的行为

重新加载当前用户详细信息:

await FirebaseAuth.instance.currentUser!.reload();

我想说放置它的最佳位置,是在返回流之前做它,首先使流成为一个方法:

Stream<QuerySnapshot> myStream() async {
await FirebaseAuth.instance.currentUser!.reload();
final _uid = FirebaseAuth.instance.currentUser!.uid;
return FirebaseFirestore.instance.collection('Users')
.doc(_uid)
.collection('UserData')
.snapshots();
}

然后在StreamBuilder中,设置stream属性为:

stream: myStream(),

我找到了解决方案:

我只是把流移动到构建中,问题就解决了!

编辑后:

class UserInformation extends StatefulWidget {
@override
_UserInformationState createState() => _UserInformationState();
}
class _UserInformationState extends State<UserInformation> {
@override
Widget build(BuildContext context) {
final _uid = FirebaseAuth.instance.currentUser!.uid;
final Stream<QuerySnapshot> _usersStream =
FirebaseFirestore.instance.collection('Users')
.doc(_uid)
.collection('UserData')
.snapshots();
return StreamBuilder<QuerySnapshot>(
key: Key(_uid),
stream: _usersStream,
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) {
return const Text('Something went wrong');
}
if (snapshot.connectionState == ConnectionState.waiting) {
return const Text("Loading");
}
return ListView(
children: snapshot.data!.docs
.map((DocumentSnapshot document) {
Map<String, dynamic> data =
document.data()! as Map<String, dynamic>;
return ListTile(
title: Text(data['full_name']),
subtitle: Text(data['company']),
);
})
.toList()
.cast(),
);
},
);
}
}
```

最新更新