Expo React Native 应用 + Redux-Persist: AsyncStorage 问题

4
我刚刚开始一个新的 托管 Expo React Native 项目(Expo SDK 35,React Native 0.5.9)使用 redux-persist@6.0.0,但是即使使用带有 redux/redux-persist 的新的 expo 项目也会出现以下错误。
从 react-native 使用 AsyncStorage
我们遇到以下错误:

redux-persist: 需要 config.storage。尝试使用提供的 storage 引擎 import storage from 'redux-persist/lib/storage'


从 @react-native-community/async-storage 使用 AsyncStorage
我们遇到以下错误:

[@RNC/AsyncStorage]: NativeModule: AsyncStorage is null.


从 redux-persist/lib/storage 使用 storage
我们遇到以下错误:

console.error: "redux-persist failed to create sync storage. falling back to noop storage."


问题: 如何在不弹出的情况下解决此问题?谢谢!
redux-persist 代码: 注意:之前的尝试已被注释掉:
// Chose 1 of the 3 storages
// import { AsyncStorage } from "react-native";
// import AsyncStorage from '@react-native-community/async-storage';
import storage from 'redux-persist/lib/storage'

import { createMigrate, persistStore, persistReducer } from "redux-persist";
import reducer from "../reducers";

const persistConfig = {
    key: 'root',
    version: 0,
    storage,    // 'redux-persist/lib/storage'
}

// const persistConfig = {
//   key: 'root',
//   version: 0,
//   AsyncStorage,    // '@react-native-community/async-storage'
// }

const persistedReducer = persistReducer(persistConfig, reducer);

你能展示一下你如何使用@react-native-community/async-storage声明你的persistConfig吗? - Neeko
@Neeeko 我已经更新了问题(注释掉)以回答你的问题。谢谢! - Nyxynyx
你在两个设备上都遇到了这个问题还是只有在iOS上? - Neeko
@Neeeko 仅适用于iOS。目前没有安卓设备可供测试。 - Nyxynyx
5个回答

7

这个导入适用于Web应用程序:

import storage from 'redux-persist/lib/storage'

对于React Native,您应该使用以下导入:

import AsyncStorage from '@react-native-community/async-storage';
import { createMigrate, persistStore, persistReducer } from "redux-persist";
import reducer from "../reducers";

const persistConfig = {
    key: 'root',
    version: 0,
    //...
    storage: AsyncStorage
}

const persistedReducer = persistReducer(persistConfig, reducer);

感谢tolotra!我尝试了你的方法(在问题上进行了注释),但遇到了错误[@RNC/AsyncStorage]: NativeModule: AsyncStorage is null.也许是因为我正在使用Expo SDK 35,它使用React Native 0.5.9而不是0.6? - Nyxynyx
1
也许可以尝试使用Expo导入AsyncStorage import { AsyncStorage } from 'react-native'; - Tolotra Raharison
1
我尝试了这种方法,遇到了错误 redux-persist: config.storage is required. Try using one of the provided storage engines import storage from 'redux-persist/lib/storage'. 我已经更新了问题以反映这一点。 - Nyxynyx

6

对于React Native,以下代码无法正常工作

import AsyncStorage from '@react-native-async-storage/async-storage';

const persistConfig = {
    key: 'root',
    AsyncStorage
}

因为persistConfig需要一个名为storage的键。

下面的persistConfig适用于React Native。

import AsyncStorage from '@react-native-async-storage/async-storage';

const persistConfig = {
    key: 'root',
    storage: AsyncStorage
}

我正在使用expo ~45.0.0。到目前为止,这是有效的解决方案。@react-native-community/async-storage不起作用,因为它无法链接。 - Suraj Neupane

0
一个简单的无意中的打字错误,比如说:
import { AsyncStorage } from '@react-native-community/async-storage';

最终结果为

需要config.storage参数

或者

redux-persist无法创建同步存储。回退到noop存储。


你是如何解决的? - Prudhvi Raj Kumar
只需简单地删除 { } - goodhyun

0

这可能是一个库链接问题。

确保您运行了 react-native link @react-native-community/async-storage

我还建议您到您的 ios 文件夹并运行 pod install

如果您不使用Cocoapods,请查看此处进行手动链接。


谢谢!希望能够找到不必弹出Expo应用程序的解决方案(该操作对于链接库是必要的)。 - Nyxynyx

0
1. yarn add @react-native-async-storage/async-storage 2. import AsyncStorage from '@react-native-async-storage/async-storage'; const authPersistConfig = { key: 'auth', stateReconciler: autoMergeLevel2, storage: AsyncStorage, whitelist: ['isAuthenticated', 'sessionToken', 'userId'], };
worked for me

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接