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
相关产品推荐
相关产品推荐

