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

Flutter中just_audio依赖报错:无法播放本地音频文件

Flutter just_audio播放本地音频找不到文件的问题修复

错误原因分析

  1. 初始化顺序错误:initState中先调用了audioPlayer.setAsset(),但此时audioPlayer还未实例化(audioPlayer = AudioPlayer()在之后执行),导致空引用且资源加载逻辑无效。
  2. 异步方法未等待:setAsset()是异步方法,未用await等待加载完成,直接调用play()时资源可能还未就绪,触发找不到文件的错误。

修复后完整代码

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

class AudioPlayerScreen extends StatefulWidget {
  const AudioPlayerScreen({Key? key}) : super(key: key);

  @override
  _AudioPlayerScreenState createState() => _AudioPlayerScreenState();
}

class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
  late AudioPlayer audioPlayer;
  bool isPlaying = false;

  @override
  void initState() {
    super.initState();
    // 先初始化播放器实例
    audioPlayer = AudioPlayer();
    // 异步加载音频资源
    _loadAudioAsset();
  }

  // 封装异步加载资源的方法,添加错误捕获
  Future<void> _loadAudioAsset() async {
    try {
      await audioPlayer.setAsset('assets/music/song1.mp3');
    } catch (e) {
      print('加载音频失败: $e');
      // 可在此添加错误提示UI,比如SnackBar
    }
  }

  @override
  void dispose() {
    audioPlayer.dispose();
    super.dispose();
  }

  void playMusic() async {
    try {
      await audioPlayer.play();
      setState(() {
        isPlaying = true;
      });
    } catch (e) {
      print('播放失败: $e');
    }
  }

  void pauseMusic() {
    audioPlayer.pause();
    setState(() {
      isPlaying = false;
    });
  }

  void stopMusic() async {
    await audioPlayer.stop();
    setState(() {
      isPlaying = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('音频播放器'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            isPlaying
                ? ElevatedButton(
                    onPressed: pauseMusic,
                    child: const Icon(Icons.pause_circle),
                  )
                : ElevatedButton(
                    onPressed: playMusic,
                    child: const Icon(Icons.play_circle),
                  ),
            const SizedBox(height: 16),
            ElevatedButton(
              onPressed: stopMusic,
              child: const Icon(Icons.stop_circle),
            ),
          ],
        ),
      ),
    );
  }
}

额外检查点

  • 确认assets/music/song1.mp3文件真实存在,路径大小写与代码完全一致(Flutter对路径大小写敏感)。
  • 执行flutter pub get确保依赖正确安装。
  • 若问题仍存在,执行flutter clean清理缓存后重新运行项目。

内容的提问来源于stack exchange,提问作者Ernesto Mendoza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 04:12:45