проблема с избыточным начальным состоянием при использовании localStorage на реагирующем - PullRequest
0 голосов
/ 20 февраля 2019

Я занимаюсь разработкой приложения react-native с expo, redux и react-native-sync-localstorage для сохранения состояния приложения в локальном хранилище в следующий раз, когда приложение запустится, в качестве токена для связи с текущим API-интерфейсом.пользователь и т. д.

Я буду тестировать начальный запуск, загружать состояние из локального хранилища и переходить к redux:

export default store = createStore(rootReducer, LocalStorage.find('state'))

Если state.profile.token отсутствует в приложениибудет запущен на экране входа в систему, если присутствует state.profile.token, то приложение будет запускаться с главного экрана.

Если перед загрузкой состояния я вставляю жестко закодированное состояние в localStorage с токеном, пользовательской информациейприложение запускается из основного, и это правильное поведение:

LocalStorage.insert('state', {
  profile: { current: { id: 1, type: 'staff', name_type: 'Personal' },
    token: 'Mx2msERuY6342enWEtD2',
    user: { id: 1, name: 'Ezequiel', surname: 'Depetris',gender: 'male' }
  }
}
export default store = createStore(rootReducer, initialState)

Но когда я запускаю exp build:android на консоли, а затем запускаю приложение на телефоне Android, состояние никогда не загружается и всегдаприложение запускается с экрана входа в систему, даже если пользователь в данный момент загружен.

Файл, который решает, какой экран будет отображаться следующим образом:

...
const initialRoute = () => {
  if (store.getState().profile.token != null)
    return 'Main'
  else
    return 'LogIn'
}

const Router = createSwitchNavigator({
  LogIn: {
    screen: LogInScreen
  },
  Main: {
    screen: MainNavigator
  }
}, {
  initialRouteName: initialRoute(),
  headerMode: 'none',
  mode: 'modal'
})

...

У меня есть разрешение на запись и чтение в хранилище Android, установленное в манифесте Android, и я помещаю запрос на LogInScreen как:

...

  async componentWillMount() {
    await requestStoragePermission()
  }

...

requestStoragePermission.js:

...
export async function requestStoragePermission() {
  const { status } = await Permissions.askAsync(Permissions.CAMERA_ROLL);
}

1 Ответ

0 голосов
/ 27 февраля 2019

хорошо, мое решение было использовать import { AsyncStorage } from "react-native", то есть хранилище, предлагаемое Expo, я использовал расширение mongo, после этого я попробовал react-native-sync-localstorage, но я думаю, что вы имеете право использовать только хранилище, предложенное expoили другое хранилище, которое можно использовать с expo

...