Expo React Native App + Redux-Persist: проблема с AsyncStorage

Я только что начал новый проект Managed Expo React Native (Expo SDK 35, React Native 0.5.9), используя [email protected], но даже новый проект expo с redux / redux-persist в настоящее время выдает ошибку ниже.


Используя AsyncStorage от react-native,

получаем ошибку:

redux-persist: требуется config.storage. Попробуйте использовать один из предоставленных механизмов хранения import storage from 'redux-persist/lib/storage'


Используя AsyncStorage от @react-native-community/async-storage,

получаем ошибку:

[@ RNC / AsyncStorage]: NativeModule: AsyncStorage имеет значение null.


Используя storage от redux-persist/lib/storage,

получаем ошибку:

console.error: «redux-persist не удалось создать хранилище синхронизации. Откат к хранилищу noop».


Вопрос: Как решить эту проблему без выброса? Спасибо!


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);

person Nyxynyx    schedule 28.10.2019    source источник
comment
Можете ли вы показать нам, как вы объявляете свой persistConfig с помощью @react-native-community/async-storage?   -  person Neeko    schedule 28.10.2019
comment
@Neeeko Я обновил вопрос (закомментировал), чтобы ответить на ваш вопрос. Спасибо!   -  person Nyxynyx    schedule 28.10.2019
comment
У вас есть эта проблема на обоих устройствах или только на iOS?   -  person Neeko    schedule 29.10.2019
comment
Только @Neeeko iOS. В настоящее время нет доступных устройств Android для тестирования.   -  person Nyxynyx    schedule 29.10.2019


Ответы (4)


Этот импорт предназначен для веб-приложения:

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);
person tolotra    schedule 28.10.2019
comment
Спасибо, толотра! Я попробовал ваш подход (прокомментировал вопрос), но обнаружил ошибку [@RNC/AsyncStorage]: NativeModule: AsyncStorage is null. Может быть, потому, что я использую Expo SDK 35, который использует React Native 0.5.9, а не 0.6? - person Nyxynyx; 28.10.2019
comment
Может быть, попробуйте использовать импорт expo для AsyncStorage import { AsyncStorage } from 'react-native'; - person tolotra; 28.10.2019
comment
Я пробовал этот подход, обнаружил ошибку redux-persist: config.storage is required. Try using one of the provided storage engines import storage from 'redux-persist/lib/storage'. Обновил вопрос, чтобы отразить это. - person Nyxynyx; 28.10.2019

Для 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
}
person Arosha    schedule 30.12.2020

Это может быть проблема с подключением библиотеки.

Убедитесь, что вы запустили react-native link @react-native-community/async-storage

Я также предлагаю зайти в вашу ios папку и запустить pod install.

Если вы не используете Cocoapods, посмотрите здесь для ручной ссылки.

person Neeko    schedule 29.10.2019
comment
Спасибо! Надеясь на решение без необходимости извлекать приложение Expo (необходимо для связывания библиотеки) - person Nyxynyx; 29.10.2019

  1. пряжа добавить @ response-native-async-storage / async-storage
  2. импортировать AsyncStorage из '@ response-native-async-storage / async-storage'; const authPersistConfig = {ключ: 'auth', stateReconciler: autoMergeLevel2, хранилище: AsyncStorage, белый список: ['isAuthenticated', 'sessionToken', 'userId'],};

работал на меня

person Rajendra singh rana    schedule 13.05.2021