问题描述
我正在使用 Flutter 的 Just-Audio
插件播放从我的应用中的 streambuilder
获取的 mp3 文件。 streambuilder
返回 setClip
函数所需的文件的持续时间;
player.setClip(start: Duration(milliseconds: 0),end: Duration(milliseconds: 10);
“结束”点应该是文件的持续时间减去 500 毫秒,而不是“10”。所以我的 initState
;
@override
void initState() {
super.initState();
_init();
}
Future<void> _init() async {
await player.setUrl('https://bucket.s3.amazonaws.com/example.mp3');
player.durationStream.listen((event) {
int newevent = event.inMilliseconds;
});
await player.setClip(start: Duration(milliseconds: 0),end: newevent);
}
但我需要将获取的持续时间转换为整数才能起飞 500 毫秒。不幸的是,int newevent = event.inMilliseconds;
会引发以下错误;
A value of type 'int' can't be assigned to a variable of type 'Duration?'. Try changing the type of the variable,or casting the right-hand type to 'Duration?'.
我已经试过了;
int? newevent = event?.inMilliseconds;
然后;
await player.setClip(start: Duration(milliseconds: 0),end: Duration(milliseconds: newevent));
但后来我在 milliseconds: newevent
下收到了这个红线错误;
The argument type 'Duration?' can't be assigned to the parameter type 'int'.
那么如何从流监听器中获取整数形式的持续时间,以便将其用作 player.setClip
中的终点?
解决方法
问题出现是因为durationStream 返回一个nullable 持续时间,并且它必须是不可为空的才能将其转换为整数。您可以使用空检查将持续时间提升为不可空类型。
此外,要仅在第一个事件之后运行 setClip,请使用 first
而不是 listen
并在函数内移动 setClip
:
player.durationStream.first.then((event) {
if(event != null){
int newevent = event.inMilliseconds - 500;
await player.setClip(start: Duration(milliseconds: 0),end: Duration(milliseconds: newevent);
}
});