navigator未创建时如何通过branch.io深度链接实现react-navigation跳转
问题描述
我已经参照react-navigation深度链接和branch.io react-native官方文档进行开发,但相关文档内容要么已废弃,要么无法完全解决我的问题。
我需要实现的效果是:只要linking读取到深度链接,就跳转到指定页面。我不打算在特定页面上实现监听器,而是要在根路径处理该逻辑,我尝试过onReady(我这边未生效)和navigator container的linking配置两种方案都没能成功。
我的代码如下:
const linking: LinkingOptions = { prefixes: ['agendameio://', 'https://agendame.io', 'https://agendameio.app.link', 'https://agendameio.app-alternative.link'], subscribe(listener) { const navigation = useNavigation(); const onReceiveURL = ({ url }: { url: string }) => listener(url); Linking.addEventListener('url', onReceiveURL); branch.skipCachedEvents(); branch.subscribe(async ({ error, params, uri }) => { if (error) { console.error('Error from Branch: ' + error); return; } if (params) { DataManager.DynamicURL = params['~id'] === "951933826563912687" ? params.id : undefined; } let url = params?.['+url'] || params?.['~referring_link']; // params !== undefined ? `agendameio://empresa/${params.id}` : 'agendameio://empresa'; navigation.navigate(`DetalleEmpresa${params.id}`); listener(url); }); return () => { Linking.removeEventListener('url', onReceiveURL); branch.logout(); }; }, }
我现在调用useNavigation会立即触发报错,但我实在不知道还有什么其他方式可以实现应用内跳转。
编辑:报错信息

编辑2:补充导航结构代码
我补充我的导航结构代码,方便大家理解我的问题:
function firstStack() { return ( <homeStack.Navigator initialRouteName="EmpresasScreen"> <homeStack.Screen options={({navigation}) => ({ headerShown: false, headerTitle: () => ( <> <View style={styles.viewHeader}> <Image resizeMode="contain" style={styles.imageLogo} source={Images.iconoToolbar} /> </View> </> ), })} name="EmpresasScreen" component={EmpresasScreen} /> <detalleEmpresaStack.Screen options={{ headerShown: false }} name="DetalleEmpresaScreen" component={DetalleEmpresaScreen} /> <agendamientoStack.Screen options={{ headerShown: false }} name="AgendamientoScreen" component={AgendamientoScreen} /> </homeStack.Navigator> ); } function secondStack() { return ( <misCitasStack.Navigator> <misCitasStack.Screen options={({navigation}) => ({ headerShown: false, headerTitle: () => ( <> <View style={styles.viewHeader}> <Image resizeMode="contain" style={styles.imageLogo} source={Images.iconoToolbar} /> </View> </> ), })} name="MisCitasScreen" component={CitasScreen} /> <detalleCitasStack.Screen options={({navigation}) => ({ headerShown: false, })} name="DetalleCitaScreen" component={DetalleCitaScreen} /> </misCitasStack.Navigator> ); } function tabStack() { return ( <tab.Navigator screenOptions={({route}) => ({ tabBarIcon: ({focused}) => { let iconName; if (route.name === 'Home') { iconName = focused ? Images.casaActive : Images.casa } else if (route.name === 'Citas') { iconName = focused ? Images.citasActive : Images.citas } return <Image source={iconName} /> } })} tabBarOptions={{ showLabel: false, }}> <tab.Screen name="Home" component={firstStack} /> <tab.Screen name="Citas" component={secondStack} /> </tab.Navigator> ); } function menuStackNavigator() { useEffect(() => { VersionCheck.needUpdate({forceUpdate: true}).then(async res => { if (res.isNeeded) { alertNeedUpdate(res.storeUrl, false); } }); if(Platform.OS === 'android') { NativeModules.SplashScreenModule.hide(); } }, []) return ( <NavigationContainer linking={linking}> <stack.Navigator headerMode="none"> <stack.Screen name="Home" component={tabStack} /> <stack.Screen name="Error" component={ErrorScreen} /> </stack.Navigator> </NavigationContainer> ); }; const styles = StyleSheet.create({ viewHeader: { alignItems: 'center', justifyContent: 'center', }, imageLogo: { alignItems: 'center', justifyContent: 'center', marginTop: 6, marginBottom: 6 } }); export default menuStackNavigator;
内容的提问来源于stack exchange,提问作者Nicolas Silva
相关产品推荐
相关产品推荐

