Flutter中audioplayers库报错:String无法赋值给Source参数
问题:
audioPlayer.play() 参数类型不匹配报错 在使用audioplayers库实现音频播放按钮时,执行代码出现以下类型错误:
The argument type 'String' can't be assigned to the parameter type 'Source'
报错代码片段:
playMusic() async { await audioPlayer.play(url); }
原因分析
audioplayers库v1.0.0及以上版本对API进行了更新:play()方法不再直接接收字符串格式的URL,而是要求传入Source类型的对象(如UrlSource、AssetSource等)。你参考的教程代码基于旧版本库编写,因此出现类型不兼容问题。
解决方案
有两种可行的修改方式:
方式1:直接传入UrlSource实例
修改playMusic方法,将字符串URL包装为UrlSource对象传入play():
playMusic() async { await audioPlayer.play(UrlSource(url)); }
方式2:利用已设置的音频源
由于你在initState中已经通过audioPlayer.setSourceUrl(url)设置了音频源,也可以直接调用无参数的play()方法:
playMusic() async { await audioPlayer.play(); }
修改后的完整代码
import 'package:audioplayers/audioplayers.dart'; import 'package:flutter/material.dart'; class AudioPlayerUrl extends StatefulWidget { @override _AudioPlayerUrlState createState() => _AudioPlayerUrlState(); } class _AudioPlayerUrlState extends State<AudioPlayerUrl> { AudioPlayer audioPlayer = AudioPlayer(); PlayerState audioPlayerState = PlayerState.paused; String url = 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-13.mp3'; int timeProgress = 0; int audioDuration = 0; Widget slider() { return Container( width: 300.0, child: Slider.adaptive( value: timeProgress.toDouble(), max: audioDuration.toDouble(), onChanged: (value) { seekToSec(value.toInt()); }), ); } @override void initState() { super.initState(); audioPlayer.onPlayerStateChanged.listen((PlayerState state) { setState(() { audioPlayerState = state; }); }); audioPlayer.setSourceUrl(url); audioPlayer.onDurationChanged.listen((Duration duration) { setState(() { audioDuration = duration.inSeconds; }); }); audioPlayer.onPositionChanged.listen((Duration position) async { setState(() { timeProgress = position.inSeconds; }); }); } @override void dispose() { audioPlayer.release(); audioPlayer.dispose(); super.dispose(); } playMusic() async { await audioPlayer.play(); } pauseMusic() async { await audioPlayer.pause(); } void seekToSec(int sec) { Duration newPos = Duration(seconds: sec); audioPlayer.seek(newPos); } String getTimeString(int seconds) { String minuteString = '${(seconds / 60).floor() < 10 ? 0 : ''}${(seconds / 60).floor()}'; String secondString = '${seconds % 60 < 10 ? 0 : ''}${seconds % 60}'; return '$minuteString:$secondString'; } @override Widget build(BuildContext context) { return Scaffold( body: Container( alignment: Alignment.center, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ IconButton( iconSize: 50, onPressed: () { audioPlayerState == PlayerState.playing ? pauseMusic() : playMusic(); }, icon: Icon(audioPlayerState == PlayerState.playing ? Icons.pause_rounded : Icons.play_arrow_rounded)), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text(getTimeString(timeProgress)), SizedBox(width: 20), Container(width: 200, child: slider()), SizedBox(width: 20), Text(getTimeString(audioDuration)) ], ) ], )), ); } }
内容的提问来源于stack exchange,提问作者G G
相关产品推荐
相关产品推荐

