我正在构建一个聊天应用程序,并且正在添加一个语音消息小部件。我需要使用带有消息 ID 的 BLoC 来仅更新该消息。我尝试了以下方法:
为每条具有音频类型的消息添加 AudioPlayer 到 Map 并将其键设置为其消息 id。
构建音频消息时,我在该 Map 中搜索 id 并获取其 AudioPlayer 并为其分配一个名为
player
的变量。
在我的 BLoC 中,我有一个名为
id
的 var,这样我就知道当前小部件的 id 是什么。
在
BlocBuilder
中,我在buildWhen
中写下以下内容:
buildWhen: (previous, current) {
return id == current.id;
},
这会检查此小部件的 id 是否与任何小部件触发的 id 相同,例如:
context.read<ChatMsgBloc>().add(AudioMsgEvent(id: widget.id));
这应该只会重建具有与当前状态 id 相同的 id 的小部件,并且它可以工作。每个玩家都可以播放和停止。但问题是,如果有一个玩家在玩,而用户在没有停止第一个玩家的情况下玩另一个玩家。这将使两个音频继续播放,并且第一个小部件将被重建两次。我知道这真的是错过了,我不知道我的逻辑会怎样,有人可以帮助我吗?
我发现最好、最有效的方法就是使用
ValueListenableBuilder
和 ValueNotifier
而不是 BLoC,并在 blocbuilder 重建时被迫处理。每个 ValueListenableBuilder 只监听它的 ValueNotifier
。