StreamBuilder 中的数据在 Firebase RTDB get() 调用之外不断返回 null

问题描述

出于某种原因,我的数据变量在我的 .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}');
    }
  },)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...