升级Expo SDK 43后使用firebase-js-sdk触发RCTAsyncStorage.multiMerge报错
问题成因
- Expo SDK 43 对应版本移除了 React Native 核心内置的
RCTAsyncStorage原生模块,目前官方推荐使用的社区版@react-native-async-storage/async-storage,在 Web 端实现和部分原生版本中默认没有暴露multiMerge方法。 - firebase-js-sdk 的
getReactNativePersistence方法内部会优先校验RCTAsyncStorage.multiMerge属性是否存在,当该属性不存在时,就会抛出空对象访问的报错,和调用的 auth 具体版本无关,属于持久化层的兼容逻辑问题。

触发报错的代码逻辑在firebase内部:
if (!RCTAsyncStorage.multiMerge) {
解决方案
方案1:手动补全multiMerge兼容方法(推荐,三端通用)
在初始化firebase之前,给AsyncStorage手动添加multiMerge方法的兼容实现即可,不需要修改其他业务逻辑:
import AsyncStorage from '@react-native-async-storage/async-storage'; // 补全firebase需要的multiMerge方法 if (!AsyncStorage.multiMerge) { AsyncStorage.multiMerge = async (keyValuePairs) => { await Promise.all( keyValuePairs.map(async ([key, valueToMerge]) => { const storedValue = await AsyncStorage.getItem(key); const parsedStored = storedValue ? JSON.parse(storedValue) : {}; const parsedToMerge = JSON.parse(valueToMerge); const mergedValue = { ...parsedStored, ...parsedToMerge }; await AsyncStorage.setItem(key, JSON.stringify(mergedValue)); }) ); }; } // 之后再执行firebase初始化逻辑 let auth = initializeAuth(config, { persistence: getReactNativePersistence(AsyncStorage), }); let analytics = getAnalytics(config);
方案2:匹配依赖版本
确认你使用的 @react-native-async-storage/async-storage 版本和Expo SDK 43匹配,Expo SDK 43官方适配的版本为~1.15.0,不要使用过高的版本,避免出现原生模块和JS层不匹配的问题。
方案3:使用自定义持久化层
如果不需要依赖AsyncStorage的持久化能力,也可以自定义firebase的持久化实现,跳过AsyncStorage的校验逻辑,不过该方案需要自己实现数据存储逻辑,适合对持久化有自定义需求的场景。
内容的提问来源于stack exchange,提问作者Steven Matthews
相关产品推荐
相关产品推荐

