undefined 不是对象(评估“sound.loadAsync”)- React Native

Posted

技术标签:

【中文标题】undefined 不是对象(评估“sound.loadAsync”)- React Native【英文标题】:undefined is not an object (evaluating 'sound.loadAsync')- React Native 【发布时间】:2022-01-23 07:26:35 【问题描述】:

您好,我正在创建一个简单的反应原生音频系统,我正在尝试从多个小时开始调试。 我已经从 react-native-audio 尝试过,但这不起作用,它给了我RN.Sound>Isandroid 错误,我正在使用 expo cli,它的 expo-av 给了我这个undefined is not an object (evaluating 'sound.loadAsync') 错误,这是我的代码:

    import  Audio  from 'expo-av';
    let [sound, setSound] = useState();
    
        useEffect(()=>
            Audio.setAudioModeAsync(
                allowsRecordingios:false,
                interruptionModeIOS:Audio.INTERRUPTION_MODE_IOS_DO_NOT_MIX,
                playsInSilentModeIOS:true,
                interruptionModeAndroid:Audio.INTERRUPTION_MODE_IOS_DUCK_OTHERS,
                shouldDuckAndroid:true,
                staysActiveInBackground:true,
                playThroughEarpieceAndroid:true
            );
        )
    
        setSound(new Audio.Sound());
    
        let [status,setStatus] = useState(false);
        sound.loadAsync(require('../../Images/we.wav'), status, false);
    
        const listen =async () => 
            sound.playAsync();
        

【问题讨论】:

【参考方案1】:

问题是因为setState 是一个异步函数。所以setSound(new Audio.Sound());会在sound.loadAsync(require('../../Images/we.wav'), status, false);之后运行,所以那个时候sound是未定义的。

如何解决:

    关注Expo AV documentation(推荐) 如果你真的想在 useEffect 之外运行你的代码,试试这个:


    const _sound = new Audio.Sound();
    _sound.loadAsync(require('../../Images/we.wav'), status, false);
    setSound(_sound);

【讨论】:

以上是关于undefined 不是对象(评估“sound.loadAsync”)- React Native的主要内容,如果未能解决你的问题,请参考以下文章

React native - undefined 不是一个对象('评估 this.props.navigation')

undefined 不是对象(评估“navigation.mediaDevices.getUserMedia”)

TypeError undefined 不是对象(评估'e.props.onChangeToken')

undefined不是对象(评估'_effects.buffers.expanding')

Expo SDK32 undefined 不是对象(评估 '_expo2.default.KeepAwake')

undefined 不是对象(评估“sound.loadAsync”)- React Native