Flutter:setState不更新内部小部件



我有一个歌曲播放列表屏幕,其中包括歌曲列表和用于音频播放/暂停的导航栏。我将歌曲字段的初始值设置为歌曲列表的第一个元素,但是,当我用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

在MusicBarState中,您可以使用widget访问音乐上的音乐字段。您可以将State重构为:

class MusicBar extends StatefulWidget {
final Music music;
const MusicBar({Key key, this.music}) : super(key: key);
MusicBarState createState() => MusicBarState(); // Empty constructor
}
class MusicBarState extends State<MusicBar> {
// Remove this
// final Music music;
// MusicBarState({this.music});
someMethod() {
// You can access to music using widget:
print(widget.music);
}
// ...
}

测试并检查现在是否工作

最新更新