【问题标题】:getting null from realtime database in flutter在颤动中从实时数据库中获取空值
【发布时间】:2021-10-29 11:27:09
【问题描述】:

我正在使用 firebase 在颤振中创建一个聊天应用程序,但是我在从实时数据库获取数据时遇到了问题,它是公共聊天,我不确定没有获取数据有什么问题,如果有人的话能帮上忙,不胜感激,谢谢

  • 这是来自 db 的截图

  • 这就是我获取数据的方式

Stream<Event> getMessages() {
   DatabaseReference databaseReference = FirebaseDatabase(databaseURL: databaseUrl).reference().child('Messages');
   return  databaseReference.onValue;
 }


  • 这是我的信息流生成器
Expanded(child: Container(
        child: StreamBuilder<Event>(
          stream: AuthService().getMessages(),
          builder: (context,data){
            if(data.hasError){
              return Center(
                child: Text("No data 1"),
              );
            }
            if(data.connectionState == ConnectionState.done){
              if(data.data!.snapshot.exists){
                print("data is in done" );
                Map<String,dynamic> values = data.data!.snapshot.value;
                for(var child in values.values){
                  var receiverName = child['userName'];
                  var receiverMessage = child['message'];
                  var receiverImageUrl = child['imageUrl'];
                  return Container(
                    child: Container(
                      child: Row(
                        children: [
                          Padding(
                            padding: const EdgeInsets.all(8.0),
                            child: CircleAvatar(
                              radius: 30,
                              backgroundColor: Colors.transparent,
                              backgroundImage: NetworkImage(receiverImageUrl),
                            ),
                          ),
                          Expanded(
                            child: Column(
                              children: [
                                Text(receiverName),
                                Text(receiverMessage)
                              ],
                            ),
                          )
                        ],
                      ),
                    ),
                  );
                }
              }
            }
            return Center(
              child: Text("No data 2"),
            );
          },
        ),
      )),

【问题讨论】:

    标签: android flutter firebase-realtime-database


    【解决方案1】:

    您的代码中有两个问题。

    首先您要读取整个数据库,仅使用Messages 节点。我建议将其更新为:

    Stream<Event?> getMessages() {
      DatabaseReference databaseReference = FirebaseDatabase(databaseURL: databaseUrl).reference().child('Messages');
      return  databaseReference.onValue;
    }
    

    其次,由于您正在阅读Messages,因此您的data.data!.snapshot 将收到多条消息。所以像data.data!.snapshot.value['userName'] 这样的调用是行不通的,因为你没有说从哪个消息中读取userName

    您需要循环访问data.data!.snapshot.value.values,然后在特定子快照上获取['userName']

    【讨论】:

    • 我已经为循环添加了一些代码,我会再次更新它,请告诉我它是否正确
    • 我已经更新了节点和循环的代码,请您再检查一下代码,谢谢
    • 该更新看起来很合理,并且看起来应该解决我发现的两个问题。还有其他问题吗?
    • 非常感谢您的回答,另一件事是我必须使我的地图具有动态,动态,由于某种原因,当我写字符串,动态时,它显示为空,但是当我写动态时,dynmaic , 它返回数据
    • 嗯,这很有趣。它确实应该是 Map&lt;String, dynamic&gt;,因为 Firebase 实时数据库中的键只能是 String。我想知道这是图书馆的错误,还是发生了其他事情。
    猜你喜欢
    • 2022-01-22
    • 2022-01-15
    • 2019-12-12
    • 2020-10-03
    • 1970-01-01
    • 2021-04-25
    • 2019-11-21
    • 2020-05-12
    • 2021-12-29
    相关资源
    最近更新 更多