问题描述
出于某种原因,我的数据变量在我的 .get() 调用之外一直返回 null。在 .get() 调用中,当我打印数据时,我得到了预期的地图。任何见解表示赞赏!给我带来问题的代码部分标有星号。
class _MessagesScreenState extends State<MessagesScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: <Widget>[
Expanded(
child: Container(
decoration: BoxDecoration(
color: Colors.white,),child: StreamBuilder(
stream: rtdb
.child('messages')
.child(widget.currentUserID)
.onValue,builder: (context,snapshot) {
final messageList = <BuildMessages>[];
if (snapshot.hasData) {
final users = Map<String,dynamic>.from(
snapshot.data.snapshot.value);
users.forEach((key,value) {
**var data;**
**usersRef.child(key).get().then((value) {
data = new Map<String,dynamic>.from(value.value);
});**
final messageTile = BuildMessages(
name: data['userFirstName'] +
' ' +
data['userLastName'],picture: data['userImageUrl'],otherID: data['userID'],);
;
messageList.add(messageTile);
});
}
return ListView.builder(
padding: EdgeInsets.only(top: 15.0),itemCount: messageList.length,itemBuilder: (context,index) {
return messageList[index];
},);
}),],);
}
解决方法
这是预期的行为。 usersRef.child(key).get()
返回 Future<DataSnapshot?>
,因此您需要将其包装到 FutureBuilder
中以使用其值。
基于 this answer 这将类似于:
FutureBuilder<DataSnapshot?>(
future: usersRef.child(key).get(),// async work
builder: (BuildContext context,AsyncSnapshot<DataSnapshot?> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting: return Text('Loading....');
default:
if (snapshot.hasError)
return Text('Error: ${snapshot.error}');
else
return Text('Result: ${snapshot.data!.value}');
}
},)