React Native 激励插屏广告调用报错undefined is not an object 求助
问题原因
- 模块导入导出不匹配:你的Ads.js文件仅定义了
showRewarded函数,但没有对外导出符合预期的结构,你在业务代码中导入的{ Ads }对象不存在,因此调用Ads.showRewarded时触发undefined报错。 - 异步函数调用不规范:
showRewarded是async异步函数,你直接调用获取到的是Promise对象,而非实际的奖励结果。 - 广告加载逻辑的轮询实现存在隐患:while循环每1秒轮询加载状态的方式容易引发内存泄漏,也不符合Admob的事件驱动设计规范。
修复方案
第一步:修改Ads.js的导出逻辑
在Ads.js末尾补充导出代码,同时优化广告加载逻辑:
import { RewardedAd, RewardedAdEventType } from "@react-native-firebase/admob"; // 确保替换为你自己的广告单元ID const UNIT_ID = '你的广告单元ID'; const showRewarded = async () => { return new Promise((resolve, reject) => { const rewarded = RewardedAd.createForAdRequest(UNIT_ID, { requestNonPersonalizedAdsOnly: false, }); const eventListener = rewarded.onAdEvent((type, error, reward) => { if (type === RewardedAdEventType.LOADED) { rewarded.show(); } else if (type === RewardedAdEventType.EARNED_REWARD) { eventListener(); // 移除事件监听避免内存泄漏 resolve(true); } else if (type === RewardedAdEventType.CLOSED) { eventListener(); resolve(false); } else if (error) { eventListener(); console.warn(error); resolve(false); } }); rewarded.load().catch(err => { eventListener(); console.warn(err); resolve(false); }); }); }; // 导出Ads对象,匹配你业务代码的导入逻辑 export const Ads = { showRewarded }
如果你是把Ads.js放在components目录下的index.js里统一导出,还要确保components/index.js里有对应的导出声明:
export * from './Ads';
第二步:修改按钮点击的异步调用逻辑
把showAd改为异步函数,添加await关键字获取实际返回值:
import React from 'react'; import { View, Text, TouchableOpacity } from 'react-native'; import { Ads } from '../components'; // 改为async异步函数 async function showAd() { // 等待广告流程执行完成 const reward = await Ads.showRewarded(); console.log(`The reward is ${reward}`); } <TouchableOpacity style={styles.item} onPress={() => showAd()}> <Text>观看广告</Text> </TouchableOpacity>
内容的提问来源于stack exchange,提问作者Mohammad Miskatur Rahman
相关产品推荐
相关产品推荐

