当前位置: 首页 > 知识库问答 >
问题:

如何使用Firebase实时数据库数据创建流构建器和列表视图(Flutter聊天应用程序)

慕迪
2023-03-14

我正在为我的个人学习项目构建一个颤振聊天应用程序,数据将从Firebase实时数据库中检索。

我从教程中得到了这段代码,但它显示错误。如何解决这个问题?

StreamBuilder(
      stream: dbRef.onValue,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          print("Error on the way");
          messages.clear();
          DataSnapshot dataValues = snapshot.data.snapshot; //Error: The getter snapshot is not defined for the type 'Object';
          Map<dynamic, dynamic> values = dataValues.value;
          values.forEach((key, values) {
            messages.add(values);
          });
          return new ListView.builder(
            shrinkWrap: true,
            itemCount: messages.length,
            itemBuilder: (BuildContext context, int index) {
              return Card(
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Text("Name: " + messages[index]["Text"]),
                    Text("Time: " + messages[index]["TextTime"]),
                  ],
                ),
              );
            },
          );
        }
      },
    ),

共有2个答案

岳志义
2023-03-14

这就解决了问题。

StreamBuilder(
                stream: _dbRef.onValue,
                builder: (context, snapshot) {
                  List<Message> messageList = [];
                  if (snapshot.hasData &&
                      snapshot.data != null &&
                      (snapshot.data! as DatabaseEvent).snapshot.value !=
                          null) {
                    final myMessages = Map<dynamic, dynamic>.from(
                        (snapshot.data! as DatabaseEvent).snapshot.value
                            as Map<dynamic, dynamic>); //typecasting
                    myMessages.forEach((key, value) {
                      final currentMessage = Map<String, dynamic>.from(value);
                      messageList.add(Message(
                          author: currentMessage['Author'],
                          authorId: currentMessage['Author_ID'],
                          text: currentMessage['Text'],
                          time: currentMessage['Time'],));
                    }); //created a class called message and added all messages in a List of class message
                    return ListView.builder(
                      reverse: true,
                      itemCount: messageList.length,
                      itemBuilder: (context, index) {
                        return ChattingDesign(
                          message: messageList[index],
                          dbpathToMsgChnl:
                              'TextChannels/${widget.channels['ChannelName']}/Messages',
                          showName: shouldShowName(
                            index,
                            messageList.length - 1,
                            messageList,
                          ),
                        );
                      },
                    );
                  } else {
                    return Center(
                      child: Text(
                        'Say Hi...',
                        style: TextStyle(
                            color: Colors.white,
                            fontSize: 21,
                            fontWeight: FontWeight.w400),
                      ),
                    );
                  }
                },
              ),
司寇旺
2023-03-14

根据DataSnapshot类文档,没有称为快照的字段

我认为你的代码中有一个错字。

试试这个

StreamBuilder(
      stream: dbRef.onValue,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          print("Error on the way");
          messages.clear();
          DataSnapshot dataValues = snapshot.data! as DataSnapshot ; //here's the typo;
          Map<dynamic, dynamic> values = dataValues.value;
          values.forEach((key, values) {
            messages.add(values);
          });
          return new ListView.builder(
            shrinkWrap: true,
            itemCount: messages.length,
            itemBuilder: (BuildContext context, int index) {
              return Card(
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Text("Name: " + messages[index]["Text"]),
                    Text("Time: " + messages[index]["TextTime"]),
                  ],
                ),
              );
            },
          );
        }
      },
    ),
 类似资料:
  • 我正在开发一个Android聊天应用程序,似乎我需要通过FCM发送每条消息,还需要保存到实时数据库。 我使用Firebase realtime DB存储和发送消息。我仍然需要发送每个消息(或至少消息id)也通过FCM。我担心如果我不这样做,并且只在应用程序在后台时发送FCM,用户可能会错过一些传入的消息。 将侦听器放在服务上似乎不够可靠(如果android干掉了服务怎么办?直到我重新启动它,我可能

  • 我正在构建一个使用Firestore存储大多数数据的应用程序。该应用程序具有聊天功能,我正在考虑使用实时数据库。使用Firebase Firestore vs Realtime Database实现此聊天功能有哪些好处?如果没有区别,我应该什么都使用Firestore吗? 附言:我已经阅读了两个https://firebase.google.com/docs/database/rtdb-vs-fi

  • 我希望基本上在我的应用程序内翻拍Kik。对于我在firebase聊天应用程序上看到的大多数指南,都有一个主要的消息节点,然后在该节点下面有一个扇出,每个用户都有引用主列表中消息的消息。 根据目前我的Firebase的布局方式,实现类似以下内容会更容易: 因此,当用户向对方发送消息时,我会更新发送者和用户下面的“聊天消息”节点。 有什么理由不这样做吗?我看到每个人都按照我描述的第一种方式进行,但我看

  • 有没有办法将所有子节点检索到textView?,我想创建一个用户日志,您可以在其中跟踪用户进行了何种交易,但我不知道如何获取节点及其子节点列表。 目前为止的代码:

  • 我们正在构建一个聊天应用程序,一对一聊天是该应用程序的主要目的,所以目前,消息传递速度是我们的第一要务。我们需要一个后端解决方案,我们最初计划使用Firebase实时数据库。但后来Firestore出现了,从那以后,我们看到了Firebase团队对实时数据库Firestore的许多建议。 我们已经使用了实时数据库和Firestore,所以我们非常了解两者的功能和查询能力。对于我们的用例,就特性而言