children: <Widget> [
(Provider.of<Chat>(context).sender == "blank")
? Container()
: model.detectNewChat(widget.roomId, Provider.of<Chat>(context)),
Expanded(child: ListView(
children: model.chats
.map((chat) => ChatItem(chat, Provider.of<User>(context).id)).toList(),
),),
new Divider(height: 1.0),
我通过使用 Provider.of(context) 解决了它。这是我的socket.io中的代码
StreamController<Chat> chatController = StreamController<Chat>();
socket.on('chat message', (data) => {
print("got reply chat"),
chatController.add(new Chat(data['roomId'], data['username'], "1123", data['message'], DateTime.now())),
});
内部模型
Widget detectNewChat(String currentRoomId, Chat newChat) {
print(newChat.sender + " "+newChat.body);
// TODO add filter if roomId not match with current room id
if (currentRoomId == newChat.roomId) {
addChat(newChat.roomId, newChat);
}
return Container();
}
addChat(String roomId, Chat chat) {
setState(ViewState.Busy);
_socketio.emitNewChat(roomId, chat.body);
this.chats.add(chat);
_isComposingMessage = false;
_textEditingController.clear();
setState(ViewState.Idle);
}
所以如果有新的回复,我可以调用 chatController.add(newChat)。
因为 Provider 库中的 StreamProvider 将继续获取最后一个值。