javascript - Opriți audio expo-av - React Native Expo


Folosesc Audio din expo-av în react-native-expo.

Pot reda audio folosind metoda loadAsync pe constructorul Audio.sound.

Deși, când încerc să opresc vocea, vocea nu se oprește.

Următorul este fragmentul de cod minimalist. Este aceasta metoda corectă de a opri sunetul? Nu reușesc să găsesc soluția pentru aceasta.

import React, {useState,  useEffect} from 'react';
import {  Button } from 'react-native';
import { Audio } from 'expo-av';

export default function App() {
  const [audioStatus, setAudioStatus] = useState(false)
  const sound = new Audio.Sound();
  
  useEffect(()=>{
    (async () => {
            console.log('status', audioStatus)
            if (audioStatus) {
                await sound.loadAsync('https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3')
                try {
                    await sound.playAsync()
                } catch (e) {
                    console.log(e)
                }
            }else {
                await sound.stopAsync()
                await sound.unloadAsync()
            }
          })()
  },[audioStatus])
  
  return (
      <Button color={audioStatus ? 'red' : 'green'} title={'play'} onPress={()=>setAudioStatus(!audioStatus)} />
  );
}

Mulțumesc anticipat

Răspuns #1

Aceasta este o problemă React. De fiecare dată când componenta ta se reîncarcă, variabila sound este resetată la un obiect Audio.Sound nou, care încă nu este încărcat. Aici, sound ar trebui să facă parte din starea componentei. Poți schimba linia:

const sound = new Audio.Sound();

către

const [sound, setSound] = useState(new Audio.Sound());

și va funcționa.

Expo Gustare