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

Flutter音乐播放器触发_selectedRadio未初始化LateInitializationError求助

Flutter LateInitializationError 问题修复方案

报错原因

你声明了late修饰的_selectedRadio变量,但没有在首次访问前完成赋值,触发场景有两个:

  • 未先双击任意电台播放,直接点击底部播放按钮,此时_selectedRadio还未被赋值
  • 双击电台的回调逻辑中直接调用了_audioPlayer.play(rad.url),没有走你封装的playMusic方法,_selectedRadio从未被赋值

修复步骤

1. 修改电台双击回调

找到swiper中卡片的onInkDoubleTap回调,将直接调用播放器的逻辑替换为调用你封装的playMusic方法:

.onInkDoubleTap(() {
  // 替换原来的 _audioPlayer.play(rad.url);
  playMusic(rad.url);
});

2. 给底部播放按钮加空安全判断

你可以选择将_selectedRadio改为可空类型避免late未初始化报错:
首先修改变量声明:

// 替换原来的 late MyRadio _selectedRadio;
MyRadio? _selectedRadio;

然后修改底部播放按钮的点击逻辑:

.onInkTap(() {
  if (_isPlaying) {
    _audioPlayer.stop();
  } else {
    // 加空判断,未选择电台时默认播放第一个
    if (_selectedRadio != null) {
      _audioPlayer.play(_selectedRadio!.url);
    } else if (radios.isNotEmpty) {
      playMusic(radios.first.url);
    }
  }
})

同时修改播放状态的文本展示逻辑:

if (_isPlaying && _selectedRadio != null)
  "Playing - ${_selectedRadio!.name} FM".text.makeCentered(),

3. 可选优化:初始化时默认选中第一个电台

你可以在fetchRadios加载完数据后,默认给_selectedRadio赋值第一个电台,避免无选中状态:

fetchRadios() async {
  final radioJson = await rootBundle.loadString("assets/radio.json");
  radios = MyRadioList.fromJson(radioJson).radios;
  // 新增默认赋值
  if (radios.isNotEmpty) {
    _selectedRadio = radios.first;
  }
  setState(() {});
}

内容的提问来源于stack exchange,提问作者Rudransh Singh Mahra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:15:07