将参数传递到 swipe/gesture 上的上一个屏幕
Pass params to previous screen on swipe/gesture
我已经彻底阅读了有关使用 React Navigation 在屏幕之间传递参数的文档:https://reactnavigation.org/docs/params/
但是,所有这些示例仅在您手动调用 navigation.navigate 并传递参数时才有效。例如:
<Button
title="Done"
onPress={() => {
// Pass and merge params back to home screen
navigation.navigate({
name: 'Home',
params: { post: postText },
merge: true,
});
}}
/>
我有一个带有后退按钮的屏幕,我可以在其中调用 navigation.navigate 并在按下按钮时传递参数,如上例所示。但是,用户也可以从左侧滑动返回 Android 的第一个屏幕(我假设也是 iOS)。
那么,我的问题是:
有没有办法让我在用户滑动返回时将相同的数据传递到上一个屏幕(而不是按后退按钮)?
可能还有我不知道的更好方法。但是,我们可以通过 preventing the default back action 手动实现并自行处理。
假设您有一个屏幕 B
并且您想要向后滑动以转到屏幕 Home
并在该滑动中将参数从 B
传递给 Home
行动。然后,您可以按如下方式实现。
function B({navigation}) {
React.useEffect(() => navigation.addListener('beforeRemove', (e) => {
// the navigation.navigate will fire beforeRemove which causes an infinite loop. we guard this here
if (e.data.action.type === "NAVIGATE") {
return
}
// Prevent default behavior of leaving the screen
e.preventDefault();
// navigate manually
navigation.navigate({
name: 'Home',
params: { post: postText },
merge: true,
});
}), [navigation]);
return ( ... )
}
编辑: navigation.navigate
再次触发 beforeRemove
事件,显然,这会导致无限循环。我们可以如上所示保护它。
我已经彻底阅读了有关使用 React Navigation 在屏幕之间传递参数的文档:https://reactnavigation.org/docs/params/
但是,所有这些示例仅在您手动调用 navigation.navigate 并传递参数时才有效。例如:
<Button
title="Done"
onPress={() => {
// Pass and merge params back to home screen
navigation.navigate({
name: 'Home',
params: { post: postText },
merge: true,
});
}}
/>
我有一个带有后退按钮的屏幕,我可以在其中调用 navigation.navigate 并在按下按钮时传递参数,如上例所示。但是,用户也可以从左侧滑动返回 Android 的第一个屏幕(我假设也是 iOS)。
那么,我的问题是:
有没有办法让我在用户滑动返回时将相同的数据传递到上一个屏幕(而不是按后退按钮)?
可能还有我不知道的更好方法。但是,我们可以通过 preventing the default back action 手动实现并自行处理。
假设您有一个屏幕 B
并且您想要向后滑动以转到屏幕 Home
并在该滑动中将参数从 B
传递给 Home
行动。然后,您可以按如下方式实现。
function B({navigation}) {
React.useEffect(() => navigation.addListener('beforeRemove', (e) => {
// the navigation.navigate will fire beforeRemove which causes an infinite loop. we guard this here
if (e.data.action.type === "NAVIGATE") {
return
}
// Prevent default behavior of leaving the screen
e.preventDefault();
// navigate manually
navigation.navigate({
name: 'Home',
params: { post: postText },
merge: true,
});
}), [navigation]);
return ( ... )
}
编辑: navigation.navigate
再次触发 beforeRemove
事件,显然,这会导致无限循环。我们可以如上所示保护它。