react-native - React-navigation 可以导航的错误边界

标签 react-native react-navigation

将 react-navigation 管理的所有屏幕包装在也可以导航的错误边界中的最干净方法是什么。我目前的方法涉及一个顶级组件,如:

class App extends Component{
  navigateTo(routeName) {
    this.navigator && this.navigator.dispatch(NavigationActions.navigate({ routeName }));
  }

  render(){
    return (
      <Provider store={store}>
        <PersistGate persistor={persistor}>
          <MenuProvider>
            <ErrorBoundary navigateTo={this.navigateTo.bind(this)}>
              <AppNavigator
                ref={navigator=> {
                  NavigationService.setTopLevelNavigator(navigator);
                  this.navigator = navigator;
                }}
              />
            </ErrorBoundary>
          </MenuProvider>
        </PersistGate>
      </Provider>
    )
  }
}

使用相当标准的 ErrorBoundary:
class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);

    this.state = { error: null, info: null };
  }

  componentDidCatch(error, info) {
    this.setState({error, info});
    this.props.navigateTo('SomeScreen');
  }

  render() {
    if (this.state.error) {
      return (
        <Container>
          <Content>
            <Text> Got error: {JSON.stringify(this.state.error)}, info {JSON.stringify(this.state.info)} </Text>
          </Content>
        </Container>
      )
    }

    return this.props.children;
  }
}

但是,当发生错误时,导航器将被卸载,并再次使用 null 调用 ref。

或者,有没有办法让 ErrorBoundary 作为 AppNavigator 的后代,它可以从任何屏幕捕获错误并且还可以最终通过 NavigationService 访问导航器?

最佳答案

你应该可以使用自定义导航器来做到这一点,下面是一个使用新的 react-navigation V3 createAppContainer api 的例子,按照 https://reactnavigation.org/docs/en/custom-navigators.html .

我们刚刚在我们的应用程序中实现了一个修订,以在升级到 V3 时实现这一点。

这样你的 AppNavigator 仍然会在错误边界命中时被挂载,并且可以访问你的导航 Prop 。

const StackNavigator = createStackNavigator({..});

class AppNavigator extends React.Component {
 static router = StackNavigator.router;
  render() {
    const { navigation } = this.props;
    return (
      <ErrorBoundary navigation={navigation}>
        <StackNavigator navigation={navigation} />
      </ErrorBoundary>
    );
  }
}

const AppContainer = createAppContainer(AppNavigator);
export default AppContainer;

关于react-native - React-navigation 可以导航的错误边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52763749/

相关文章:

javascript - 数组的元素和长度的值未定义(从 Firebase 获取时)

react-native - 如何隐藏屏幕标题但显示后退按钮?

javascript - 通过单击覆盖来关闭 react native 模式?

javascript - React Native Firebase 身份验证错误处理

react-native - NativeModule RNCGeolocation 为空

javascript - react 导航 : Bottom Up Transition

reactjs - 未找到导出 'ComposedGestureType'(重新导出为 'ComposedGesture')

reactjs - React Native - 如何在每个屏幕中保留 TabNavigator

javascript - 由于导航重置,ComponentDidMount 调用两次

javascript - React Native - 文档未定义