【发布时间】:2021-09-29 23:34:00
【问题描述】:
尝试将audioplayer 插件集成到 Listview 中,这是我的结构,
ListView.builder(
cacheExtent: 50.0,
reverse: true,
padding:
const EdgeInsets.all(15),
controller:
_listScrollController,
itemCount: Chats.length,
itemBuilder: (ctx, i) {
print(firebaseUID);
if (Chats[i].data()['IsFile'] !=null && Chats[i].data()['IsFile'] &&
Chats[i].data()['FileType'] !=null && Chats[i].data()['FileType'] ==
'audio') {
return AudioSentChat(i: i);
} else
return Container();
},
);
而音频发送聊天是一个像这样的无状态小部件,
child: Container(
padding: EdgeInsets.only(top: 15),
height: 75,
child: PlayerWidget(
url: Chats[i]
.data()['FileUrl'],
mode: PlayerMode
.MEDIA_PLAYER),
),
PlayerWidget 是一个有所有播放/暂停交互的 Statefull 小部件,这里是https://github.com/luanpotter/audioplayers/blob/master/packages/audioplayers/example/lib/player_widget.dart
现在的问题是,
- 当一个新的音频文件被录制并添加到列表视图(添加到 firebase)时,用户界面会更新,但是当你播放它时,所有文件都是重复的,我检查了数据,这是完美的而不是重复的。
- 现在,当屏幕滚动一点然后播放文件时,它可以完美运行,没有任何重复。
观察,player_widget 中的 intiState() 不会在 Listview 更新时触发。
如何处理,将有状态的小部件放在列表视图中也是一个坏主意。
【问题讨论】: