【问题标题】:Flutter: Play sound on button pressFlutter:按下按钮时播放声音
【发布时间】:2019-05-30 12:01:29
【问题描述】:

我对编程非常陌生,尤其是颤振。我想写一个音板,基本上是一个按钮列表,每个按钮的工作是在按下它们时播放我在 PC 上的声音。我已经用列表视图和一些材质按钮完成了设计,但我不知道如何让它们在按下它们时播放声音。有人可以帮我吗?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    将audioplayers 添加为依赖项并将您的音频文件添加到pubspec.yaml 文件中,如下所示:

    dependencies:
      audioplayers: any
    
    flutter: 
      assets:
        - assets/audio/my_audio.mp3
    

    完整代码(Null 安全):

    class _HomePageState extends State<HomePage> {
      late final AudioCache _audioCache;
    
      @override
      void initState() {
        super.initState();
        _audioCache = AudioCache(
          prefix: 'audio/',
          fixedPlayer: AudioPlayer()..setReleaseMode(ReleaseMode.STOP),
        );
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: ElevatedButton(
            onPressed: () => _audioCache.play('my_audio.mp3'),
            child: Text('Play'),
          ),
        );
      }
    }
    

    【讨论】:

    • 错误:方法“initState”未在“MyApp”的超类中定义。
    • 错误:没有为类“_HomePageState”定义方法“AudioCache”。
    • import 'package:audioplayers/audio_cache.dart'; 在文件顶部。
    • 我的问题是我之前没有使用过有状态的小部件
    • 我需要更改此行以在路径中包含“资产”... _audioCache = AudioCache(prefix: "assets/audio/", fixedPlayer: AudioPlayer()..setReleaseMode(ReleaseMode.STOP ));
    【解决方案2】:

    如果您只想在有人按下按钮时播放音乐,那么您可以按照以下步骤操作:-

    1.添加依赖

    dependencies:
          audioplayers: ^0.10.0
    

    然后在你的终端中运行以下命令来获取新添加的包-

    flutter packages get
    

    2。将其导入 main.dart 或您要使用的文件中。

    import 'package:audioplayers/audio_cache.dart'; 
    

    您可以导入两个类 AudioPlayer 或 AudioCache 并使用 AudioCache 播放本地文件。

    3.创建 AudioCache 的对象

     final player = AudioCache();
    

    4.使用 play() 方法播放音频

    player.play('note1.wav');
    

    注意 - note1.wav 存储在我的主目录的 assets 文件夹中,使用 play() 方法时无需提及。 p>

    示例代码 -

        import 'package:audioplayers/audio_cache.dart';
        import 'package:flutter/material.dart';
        
        void main() => runApp(MyApp());
        
        class MyApp extends StatelessWidget {
          final player = AudioCache();
    
          @override
          Widget build(BuildContext context) {
            return MaterialApp(
              home: Scaffold(
                body: SafeArea(
                  child: FlatButton(
                    child: Text("play "),
                    onPressed: () {
                      player.play('note1.wav');
                    },
                  ),
                ),
              ),
            );
          }
        }
    

    【讨论】:

    • 如果有人对此实现有疑问,我必须停止应用程序并重新启动它。热重载/重启是不够的。
    【解决方案3】:

    对于任何需要播放“点击”声音的人:

    import 'package:flutter/services.dart';
    
    SystemSound.play(SystemSoundType.click);
    

    【讨论】:

      【解决方案4】:

      对于重复的声音,我推荐soundpool 包。
      根据我的经验,它提供了更好的延迟,即触发动作和实际声音播放之间的延迟更低。
      这是代码示例(从包的自述文件中复制):

          import 'package:soundpool/soundpool.dart';
      
          Soundpool pool = Soundpool(streamType: StreamType.notification);
          int soundId = await rootBundle.load("sounds/dices.m4a").then((ByteData soundData) {
                        return pool.load(soundData);
                      });
          int streamId = await pool.play(soundId);
      

      【讨论】:

        【解决方案5】:

        首先,您必须在主项目文件夹名称中创建一个目录作为存储所有音乐的“资产”。我有 7 首音乐,比如 note1.wav、note2.wav ..... note7.wav。

        资产

        assets:
             - assets/
        

        依赖关系,

        dependencies:
          audioplayers: ^0.10.0
        

        main.dart 代码

        import 'package:audioplayers/audio_cache.dart';
        import 'package:flutter/material.dart';
        
        void main() => runApp(Xylophone());
        
        class Xylophone extends StatefulWidget {
          @override
          _XylophoneState createState() => _XylophoneState();
        }
        
        class _XylophoneState extends State<Xylophone> {
          
        // music play sound number function, like note1.wav, note2.wav etc.
          void playSound(int number){
            final player = AudioCache();
            player.play('note$number.wav');
          }
        // Expanded Widget Function Used for repeated Code
         Expanded buildKey(int soundNum, Color color){
           return Expanded(
             child: FlatButton(
               color: color,
               onPressed: (){
                 playSound(soundNum);
               },
               child: Text(""),
             ),
           );
         }
          @override
          Widget build(BuildContext context) {
            // var buttonHeight = MediaQuery.of(context).size.height/2;
            return MaterialApp(
              debugShowCheckedModeBanner: false,
              home: SafeArea(
                child: Scaffold(
                  body: Column(
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: <Widget>[
                      buildKey(1, Colors.red),
                      buildKey(2, Colors.green),
                      buildKey(3, Colors.blue),
                      buildKey(4, Colors.deepPurpleAccent),
                      buildKey(5, Colors.redAccent),
                      buildKey(6, Colors.black54),
                      buildKey(7, Colors.pink),
                    ],
                  ),
                ),
              ),
            );
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-02
          • 2015-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多