You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter用audioplayers播放资源音频遇setDataSource failed错误求助

解决Flutter audioplayers播放assets音频的setDataSource错误

核心问题定位

你代码里的关键错误是用错了资源加载类型:DeviceFileSource是用来读取设备本地文件系统里的文件,而assets目录下的资源是打包进应用的内嵌资源,必须用AssetSource来加载。

修正后的代码

替换Source类型,同时优化AudioPlayer的生命周期(避免每次点击都创建新实例,减少资源浪费):

import 'package:flutter/material.dart';
import 'package:audioplayers/audioplayers.dart';

void main() {
  runApp(const Xylophone());
}

class Xylophone extends StatefulWidget {
  const Xylophone({super.key});

  @override
  State<Xylophone> createState() => _XylophoneState();
}

class _XylophoneState extends State<Xylophone> {
  // 提前初始化播放器,复用实例
  final AudioPlayer _player = AudioPlayer();

  @override
  void dispose() {
    // 页面销毁时释放播放器资源
    _player.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: SafeArea(
          child: TextButton(
            onPressed: () async {
              try {
                await _player.play(
                  AssetSource('note1.wav'), // 改用AssetSource加载assets资源
                );
              } catch (e) {
                print('播放出错: $e');
              }
            },
            child: const Text('点击播放'),
          ),
        ),
      ),
    );
  }
}

额外排查项

如果替换后还是报错,按以下顺序检查:

  • 确认pubspec.yaml的assets配置:必须正确声明资源路径,格式如下(注意用空格缩进,不能用tab):
    flutter:
      assets:
        - assets/note1.wav
        # 如果assets下有多个文件,也可以直接写 - assets/
    
    修改后执行flutter pub get生效。
  • 检查音频文件完整性:确保note1.wav是标准可播放的WAV文件,可替换一个已知正常的音频测试。
  • 清理缓存重启:执行flutter clean,然后重启IDE和设备,避免缓存导致的资源加载异常。
  • Android权限检查:虽然播放assets资源不需要存储权限,但如果之前误配置了权限,可检查android/app/src/main/AndroidManifest.xml,移除多余的权限声明。

内容的提问来源于stack exchange,提问作者Parul Pandey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:15:22