【问题标题】:Closure call with mismatched arguments: function '[]' error is being shown in flutter参数不匹配的闭包调用:颤振中显示函数“[]”错误
【发布时间】:2021-01-26 06:06:15
【问题描述】:

在我的程序中,此错误仅出现在我的笔记本电脑中。我在教程中输入了确切的代码,但在教程中,它工作正常,我收到了这个错误 -

Closure call with mismatched arguments: function '[]'
Receiver: Closure: () => Map<String, dynamic> from Function 'data':.
Tried calling: []("message")
Found: []() => Map<String, dynamic>

这是我的代码,其中出现了错误。如果您想要完整的功能细节, 你可以把它注释掉,我会在 cmets 中为你提供同样的内容。

import 'package:flutter/material.dart';
import 'package:whatsapp/helper/constants.dart';
import 'package:whatsapp/services/database.dart';
import 'package:whatsapp/widget/widgets.dart';

class ConversationScreen extends StatefulWidget {

  final String chatRoomId;
  ConversationScreen(this.chatRoomId);

  @override
  _ConversationScreenState createState() => _ConversationScreenState();
}

class _ConversationScreenState extends State<ConversationScreen> {

  DatabaseMethods databaseMethods = new DatabaseMethods();
  TextEditingController messageController = new TextEditingController();
  Stream chatMessageStream;

  Widget ChatMessageList() {
    return StreamBuilder(
        stream: chatMessageStream,
      builder: (context, snapshot){
          return ListView.builder(
            itemCount: snapshot.data.documents.length,
            itemBuilder: (context, index) {
              return MessageTile(snapshot.data.documents[index].data["message"]);
            },
          );
      },
    );
  }

  sendMessage() {
    if(messageController.text.isNotEmpty) {
      Map<String, String> messageMap = {
        "message" : messageController.text,
        "sender" : Constants.myName,
      };
      databaseMethods.addConversationMessages(widget.chatRoomId, messageMap);
      messageController.text = "";
    }
  }

  @override
  void initState() {
    databaseMethods.getConversationMessages(widget.chatRoomId).then((value){
      setState(() {
        chatMessageStream = value;
      });
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        backgroundColor: Color(0xff1f1f1f),
        appBar: appBarMain(context),
        body: Container(
          child: Stack(
            children: [
              ChatMessageList(),
              Container(
                alignment: Alignment.bottomCenter,
                child: Container(
                  alignment: Alignment.bottomCenter,
                  padding: EdgeInsets.symmetric(horizontal: 5.0, vertical: 10.0),
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      Expanded(
                        child: Container(
                          width: 300.0,
                          padding: EdgeInsets.symmetric(horizontal: 10.0),
                          decoration: BoxDecoration(
                            color: Color(0xff2D3D3C),
                            borderRadius: BorderRadius.circular(50.0),
                          ),
                          child: TextField(
                            cursorColor: Color(0xff246e5d),
                            controller: messageController,
                            style: TextStyle(
                              color: Colors.white,
                              fontSize: 15.0,
                            ),
                            decoration: InputDecoration(
                              border: InputBorder.none,
                              focusedBorder: InputBorder.none,
                              enabledBorder: InputBorder.none,
                              errorBorder: InputBorder.none,
                              disabledBorder: InputBorder.none,
                              hintText: 'Type a message',
                              hintStyle: TextStyle(
                                color: Colors.white54,
                              ),
                            ),
                          ),
                        ),
                      ),
                      GestureDetector(
                        onTap: (){
                          sendMessage();
                        },
                        child: Padding(
                          padding: EdgeInsets.fromLTRB(8.0, 3.0, 1.0, 2.0),
                          child: Container(
                            height: 50.0,
                            width: 50.0,
                            decoration: BoxDecoration(
                              shape: BoxShape.circle,
                              color: Color(0xff246e5d),
                            ),
                            child: Center(
                              child: Icon(
                                Icons.send,
                                color: Colors.white54,
                                size: 30.0,
                              ),
                            ),
                          ),
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class MessageTile extends StatelessWidget {

  final String message;
  MessageTile(this.message);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text(
        message,
        style: TextStyle(
          color: Colors.white,
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    DocumentSnapshot.data() 是一个方法而不是getter,因此必须包含括号才能实际调用该方法并获取返回的Map。这就是为什么 dart 在您尝试对函数引用使用 [] 运算符时感到困惑并引发错误的原因。

    return MessageTile(snapshot.data.documents[index].data()["message"]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 2022-12-21
      • 2013-12-01
      • 1970-01-01
      • 2022-08-13
      • 2021-12-09
      • 2021-12-10
      相关资源
      最近更新 更多