' 不是类型 'String' 错误的子类型,string,flutter,dynamic,hash,hyperlink"/>

首页 > 解决方案 > 键入'_InternalLinkedHashMap' 不是类型 'String' 错误的子类型

问题描述

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

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

标签: stringflutterdynamichashhyperlink

解决方案


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

数据库消息结构示例

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

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

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

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


推荐阅读