Исключение в HostFunction: искаженные вызовы от JS: размеры полей разные - проблема возникает на реальном устройстве, а не на симуляторе - PullRequest
0 голосов
/ 04 февраля 2020

После нескольких строк кода в проекте Expo / React Native, я захотел проверить его на своем iPhone. Первая минута прошла хорошо, пока я не получил неожиданное сообщение об ошибке:

Ошибка: исключение в HostFunction: искаженные вызовы из JS: размеры полей разные.

У меня была Ошибка во время разработки несколько раз, потому что я где-то случайно хранил NaN. Пока все хорошо, рад, что сообщение об ошибке пришло напрямую, я знал, с чего начать избавляться от него.

Ниже приведена ошибка:

[Unhandled promise rejection: Error: Exception in HostFunction: Malformed calls from JS: field sizes are different.]
Stack trace:
  node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:271:39 in enqueueNativeCall
  node_modules/react-native/Libraries/BatchedBridge/NativeModules.js:137:8 in fn
  node_modules/react-native/Libraries/Core/Timers/JSTimers.js:259:23 in setTimeout
  node_modules/promise/setimmediate/rejection-tracking.js:47:10 in <unknown>
  node_modules/promise/setimmediate/core.js:169:16 in reject
  node_modules/promise/setimmediate/core.js:211:11 in doResolve
  node_modules/promise/setimmediate/core.js:66:12 in Promise
  node_modules/react-native/Libraries/BatchedBridge/NativeModules.js:98:25 in fn
  node_modules/@unimodules/react-native-adapter/build/NativeModulesProxy.js:15:52 in _callee$
  node_modules/regenerator-runtime/runtime.js:45:44 in tryCatch
  node_modules/regenerator-runtime/runtime.js:271:30 in invoke
  node_modules/regenerator-runtime/runtime.js:45:44 in tryCatch
  node_modules/regenerator-runtime/runtime.js:135:28 in invoke
  node_modules/regenerator-runtime/runtime.js:170:17 in <unknown>
  node_modules/promise/setimmediate/core.js:45:7 in tryCallTwo
  node_modules/promise/setimmediate/core.js:200:23 in doResolve
  node_modules/promise/setimmediate/core.js:66:12 in Promise
  node_modules/regenerator-runtime/runtime.js:169:27 in callInvokeWithMethodAndArg
  node_modules/regenerator-runtime/runtime.js:192:38 in enqueue
  node_modules/regenerator-runtime/runtime.js:216:8 in <unknown>
  node_modules/@unimodules/react-native-adapter/build/NativeModulesProxy.js:10:62 in _callee
  node_modules/expo-file-system/build/FileSystem.js:50:55 in writeAsStringAsync$
  node_modules/regenerator-runtime/runtime.js:45:44 in tryCatch
  node_modules/regenerator-runtime/runtime.js:271:30 in invoke
  node_modules/regenerator-runtime/runtime.js:45:44 in tryCatch
  node_modules/regenerator-runtime/runtime.js:135:28 in invoke
  node_modules/regenerator-runtime/runtime.js:170:17 in <unknown>
  node_modules/promise/setimmediate/core.js:45:7 in tryCallTwo
  node_modules/promise/setimmediate/core.js:200:23 in doResolve
  node_modules/promise/setimmediate/core.js:66:12 in Promise
  node_modules/regenerator-runtime/runtime.js:169:27 in callInvokeWithMethodAndArg
  node_modules/regenerator-runtime/runtime.js:192:38 in enqueue
  node_modules/regenerator-runtime/runtime.js:216:8 in <unknown>
  node_modules/expo-file-system/build/FileSystem.js:46:7 in writeAsStringAsync
  node_modules/redux-persist-expo-filesystem/index.js:13:34 in writeFile
  node_modules/redux-persist-expo-filesystem/index.js:26:30 in <unknown>
  node_modules/promise/setimmediate/core.js:37:14 in tryCallOne
  node_modules/promise/setimmediate/core.js:123:25 in <unknown>
  node_modules/react-native/Libraries/Core/Timers/JSTimers.js:152:14 in _callTimer
  node_modules/react-native/Libraries/Core/Timers/JSTimers.js:200:17 in _callImmediatesPass
  node_modules/react-native/Libraries/Core/Timers/JSTimers.js:473:30 in callImmediates
  node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:337:6 in __callImmediates
  node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:135:6 in <unknown>
  node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:314:10 in __guard
  node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:134:17 in flushedQueue

