1 回答
TA贡献1877条经验 获得超6个赞
请记住,您的函数体中的所有内容都将在每次渲染上运行 - 因此在这种情况下,您正在创建一个新的soundObject并可能soundObject.loadAsync在每个渲染上运行调用。您需要利用其他钩子来避免这种情况 - 在您的情况下可能useRef和useEffect. 我建议通过 hooks api 参考熟悉这些:https : //reactjs.org/docs/hooks-reference.html
这是我如何避免不必要的影响的快速尝试。您可能想要查看和调整依赖项数组,具体取决于您希望事情如何运作以及您希望何时重新运行各种效果。例如,我不确定您是否需要Sound重新创建对象。
import React, { useState, useRef, useCallback, useEffect} from 'react';
import { Audio } from 'expo-av';
import { Button, View, Text } from 'react-native';
const AudioPlayer = ({ user }) => {
const [currentProgress, setCurrentProgress] = useState(0);
const soundObjectRef = useRef(new Audio.Sound());
useEffect(() => {
const playbackUpdate = (playbackObject) => {
setCurrentProgress(playbackObject.currentMillis);
// updating state with progress through audio file in milliseconds
}
soundObjectRef.current.setOnPlaybackStatusUpdate(playbackUpdate);
}, []); // do this only once per component mount
// sets a function that is called every 500 milliseconds as the audio is played
useEffect(() => {
if (user) {
soundObjectRef.current.loadAsync({user.message.path});
}
}, [user]); // run this anytime user changes but do not run again if user doesn't change
const play = () => {
soundObjectRef.current.playAsync();
}
return (
<View>
<Text>{currentProgress}</Text>
<Button title="play" onPress={play} />
</View>
)
}
export default AudioPlayer
添加回答
举报