You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter 音频播放时如何指定高亮列表特定索引的背景色

问题根因

你当前所有列表项同步变色的核心原因是用了全局布尔变量ishighlight控制所有列表项的背景色,没有绑定对应索引,所以状态一变所有项都会同步变更。


解决方案

1. 替换状态变量

把原有的全局布尔高亮状态,替换为存储当前播放索引的整型变量:

// 废弃原有状态
// bool ishighlight = false;
// 新状态:存储当前正在播放的音频索引,初始为0表示默认高亮第一首,为null则无高亮
int? currentPlayingIndex = 0;

2. 修改列表项高亮判断逻辑

仅在当前列表项的索引和正在播放的索引匹配时,显示高亮背景:

text: TextSpan(
  text: arabic,
  style: TextStyle(
    color: getTextColor(index),
    backgroundColor: currentPlayingIndex == index ? Colors.blue : Colors.white,
    fontSize: 24.0,
    fontWeight: FontWeight.w200,
    fontFamily: 'uthmanitext', 
  ),
)

3. 优化音频播放逻辑,同步更新高亮索引

直接监听播放器的当前播放索引变更事件,比单独监听播放完成事件更准确,可以覆盖快进、快退、手动切歌等场景:

void playAudioNetwork() async{
  List<Audio> _audios = [];
  for (int i =1;i<=7;i++) {
    String url= 'https://everyayah.com/data/Ayman_Sowaid_64kbps/00100${i}.mp3';
    _audios.add(Audio.network(url));
  }
  final playlist = Playlist(audios: _audios);
  
  // 监听播放索引变化,自动同步高亮状态
  audioPlayer.currentIndex.listen((newIndex) {
    setState(() {
      currentPlayingIndex = newIndex;
      // 可选:播放完全部音频后取消高亮
      if (currentPlayingIndex == _audios.length) {
        currentPlayingIndex = null;
      }
    });
  });

  await audioPlayer.open(
    playlist,
    autoStart: true,
    showNotification: true,
  );
}

内容的提问来源于stack exchange,提问作者Noor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:54:07