После многократного запуска приложения Ошибка возникает чаще и после секунд использования. Резервное хранилище является главной проблемой. Я не могу объяснить, почему он работал хорошо (и все еще работает хорошо) на симуляторе, а на реальном устройстве - нет.

Я пробовал несколько пакетов хранения как «redux-persist-expo-fs-storage» , 'redux-persist / lib / storage' и 'redux-persist-expo-filesystem'. Никто из них не справился с работой.

Редуктор / индекс. js file:

import { combineReducers, createStore, applyMiddleware } from 'redux';
import promiseMiddleware from 'redux-promise-middleware';
import { persistStore, persistReducer } from 'redux-persist';
import guidelines from './guidelines/reducers';
import global from './global/reducers';
import ExpoFileSystemStorage from 'redux-persist-expo-filesystem';
import { composeWithDevTools } from 'redux-devtools-extension';
const persistConfig = {
    key: 'root',
    keyPrefix:'',
    storage: ExpoFileSystemStorage,
    timeout: null
}
const reducers = combineReducers({
    global,
    guidelines,
})
const persistedReducer = persistReducer(persistConfig, reducers);
export const store = createStore(persistedReducer, composeWithDevTools(applyMiddleware(promiseMiddleware())));
export const persistor = persistStore(store);

Функция обещаниеMiddleware используется для обработки создателей асин c action в redux, как показано ниже ax ios используется для извлечения данных в действиях. js:

import axios from 'axios';
...
export const FETCH_AVAILABLE_GUIDELINES = 'FETCH_AVAILABLE_GUIDELINES';
export const FETCH_AVAILABLE_GUIDELINES_PENDING = 'FETCH_AVAILABLE_GUIDELINES_PENDING';
export const FETCH_AVAILABLE_GUIDELINES_FULFILLED = 'FETCH_AVAILABLE_GUIDELINES_FULFILLED';
export const FETCH_AVAILABLE_GUIDELINES_REJECTED = 'FETCH_AVAILABLE_GUIDELINES_REJECTED';
export const fetchAvailableGuidelines = () => {
    return {
        type: FETCH_AVAILABLE_GUIDELINES,
        payload: axios.get(CONFIG.API.ROOT + CONFIG.API.PATHS.OVERVIEW),
    }
};
...

редукторы. js

import { FETCH_AVAILABLE_GUIDELINES_FULFILLED } from './actions'
const initialState = () => {
    return {
        availableGuidelines: [],
        ...
    }
}
export default (state = initialState, action) => {
    switch(action.type) {
        case FETCH_AVAILABLE_GUIDELINES_FULFILLED:
             return {
                 ...state,
                 availableGuidelines: [...action.payload.data],
             }
        ...
    }
}

Есть ли у кого-то такая же проблема или подсказка о том, как отладить мое хранилище Сохраненные данные - это большой JSON объект. Я уверен, что все ключи имеют допустимые значения.

Спасибо за любые советы и помощь.

Редактировать: Мои рекомендации составляют около 6 МБ каждый. Если я получу только один, он, похоже, не sh. Как только несколько руководств загружаются, происходит сбой. Я считаю, что это связано с системой хранения.

expo: 35.0
redux: ^4.0.1
redux-persist: ^5.10.0

1 Ответ

0 голосов
/ 17 февраля 2020

Если вы выбираете эти данные при каждом запуске приложения, и вам все равно, сохраняются ли эти данные в автономном режиме, я бы порекомендовал использовать blacklist конфигурацию redux-persist, чтобы занести в черный список такие большие состояния из сохраняемых.

Если это состояние постоянно c и не изменяется - вы также можете просто записать его в файл JSON и использовать этот файл в качестве источника данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...