React native IllegalViewOperationException - попытка удалить индекс представления выше дочернего счетчика 0 тег представления: 1

Я обнаружил эту проблему в своем App.js со следующим методом рендеринга:-

render() {
        if (this.state.isDownloading) {
            return (
                <View>
                    <Spinner
                        visible={this.state.isDownloading}
                        textContent={this.state.loadingText}
                        overlayColor={Colors.COLOR_MODAL_BACKDROP}
                        animation={UIConst.ANIMATION_TYPE.NONE}
                        textStyle={styles.spinnerTextStyle}
                    />
                </View>
            );
        }
        return (
            <Provider store={Store}>
                <Router />
            </Provider>
        );
    }

Я обнаружил эту проблему только в apk, выпущенном для Android, для iOS она работает нормально. В основном я использовал CodePush. Итак, как только код-push загружает и устанавливает обновление, отображается. - isDownloading: состояние, которое содержит логическое значение, чтобы проверить, обновляется ли приложение. - : будет отображаться, когда приложение будет обновлено путем отправки кода. - : react-redux - : react-native-router-flux Сбой происходит после завершения установки кода и перезапуска приложения.

Libraries used are :-
1. "react-native-code-push": "^5.2.0-beta",
2. "react-native-loading-spinner-overlay": "^0.5.2",
3. "react-native-router-flux": "^4.0.0-beta.24",
4. "react-redux": "^5.0.5"

Отчет о сбое :-

Fatal Exception: com.facebook.react.uimanager.IllegalViewOperationException: Trying to remove a view index above child count 0 view tag: 1
 detail: View tag:-1
  children(0): [
 ],
  indicesToRemove(1): [
0,
 ],
  tagsToDelete(1): [
113,
 ]
       at com.facebook.react.uimanager.NativeViewHierarchyManager.manageChildren(NativeViewHierarchyManager.java:346)
       at com.facebook.react.uimanager.UIViewOperationQueue$ManageChildrenOperation.execute(UIViewOperationQueue.java:177)
       at com.facebook.react.uimanager.UIViewOperationQueue$1.run(UIViewOperationQueue.java:776)
       at com.facebook.react.uimanager.UIViewOperationQueue.flushPendingBatches(UIViewOperationQueue.java:855)
       at com.facebook.react.uimanager.UIViewOperationQueue.access$1600(UIViewOperationQueue.java:46)
       at com.facebook.react.uimanager.UIViewOperationQueue$2.runGuarded(UIViewOperationQueue.java:813)
       at com.facebook.react.bridge.GuardedRunnable.run(GuardedRunnable.java:21)
       at android.os.Handler.handleCallback(Handler.java:751)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6123)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)



Ответы (2)


У меня просто была похожая ошибка. Я также использую redux и codepush.

Взгляните на эту проблему в репозитории codepush https://github.com/Microsoft/react-native-code-push/issues/986

Используете ли вы хук событий codePushStatusDidChange в своем коде?

Моя проблема, кажется, исправлена ​​после удаления всех изменений состояния из случая UPDATE_INSTALLED.

e.g.

codePushStatusDidChange(status: number): void {
    switch(status) {
        // ...
        case codePush.SyncStatus.UPDATE_INSTALLED:
            // REMOVE ALL STATE CHANGES FROM HERE !!!!
            // empty case to prevent android APK crash
        break
        // ...
    }
}
person niklasj    schedule 26.04.2018
comment
Спасибо, но я исправил это, проверив флаг isDownloading в самом методе возврата. { this.state.isЗагружается? ‹Спиннер /› : ‹Маршрутизатор /› } - person Sujay Naik; 27.04.2018

Добавление некоторых других случаев к ответу @niklasj:

1. Для тех, кто не использует codePushStatusDidChange, убедитесь, что вы не делаете много setState, пока выполняется codepush.sync().

2. Тем, кто использует react-native-restart, лучше убедиться, что вы не вызываете restart(), когда codepush.sync() также перезапускает приложение.

person Stanley Luo    schedule 11.12.2018