反应导航可防止应用程序在发行版本中崩溃

时间:2018-11-10 07:49:03

标签: android react-native react-navigation bugsnag

我的本​​机应用程序中有一个非常奇怪的行为。我将其追溯到一个最小的例子。

我有一个带有两个组件的SwitchNavigator。第一个组件不执行任何操作,仅在2000ms之后导航到第二个组件。第二个Component的render方法内部有一个错误(例如,它尝试呈现一些未定义的内容“ test.error”)。

代码组件2:

resolve(c, img, 0, height, 100, 60)

在开发过程中,我得到一个正常的“死亡红屏”,告诉我“ ReferenceError:ReferenceError:未定义测试”。这是预期的行为。 但是在发行版本中,该应用程序无提示地失败,并且仅显示空白屏幕。没有应用程序崩溃。

更多信息: 当组件安装后显示错误部分时,同一应用程序确实会在发行版本中崩溃(如预期)。

组件2-预期崩溃:

render = () => {
    return (
        <View>
            {
                test.error
            }
        </View>
    )
}

其他信息:

  • 当我使用组件2作为最初的组件时,我的应用程序确实按预期崩溃了。似乎只有在导航后才能崩溃。
  • 行为与StackNavigator相同

版本:

  • 反应:16.3.1
  • 反应性:55.4
  • ReactNavigation:已在1.6.0和2.18.2上尝试过
  • Bugsnag:2.12.4

1 个答案:

答案 0 :(得分:1)

对于有相同问题的任何人。它与bugsnag或反应导航无关。

问题在于,render方法内部的错误不会在释放模式下使应用程序硬崩溃。我认为原因在于React 16和ErrorBoundary功能。

我的解决方法是在App.js中添加一个ErrorBoundary(请参见https://reactjs.org/docs/error-boundaries.html)。现在,我可以在这里处理错误并将其报告给bugsnag。

componentDidCatch = (e, message) => {
    bugsnag.notify(e);
    Alert.alert(
        I18n.t('GLOBAL__FATAL_ERROR'),
        I18n.t('GLOBAL__FATAL_ERROR_MESSAGE'),
        [
            {
                text: I18n.t('GLOBAL__FATAL_ERROR_RESTART'),
                onPress: () => BackHandler.exitApp()
            }
        ]
    );
};