【问题标题】:How to create streambuilder and listview with Firebase Realtime database data (Flutter chat app)如何使用 Firebase 实时数据库数据创建流构建器和列表视图(Flutter 聊天应用)
【发布时间】:2022-01-21 08:45:39
【问题描述】:

我正在为我的个人学习项目构建一个颤振聊天应用程序,其中数据将从 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"]),
                  ],
                ),
              );
            },
          );
        }
      },
    ),

【问题讨论】:

    标签: firebase flutter firebase-realtime-database


    【解决方案1】:

    根据DataSnapshot Class Documentation,没有名为snapshot的字段

    我认为您的代码中有错字。

    试试这个

    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"]),
                      ],
                    ),
                  );
                },
              );
            }
          },
        ),
    

    【讨论】:

    • 显示另一个错误:“Object 类型的值?不能分配给 'Datasnapshot' 类型的变量。尝试更改...”
    • 尝试类型转换为 Datasnapshot ` DataSnapshot dataValues = snapshot.data!作为数据快照`
    【解决方案2】:

    这解决了问题。

    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),
                          ),
                        );
                      }
                    },
                  ),
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2016-06-28
    • 2019-02-23
    • 2017-02-26
    • 1970-01-01
    • 2017-11-16
    • 2023-04-04
    相关资源
    最近更新 更多