使用audioplayers开发木琴应用遇类型错误:String无法转为Source
解决audioplayers中play函数参数类型不匹配问题
你遇到的错误根源是audioplayers 1.x及以上版本的API变更:player.play()方法不再接受字符串路径,必须传入Source类型的对象(比如对应本地资源的AssetSource)。
错误信息明确提示:
"message": "The argument type 'String' can't be assigned to the parameter type 'Source'."
修正步骤:
配置音频资源
确认note1.wav到note7.wav放在项目的assets目录下,然后在pubspec.yaml中声明资源:flutter: assets: - assets/note1.wav - assets/note2.wav - assets/note3.wav - assets/note4.wav - assets/note5.wav - assets/note6.wav - assets/note7.wav # 也可以用通配符简化:- assets/note*.wav修改playSound函数
将原来的字符串路径替换为AssetSource对象:void playSound(int soundNumber) async { final player = AudioPlayer(); await player.play(AssetSource('note$soundNumber.wav')); }如果音频文件在
assets的子目录(比如assets/audio/),路径要对应写成AssetSource('audio/note$soundNumber.wav')。
修正后的完整代码:
import 'package:audioplayers/audioplayers.dart'; import 'package:flutter/material.dart'; void main() => runApp(const XylophoneApp()); class XylophoneApp extends StatelessWidget { const XylophoneApp({super.key}); void playSound(int soundNumber) async { final player = AudioPlayer(); await player.play(AssetSource('note$soundNumber.wav')); } Expanded buildKey({Color? color, int? soundNumber}) { return Expanded( child: TextButton( style: TextButton.styleFrom( backgroundColor: color, ), onPressed: () { playSound(soundNumber!); }, child: const Text(''), ), ); } @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: Scaffold( backgroundColor: Colors.black, body: SafeArea( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: <Widget>[ buildKey(color: Colors.red, soundNumber: 1), buildKey(color: Colors.orange, soundNumber: 2), buildKey(color: Colors.yellow, soundNumber: 3), buildKey(color: Colors.green, soundNumber: 4), buildKey(color: Colors.teal, soundNumber: 5), buildKey(color: Colors.blue, soundNumber: 6), buildKey(color: Colors.purple, soundNumber: 7), ], ), ), ), ); } }
内容的提问来源于stack exchange,提问作者Shashwat Rai
相关产品推荐
相关产品推荐

