【发布时间】:2021-07-10 22:29:00
【问题描述】:
我有一个歌曲播放列表屏幕,其中包括一个歌曲列表和一个用于音频播放/暂停的导航栏。我将歌曲字段的初始值设置为歌曲列表的第一个元素,但是,当我使用setState() 更新所选歌曲时,导航栏不会更新其歌曲。
class Body extends StatefulWidget {
@override
BodyState createState() => BodyState();
}
class BodyState extends State<Body> {
Music selectedSong = songs[0];
...
@override
Widget build(BuildContext context) {
return Column(
...
Expanded(
child: ListView.builder(
shrinkWrap: true,
scrollDirection: Axis.vertical,
padding: const EdgeInsets.only(top: 20),
itemCount: songs.length,
itemBuilder: (context, i) => songCard(songs[i])
...
MusicBar(music: selectedSong)
对于songCard()函数:
Widget songCard(Music item) {
return ListTile(
onTap: () => {
setState(() {
selectedSong = item;
})
},
...
当我调试代码时,selectedSong 字段按预期更新,但 MusicBar 内的 music 字段未更新。
对于 MusicBar 类:
class MusicBar extends StatefulWidget {
final Music music;
const MusicBar({Key key, this.music}) : super(key: key);
MusicBarState createState() => MusicBarState(music: music);
}
class MusicBarState extends State<MusicBar> {
final Music music;
MusicBarState({this.music});
AudioPlayer player = AudioPlayer();
@override
void initState() {
super.initState();
// duration = music.duration;
player.onDurationChanged.listen((updatedDuration) {
setState(() {
duration = updatedDuration;
});
});
player.onAudioPositionChanged.listen((updatedPosition) {
setState(() {
position = updatedPosition;
});
});
}
@override
void dispose(){
super.dispose();
player.stop();
player.dispose();
}
@override
Widget build(BuildContext context){
return Container(
...
我做错了什么导致MusicBar 小部件没有更新?
如果需要,歌曲列表在Body 类之外定义,我正在使用audioplayers 库
【问题讨论】:
标签: flutter setstate statefulwidget