React Native Expo项目配置Firebase Analytics时出现默认App未初始化报错的解决求助
React Native Expo项目配置Firebase Analytics时出现默认App未初始化报错的解决求助
我卡了好长时间了!明明按照相关文档配置了Firebase Analytics,但每次尝试设置用户ID时都会弹出这个错误:
error while setting analytics user id: [Error: No Firebase App '[DEFAULT]' has been created - call firebase.initializeApp()]
求大家给点实用的解决办法,不要只甩文档链接,我已经翻了好多遍了😭
先贴一下我的代码,麻烦帮我看看问题出在哪:
App.js 核心代码
import { auth } from './firebase.js' import analytics from '@react-native-firebase/analytics'; import { useState, useEffect } from 'react'; import { NavigationContainer } from '@react-navigation/native'; import AuthNavigator from './path-to-AuthNavigator'; import MainNavigator from './path-to-MainNavigator'; const App = () => { const [currentUser, setCurrentUser] = useState(null); useEffect(() => { (async () => { if(currentUser){ console.log("I have current user: ", analytics()) try{ await analytics().setUserId(currentUser.uid) console.log("all done") }catch(error){ console.log("error while setting analytics user id: ", error); } } })(); }, [currentUser]); useEffect(() => { const unsubscribe = auth.onAuthStateChanged((user) => { if (user) { setCurrentUser(user); } }); return () => unsubscribe(); }, []); if(!currentUser){ return ( <NavigationContainer> <AuthNavigator /> </NavigationContainer> ); } else{ return ( <NavigationContainer> <MainNavigator /> </NavigationContainer> ); } }; export default App;
firebase.js 配置文件
import firebase from "firebase/compat/app"; import 'firebase/compat/firestore' import 'firebase/compat/auth' const firebaseConfig = { apiKey: "some_key", authDomain: "some_domain", databaseURL: "some_url", projectId: "some_project_id", storageBucket: "some_id", messagingSenderId: "id", appId: "id", measurementId: "id" }; if (firebase.apps.length === 0) { firebase.initializeApp(firebaseConfig); } const authState = firebase.auth(); export const auth = authState; export const firestore = firebase.firestore();
实用解决方案(亲测有效)
问题根源
你确实踩了「新旧Firebase SDK混用」的坑!firebase/compat/*是旧版命名空间式的SDK,而@react-native-firebase/analytics是新版模块化的SDK,这俩的初始化逻辑完全独立,所以新版Analytics找不到旧版Compat初始化的App实例,就会报这个错误。
下面给你两个可行的修复方案,推荐第一个:
方案一:统一使用新版模块化Firebase SDK(推荐,未来兼容性更好)
- 先确保安装了新版核心依赖:
# 安装新版核心包 npm install firebase # Bare React Native项目还需安装对应的Analytics包 npm install @react-native-firebase/analytics @react-native-firebase/app - 重写firebase.js文件,改用新版模块化初始化:
// firebase.js import { initializeApp, getApp, getApps } from 'firebase/app'; import { getAuth } from 'firebase/auth'; import { getFirestore } from 'firebase/firestore'; const firebaseConfig = { apiKey: "some_key", authDomain: "some_domain", databaseURL: "some_url", projectId: "some_project_id", storageBucket: "some_id", messagingSenderId: "id", appId: "id", measurementId: "id" }; // 确保只初始化一次App实例 const app = !getApps().length ? initializeApp(firebaseConfig) : getApp(); // 获取Auth和Firestore实例 const auth = getAuth(app); const firestore = getFirestore(app); export { auth, firestore }; - 优化App.js中的Analytics使用:
新版SDK会自动关联已初始化的App,现有代码只需小改即可:// App.js中的useEffect可以优化为更清晰的写法 useEffect(() => { const setAnalyticsUserId = async () => { if (!currentUser) return; try { await analytics().setUserId(currentUser.uid); console.log("all done"); } catch (error) { console.log("error while setting analytics user id: ", error); } }; setAnalyticsUserId(); }, [currentUser]);
方案二:继续使用旧版Compat SDK(过渡用)
如果你暂时不想切换新版,那就把Analytics也换成Compat版本:
- 安装Compat版Analytics:
npm install firebase/compat/analytics - 修改firebase.js文件,添加Analytics的导入和导出:
import firebase from "firebase/compat/app"; import 'firebase/compat/firestore' import 'firebase/compat/auth' import 'firebase/compat/analytics'; // 新增 const firebaseConfig = { // 你的配置保持不变 }; if (firebase.apps.length === 0) { firebase.initializeApp(firebaseConfig); } const authState = firebase.auth(); const analytics = firebase.analytics(); // 新增 export const auth = authState; export const firestore = firebase.firestore(); export { analytics }; // 新增 - 调整App.js中的使用方式:
从firebase.js导入analytics,替换原有的@react-native-firebase/analytics:// App.js的导入改为 import { auth, analytics } from './firebase.js'; // useEffect中直接使用导入的analytics实例 try { await analytics.setUserId(currentUser.uid); console.log("all done"); } catch (error) { console.log("error while setting analytics user id: ", error); }
最后必检查的两个点
- 确保平台配置文件正确:
- Android:
android/app/google-services.json已放在指定目录 - iOS:
ios/[你的项目名]/GoogleService-Info.plist已添加到Xcode项目中
- Android:
- 确保Firebase初始化最早执行:在App.js最顶部就导入
./firebase.js,避免在初始化完成前调用Firebase服务。
备注:内容来源于stack exchange,提问作者newbie coder
相关产品推荐
相关产品推荐

