8
votes

Flutter: Jouez le son en appuyant sur un bouton

Je suis très nouveau dans la programmation et surtout dans le flutter. Je veux écrire une table d'harmonie, essentiellement une liste de boutons et le travail de chaque bouton est de jouer un son que j'ai sur mon PC quand ils sont pressés. J'ai déjà fait la conception avec une vue de liste et quelques boutons matériels mais je ne sais pas comment leur faire jouer des sons lorsque j'appuie dessus. Est-ce que quelqu'un peut m'aider?


2 commentaires

Essayez le plugin audioplayers ici


J'ai vu ça mais je ne comprends rien de cette documentation ...


3 Réponses :


10
votes

Code complet

import 'package:audioplayers/audio_cache.dart';
import 'package:audioplayers/audioplayers.dart';


void main() => runApp(HomePage());

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  AudioCache _audioCache;

  @override
  void initState() {
    super.initState();
    // create this only once
    _audioCache = AudioCache(prefix: "audio/", fixedPlayer: AudioPlayer()..setReleaseMode(ReleaseMode.STOP));
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Music play")),
        body: RaisedButton(
          onPressed: () => _audioCache.play('my_audio.mp3'),
          child: Text("Play Audio"),
        ),
      ),
    );
  }
}

  1. Ajouter la dépendance dans votre pubspec.yaml fichier, audioplayers: any .

  2. Ajoutez un fichier audio dans votre fichier pubspec.yaml .

    actifs: - assets / audio / my_audio.mp3

  3. Exécuter les flutter packages get


6 commentaires

erreur: la méthode «initState» n'est pas définie dans une superclasse de «MyApp».


erreur: la méthode 'AudioCache' n'est pas définie pour la classe '_HomePageState'.


import 'package:audioplayers/audio_cache.dart'; en haut de votre dossier.


Mon problème était que je n'avais pas travaillé avec des widgets avec état avant


import 'package:audioplayers/audio_cache.dart'; import 'package:audioplayers/audioplayers.dart';


J'avais besoin de changer cette ligne pour inclure 'assets' dans le chemin ... _audioCache = AudioCache (prefix: "assets / audio /", fixedPlayer: AudioPlayer () .. setReleaseMode (ReleaseMode.STOP));



2
votes

Si vous souhaitez simplement lire la musique lorsque quelqu'un a appuyé sur le bouton, vous pouvez suivre ces étapes: -

1. Ajouter une dépendance

    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');
                },
              ),
            ),
          ),
        );
      }
    }

puis exécutez la commande suivante dans votre terminal pour obtenir le package nouvellement ajouté -

player.play('note1.wav');

2. Importez-le dans main.dart ou dans le fichier dans lequel vous souhaitez l'utiliser.

 final player = AudioCache();

Là, deux classes que vous pouvez importer AudioPlayer ou AudioCache et pour lire des fichiers locaux AudioCache seront utilisés.

3. Créez un objet d'AudioCache

import 'package:audioplayers/audio_cache.dart'; 

4. Utilisez la méthode play () pour lire votre audio

flutter packages get

Remarque - note1.wav est stocké dans le dossier assets de mon répertoire principal et vous n'avez pas à le mentionner lors de l'utilisation de la méthode play ().

Exemple de code -

dependencies:
      audioplayers: ^0.10.0


1 commentaires

Si quelqu'un a des problèmes avec cette implémentation, je devais arrêter l'application et la redémarrer. Le rechargement / redémarrage à chaud n'était pas suffisant.



0
votes

Pour les sons répétés, je recommande le package soundpool .
D'après mon expérience, il offre une meilleure latence, c'est-à-dire un délai inférieur entre l'action de déclenchement et la lecture réelle du son.
Voici un exemple de code (copié à partir du fichier readme du package):

    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);


0 commentaires