Just Audio Flutter Plugin - 如何将持续时间从流侦听器转换为整数?

问题描述

我正在使用 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);
  }
});