react-native - React Native:深度链接不适用于 StackNavigator
问题描述
我正在尝试在 React-Native 中进行深度链接。当应用程序在后台时,代码可以正常工作。但是一旦我从后台删除应用程序并尝试使用 safari 中的链接启动它。该应用程序通过详细信息屏幕启动。但我在导航堆栈中找不到以前的(主)屏幕。请在下面找到代码:
/* eslint-disable react-native/no-inline-styles */
import 'react-native-gesture-handler';
import React from 'react';
import {TouchableOpacity, Text, View} from 'react-native';
import {useLinking, NavigationContainer} from '@react-navigation/native';
import {createStackNavigator} from '@react-navigation/stack';
const HomeScreen = ({navigation}) => {
return (
<View
style={{
flex: 1,
alignItems: 'center',
justifyContent: 'center',
}}>
<Text>Home Screen</Text>
<TouchableOpacity
onPress={() => {
navigation.navigate('Details', {itemId: 40});
}}>
<Text>Go to Details</Text>
</TouchableOpacity>
</View>
);
};
const DetailScreen = ({route, navigation}) => {
return (
<View
style={{
flex: 1,
alignItems: 'center',
justifyContent: 'center',
}}>
<Text>Details Screen</Text>
<Text>Item Id: {route.params.itemId}</Text>
<TouchableOpacity onPress={() => navigation.goBack()}>
<Text>Go Back</Text>
</TouchableOpacity>
</View>
);
};
const Stack = createStackNavigator();
const App = () => {
const ref = React.useRef();
const {getInitialState} = useLinking(ref, {
prefixes: ['deeplink://'],
config: {
initialRouteName: 'Home',
Home: 'Home',
Details: {
path: 'Details/:itemId',
parse: {
itemId: null,
},
},
},
getPathFromState(state, config) {
console.log(state);
},
});
const [isReady, setIsReady] = React.useState(false);
const [initialState, setInitialState] = React.useState();
React.useEffect(() => {
Promise.race([
getInitialState(),
new Promise((resolve) => setTimeout(resolve, 150)),
])
.catch((e) => {
console.error(e);
})
.then((state) => {
if (state !== undefined) {
setInitialState(state);
}
setIsReady(true);
});
}, [getInitialState]);
if (!isReady) {
return null;
}
return (
<NavigationContainer
fallback={<Text>Loading...</Text>}
initialState={initialState}
ref={ref}>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailScreen} />
</Stack.Navigator>
</NavigationContainer>
);
};
export default App;
在 Safari 中使用“deeplink://Details/86”启动应用程序。
解决方案
首先,更新到最新版本,@react-navigation/native
然后遵循链接文档:https ://reactnavigation.org/docs/configuring-links/
useLinking
您可以将linking
prop 传递给NavigationContainer
组件,而不是。然后将您的配置更改为以下内容:
const App = () => {
const linking = {
prefixes: ["deeplink://"],
config: {
initialRouteName: "Home",
screens: {
Home: {
path: "home",
},
Details: {
path: "details/:itemId"
}
}
}
};
return (
<NavigationContainer linking={linking} fallback={<Text>Loading...</Text>}>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailScreen} />
</Stack.Navigator>
</NavigationContainer>
);
};
然后您可以打开类似deeplink://home
或的链接deeplink://details/someid
。
推荐阅读
- tabulator - 如何在制表器中通过 ajax 加载列
- laravel - Laravel + Xtext DSL | 在 Laravel 中使用 DSL
- c++ - 如何在 C++ 中读取两位数和一位数
- c++ - 带有 clang 格式选项 AlwaysBreakAfterReturnType 和 AfterFunction 的奇怪结果
- vba - 解析和格式化文本文件
- python - 无法在 Django SQLlite 内存数据库中应用迁移
- powershell - 使用 windows powershell 批量重命名
- ios - 需要有关通过 UINavigationController 传递数据的技术建议
- javascript - 根据输入值/ javascript过滤数组对象
- android - 如何在 rx Java 中将一个对象的列表转换为另一个对象