React native 反应导航使用链接到外部屏幕但在导航容器内部

React native 反应导航使用链接到外部屏幕但在导航容器内部,react-native,react-navigation,react-navigation-v5,React Native,React Navigation,React Navigation V5,我很惊讶useLinkTo等(useNavigation)只能在导航器屏幕中使用,而它们真正需要的只是NavigationContainer设置的导航上下文 因为我的场景是一个通知系统,它包装了整个应用程序,其通知应该能够链接到应用程序中的其他部分 <NavigationContainer linking={linking}> <Notifications> <RootStack/> </Notifications> </Na

我很惊讶
useLinkTo
等(
useNavigation
)只能在导航器屏幕中使用,而它们真正需要的只是
NavigationContainer
设置的导航上下文

因为我的场景是一个通知系统,它包装了整个应用程序,其通知应该能够链接到应用程序中的其他部分

<NavigationContainer linking={linking}>
  <Notifications>
    <RootStack/>
  </Notifications>
</NavigationContainer>

现在它位于
RootStack
钩子(如
useLinkTo
)之外,
useNavigation
不起作用,并抱怨缺少上下文:

“找不到导航对象。您的组件是否在导航器的屏幕中?”

使用裸骨导航容器(ref)进行深度链接是否有解决方案


我试图将
通知
提供程序移动到
RootStack
中,但没有任何帮助。

在文档中,提到了一种方法来实现
使用导航
,即

基本上,我们要做的是将导航容器分配给一个外部ref,然后在
RootStack
之外使用该ref进行导航

在文件
/project/Navigation/RootNavigation.js

从'react'导入{createRef};
export const navigationRef=createRef();
导出函数导航(名称、参数){
navigationRef.current?导航(名称、参数);
}
导出函数goBack(){
navigationRef.current?.goBack();
}
导出默认useRootNavigation=()=>({navigationRef,navigate,goBack});
编辑:更多ref函数可在此处找到:

然后在代码中

从'/project/Navigation/RootNavigation'导入{navigationRef};
然后,您可以导入通知组件中的
useRootNavigation
hook来导航、返回。 为了更好的解释,你可以参考

但是,我想这对于
useLinkTo
目前是不可能的。 我正在寻找这样使用
useLinkTo
的方法。如果有人找到它,请告诉我

Edit2:

为了复制
useLinkTo
的行为,我通过参考
useLinkTo
的源代码实现了以下内容:

在文件
/project/Navigation/RootNavigation.js

从'@react navigation/native'导入{getActionFromState,getStateFromPath};
/**
*先前代码
*/
导出功能分派(操作){
导航参考当前?调度(操作);
}
导出函数链接到(路径,配置=null){
var state=getStateFromPath(路径,配置);
var action=getActionFromState(状态);
如果(操作!==未定义){
派遣(行动);
}
}
导出默认用户ootNavigation=()=>({
导航参考,
导航,
戈巴克,
派遣,
linkTo,
});
然后,在导航之外的任何需要使用useLinkTo的地方

const navigation=useRootNavigation();//RootNavigation.js中定义的钩子
someFunction(()=>{
linkTo(路径,linking.config);
})

在您(我也是)的情况下,我们必须指定链接配置,否则将使用深度链接的默认行为。

您是否尝试使用带导航的
?不,因为我正在使用v5,不希望这有帮助!谢谢在创建导航操作时,我看到默认的linkTo会更多地遍历链接树。你确定你的代码能像预期的那样工作吗?@philk是的,它确实能为我工作,而且应该像预期的那样工作,因为使用的ref是所有导航器的根;同样,上面的
linkTo
代码不处理无效路径,所以我想如果需要的话,我们也需要实现它。