使用 react-native-sound 的正确方法是什么?

What is the correct way to use react-native-sound?

在使用 RNSound 库时,我 运行 遇到了一个问题 - 我无法暂停声音。

初始化:

Sound.setCategory("Playback");
let whoosh = new Sound("complite.mp3", Sound.MAIN_BUNDLE, (error) => {
if (error) {
  console.log("failed to load the sound", error);
  return;
}

})

并像这样使用:

<Button
    onPress={() => {
      if (!start) {
        whoosh.play();
        const myTimer = setInterval(() => {
          setCounter((counter) => counter - 1);
        }, 1000);
        setTimer(myTimer);
        setStart((start) => !start);
      } else {
        whoosh.pause();
        clearInterval(timer);
        setCounter(null);
        setStart((start) => !start);
      }
    }}

第一次按下按钮时,播放声音。第二次按下时,没有任何反应,音乐开始播放。在第三次按下时,相同的旋律第二次并行运行。据我了解,每次单击按钮时,我都会引用一个新的 Sound 实例。请帮忙解决。

p.s。 - 我需要功能组件的解决方案,而不是 class。谢谢

在您的组件范围之外声明 Sound 实例。您不需要每次都创建一个新的 Sound 实例。参考我的样本。

Sound.setCategory('Playback');

var whoosh = new Sound('beep.mp3', Sound.MAIN_BUNDLE, error => {
  if (error) {
    console.log('failed to load the sound', error);
    return;
  }
  // loaded successfully
  console.log(
    'duration in seconds: ' +
      whoosh.getDuration() +
      'number of channels: ' +
      whoosh.getNumberOfChannels(),
  );
});

const App: () => Node = () => {
  const [start, setStart] = useState(false);
  const [counter, setCounter] = useState(0);
  const [timer, setTimer] = useState(null);

  return (
    <Button
      onPress={() => {
        if (!start) {
          whoosh.play();
          const myTimer = setInterval(() => {
            setCounter(counter => counter - 1);
          }, 1000);
          setTimer(myTimer);
          setStart(start => !start);
        } else {
          whoosh.pause();
          clearInterval(timer);
          setCounter(null);
          setStart(start => !start);
        }
      }}
      title="Click me"
    />
  );
};

让我知道进展如何。