类型 '_InternalLinkedHashMap<String, dynamic>' 不是类型 'String' 的子类型错误

时间:2021-06-27 12:05:09

标签: string flutter dynamic hash hyperlink

我是 Flutter 的新手。我正在学习教程。我正在创建一个基本的聊天应用程序。当我输入代码时没有错误,但是当我运行代码时出现此错误。我不知道我做错了什么。跟着教程走。在教程中,讲师没有任何错误。

void messagesStream() async {
await for (var snapshot in _firestore.collection('messages').snapshots()) {
  for (var message in snapshot.docs) {
    print(message.data());
  }
}}


Widget build(BuildContext context) {
return Scaffold(
  appBar: AppBar(
    leading: null,
    actions: <Widget>[
      IconButton(
          icon: Icon(Icons.close),
          onPressed: () {
            messagesStream();
            // _auth.signOut();
            // Navigator.pop(context);
          }),
    ],
    title: Text('⚡️Chat'),
    backgroundColor: Colors.lightBlueAccent,
  ),
  body: SafeArea(
    child: Column(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
        StreamBuilder<QuerySnapshot>(
            stream: _firestore.collection('messages').snapshots(),
            // ignore: missing_return
            builder: (context, snapshot) {
              if (!snapshot.hasData) {
                return Center(
                  child: CircularProgressIndicator(
                    backgroundColor: Colors.lightBlueAccent,
                  ),
                );
              }
              final messages = snapshot.data.docs;
              List<MessageBubble> messageBubbles = [];
              for (var message in messages) {
                final messageText = message.data();
                final messageBubble = MessageBubble(
                  text: messageText,
                );
                messageBubbles.add(messageBubble);
              }
              return Expanded(
                child: ListView(
                  padding: EdgeInsets.symmetric(
                      horizontal: 10.0, vertical: 20.0),
                  children: messageBubbles,
                ),
              );
            }),

1 个答案:

答案 0 :(得分:0)

Firestore 值位于地图中,这意味着要访问其中一个值,您需要使用一个键。以此为例:

Database message structure example

例如,如果您想访问此消息数据,firestore 会为您提供一个地图,因为它有多个值,这意味着您不能只执行 message.data(),因为它只会检索地图。所以这将是正确的代码:

for (var message in messages) {
            final messageData = message.data();
            final messageText= messageData['text'];

            final messageBubble = MessageBubble(
              text: messageText,
            );
            messageBubbles.add(messageBubble);
          }

您看到要从给定的文档数据中检索任何字段,您可以使用 [] 后跟内部字段的名称。试一试,它现在应该可以工作了。