如何添加到现有列表 - 得到不支持的操作:无法添加到不可修改的列表

com*_*i35 12 flutter

我正在尝试添加到List导致Unsupported operation: Cannot add to an unmodifiable list

但消息列表不是最终的,为什么我不能向其中添加项目?

class Chat {
  final String uuid;
  final User receiverUser;
  List<Message> messages;

  Chat({this.uuid, this.receiverUser, this.messages = const []});   
}
Run Code Online (Sandbox Code Playgroud)

在我的提供程序中,我有一个发送消息方法

  void send(String receiverUUID) async {
    Message message = Message(
        message: messageController.text,
        receiverUUID: receiverUUID,
        timestamp: DateTime.now());

    await _messageApi.send(message);

    Chat chat = await _findOrCreate(receiverUUID);    
    /// FIXME Unhandled Exception: Unsupported operation: Cannot add to an unmodifiable list
    chat.messages.add(message);

    notifyListeners();
  }
Run Code Online (Sandbox Code Playgroud)

Thi*_*rry 36

注意:如果messages是最终版本,您仍然可以将项目添加到该列表中。问题是它messages被分配给const[]构造函数中的默认值。

代替:

chat.messages.add(message);
Run Code Online (Sandbox Code Playgroud)

尝试这个:

chat.messages = [...chat.messages, message];
Run Code Online (Sandbox Code Playgroud)

...价差运算符message此行将在末尾创建一个新列表。

您还可以List.from()结合使用..

chat.messages = List.from(chat.messages)..add(message);
Run Code Online (Sandbox Code Playgroud)

这里..级联表示法。它将添加message到新列表中,但将返回列表而不是add方法的结果(这将是无效的)。

messages您还可以使用非常量 [] 来初始化:

class Chat {
  final String uuid;
  final User receiverUser;
  List<Message> messages;

  Chat({this.uuid, this.receiverUser, List<Messages>? messages})
    : messages = messages ?? [];   
}
Run Code Online (Sandbox Code Playgroud)