react-native - 通过深层链接导航到特定路线导航时反应本机。goBack 不起作用
问题描述
当应用程序位于背景堆栈 [未终止] 时,然后从详细信息屏幕
navigation.goBack() 正在工作,但是当应用程序被杀死时,然后通过深度链接
<a href="deeplinking://Details/123">Click on ut </a>
navigation.goBack() 不工作给出错误
任何导航都未处理“GO_BACK”操作
请帮助下面是代码
const HomeScreen = ({ navigation }) => (
<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 }) => {
console.log(navigation);
console.log(route);
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 deepLinking = {
prefixes: ['https://deeplinking.com/', 'deeplinking://'],
config: {
initialRouteName: 'Home',
Home: 'Home',
Details: {
path: 'Details/:itemId',
params: {
itemId: null,
},
},
},
};
return (
<NavigationContainer linking={deepLinking}>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailScreen} />
</Stack.Navigator>
</NavigationContainer>
);
};
export default App;
解决方案
当您从深度链接打开应用程序时,第一个也是唯一可用的屏幕来自深度链接,当然 goBack 不可用。
我用 BackHandler 解决了这个问题。当您从链接打开帖子时,我从 Instagram 模仿。然后,当您返回时,Instagram 将关闭。所以,我做了我的后退按钮来杀死应用程序。
useEffect(() => {
const backAction = () => {
if (index == 0) {
BackHandler.exitApp();
} else {
navigation.goBack();
}
return true;
};
const backHandler = BackHandler.addEventListener(
"hardwareBackPress",
backAction
);
return () => backHandler.remove();
});
index 告诉我导航中当前屏幕的索引是什么:
const index = useNavigationState((state) => state.index);
或者
我在大多数市场上都发现了这种流程。他们首先将用户导航到主页,然后导航到深度链接屏幕。
因此,在我的主页中,我放置了检查深层链接的功能。
const deeplinkCheck = () => {
const { params } = route;
const screen = params?.screen;
if (screen == undefined) {
return;
}
switch (screen) {
case "my-coupons":
navigation.navigate(PAGE.MY_COUPONS);
return;
default:
return;
}
};
useEffect(() => {
deeplinkCheck();
}, [route]);
推荐阅读
- python - PySpark 将 df 写入 csv,“列表索引超出范围”
- mysql - TypeError - indexOf 不是函数(React Data Search with MySQL)
- postgresql - Postgres HA 备用不使用证书
- tizen - 如何导航 Tizen 文件系统
- javascript - 如何用Javascript中的相同元素替换数组中的某些元素?
- codenameone - BrowserComponent 加载时加载对话框
- c# - 在 MVC 中动态添加时如何在每一行上将 Dropdownlist 值设置为 Textboxfor
- vb.net - 有没有更简单的方法来处理基本类型列表
- css - 如何防止 Safari 更改样式?
- excel - 在 msgbox 中格式化记录集 getString