如何正确重置导航到另一个视图



>我正在使用此代码重置当前视图

NavigationActions.reset({ index: 0, key: null, actions: [ NavigationActions.navigate({ routeName: 'Login' }) ] });

有时它可以工作,有时我在 Xcode 中的RCTUIManager.m文件上收到Signal Sigabrt错误。我不知道问题何时发生。此函数中发生错误

- (void)setSize:(CGSize)size forView:(UIView *)view
{
  RCTAssertMainQueue();
  NSNumber *reactTag = view.reactTag;
  dispatch_async(RCTGetUIManagerQueue(), ^{
    RCTShadowView *shadowView = self->_shadowViewRegistry[reactTag];
    RCTAssert(shadowView != nil, @"Could not locate shadow view with tag #%@", reactTag); // ERROR in this line
    if (CGSizeEqualToSize(size, shadowView.size)) {
      return;
    }
    shadowView.size = size;
    [self setNeedsLayout];
  });
}

如果我删除函数上的代码,一切正常。没有崩溃时,控制台始终打印警告

视图 #1430 的类型 RCTView 具有阴影集,但无法计算 有效地阴影。考虑设置背景颜色来解决此问题, 或将阴影应用于更具体的组件。

但是我没有任何使用阴影的视图,也无法弄清楚哪个反应原生元素正在这样做。

编辑:如果我检查 shadowView 不为空,一切正常

if(shadowView){
    RCTAssert(shadowView != nil, @"Could not locate view with tag #%@", reactTag);
    } 

这是 RN 中的错误吗?

我找到的解决方案是覆盖路由器的getStateForAction函数并处理重置。

所以你可以发送这样的东西:

NavigationActions.reset({ index: 0, key: null, actions: { navigateTo: 'Login' }});

并在自定义getStateForAction函数中处理这种情况:

const defaultGetStateForAction = YourNavigator.router.getStateForAction
YourNavigator.router.getStateForAction = (action, state) => {
    if (action.type === NavigationActions.RESET && action.actions.navigateTo) {
      const updatedRoutes = [{routeName: action.actions.navigateTo}]
      return {
        ...state,
        routes: updatedRoutes,
        index: 0
      }
    }
    return defaultGetStateForAction(action, state)
}

在这里你可以阅读更多关于 React 导航 - 自定义导航操作

最新更新