我正在制作一個 Flutter 應用程式,并試圖在應用程式中獲取用戶資料。
所以基本上,用戶使用他的資訊(姓名、電子郵件、密碼)進行注冊,并且這些資料會在ProfilePage
他登錄時顯示在 a 中。
根據 Firestore 檔案,我應該使用 aStreamBuilder
來獲取他的資料。
此時,一切正常。
問題是當用戶注銷并且另一個用戶登錄時,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
但是我不明白怎么用。
uj5u.com熱心網友回復:
嘗試替換這個:
final _uid = FirebaseAuth.instance.currentUser!.uid;
有了這個:
late final _uid;
@override
initState() {
_uid = FirebaseAuth.instance.currentUser!.uid;
super.initState();
}
然后重新啟動您的應用程式,并模擬您的行為
uj5u.com熱心網友回復:
使用以下命令重新加載當前用戶詳細資訊:
await FirebaseAuth.instance.currentUser!.reload();
我會說放置它的最佳位置是在回傳該流之前執行此操作,首先使 Stream 成為一個方法:
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(),
uj5u.com熱心網友回復:
我找到了解決方案:
我只是將流移動到構建中,問題就解決了!
編輯后:
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(),
);
},
);
}
}
```
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/535796.html
標籤:Google Cloud Collective 扑镖google-cloud-firestoreflutter-strea