Flutter开发音频播放器遇Stream类型不匹配报错如何解决
报错信息
开发Flutter音频播放器功能时,_audioPlayer.sequenceStateStream传入StreamBuilder时抛出如下类型错误:
The argument type 'Stream<SequenceState?>' can't be assigned to the parameter type 'Stream
?'
原有问题代码片段:
final AudioPlayer _audioPlayer; @override Widget build(BuildContext context) { return Row( mainAxisSize: MainAxisSize.min, children: [ StreamBuilder<bool>( stream: _audioPlayer.shuffleModeEnabledStream, builder: (context, snapshot) { return _shuffleButton(context, snapshot.data ?? false); }, ), StreamBuilder<SequenceState>( stream: _audioPlayer.sequenceStateStream, builder: (_, __) { return _previousButton(); }, ),
错误原因
报错本质是泛型可空层级不匹配:
_audioPlayer.sequenceStateStream的实际类型是Stream<SequenceState?>:代表流本身非空,流派发的事件值可以为null- 代码中声明的
StreamBuilder<SequenceState>要求传入的流类型为Stream<SequenceState>?:代表流本身可以为null,流派发的事件值为非空SequenceState
两者泛型参数的可空位置不一致,无法通过Dart的类型校验。
解决方案
二选一即可:
- 方案1:修改StreamBuilder泛型,对齐流的实际类型
将StreamBuilder<SequenceState>修改为StreamBuilder<SequenceState?>,匹配流派发可空事件的特性,后续在builder中使用事件值时补充空值兜底逻辑即可,修改后代码:StreamBuilder<SequenceState?>( stream: _audioPlayer.sequenceStateStream, builder: (context, snapshot) { // 如需使用序列状态,通过snapshot.data取值时做空判断即可 return _previousButton(); }, ), - 方案2:转换流类型,适配原有StreamBuilder泛型
如果不需要处理null状态的事件,可以对流做过滤+类型转换,筛掉null事件后转成非空SequenceState的流,代码示例:StreamBuilder<SequenceState>( stream: _audioPlayer.sequenceStateStream .where((event) => event != null) // 过滤所有null事件 .cast<SequenceState>(), // 转换为非空SequenceState类型的流 builder: (_, snapshot) { return _previousButton(); }, ),
内容的提问来源于stack exchange,提问作者lewis machilika
相关产品推荐
相关产品推荐

