Metro/Expo运行报null is not an object(RNPushNotification.createChannel)如何解决
报错复现场景
反复触发报错:null is not an object ( evaluating 'RNPushNotification.createChannel'),Android Studio打包的生产APK运行正常,仅在Metro、Expo开发者模式下运行时报错。
核心原因
该报错本质是开发环境下react-native-push-notification对应的原生模块没有正确挂载到JS层,生产环境打包时原生模块已正确集成所以不会触发报错。
解决方案
- Expo环境兼容问题修复:
react-native-push-notification库不支持Expo Go默认沙箱环境,Expo Go没有预集成该第三方原生模块,因此直接在Expo Go中调试必然触发该报错。两种修复方案:- 改用Expo官方维护的
expo-notifications库实现推送能力,可直接在Expo Go中调试 - 执行
expo prebuild生成Android原生项目,再构建自定义Expo开发客户端进行调试
- 改用Expo官方维护的
- Metro缓存清理:原生依赖链接完成后未清理Metro缓存会导致开发环境加载旧的模块映射,执行对应命令清理缓存后重启调试即可:
# 普通RN项目 npx react-native start --reset-cache # Expo项目 npx expo start --clear - 导入和调用写法校验:不要使用解构方式导入该库的方法,必须导入完整的模块实例后再调用对应方法:
// 错误写法 import { createChannel } from 'react-native-push-notification' // 正确写法 import PushNotification from 'react-native-push-notification' PushNotification.createChannel({ channelId: "your-channel-id", channelName: "Your Channel Name" }) - Android原生注册校验:RN 0.60+自动链接可能存在失效情况,手动检查
android/app/src/main/java/[你的项目包名]/MainApplication.java文件:// 确认已导入对应包 import com.dieam.reactnativepushnotification.ReactNativePushNotificationPackage; // 确认getPackages方法中已注册模块 @Override protected List<ReactPackage> getPackages() { List<ReactPackage> packages = new PackageList(this).getPackages(); packages.add(new ReactNativePushNotificationPackage()); return packages; }
临时兜底方案
开发环境下添加判空逻辑,避免未挂载时调用触发崩溃:
if (PushNotification?.createChannel) { PushNotification.createChannel(/* 你的通道配置 */) }
内容的提问来源于stack exchange,提问作者Chaudhary Ahmad
相关产品推荐
相关产品推荐

