您可以使用钩子“useNavigationState”从第二个屏幕获取导航状态。
然后,您将再次遇到从第一个屏幕实际更新它的问题。
当您传递参数时,它是导航状态的一部分,并且您对对象所做的更改不会反映在那里。
更新导航状态的一种方法是分派一个动作,但这将是一个问题,因为您需要找到要更新的屏幕的键。
调度会是这样的
navigation.dispatch({
...CommonActions.setParams({ data: {} }),
来源:route.key,
});
由于您需要将对象的更新更新到另一个屏幕,您应该考虑诸如反应上下文之类的东西,或者如果您的应用中已经有 redux,您可以在需要时使用它。
最简单的方法是反应上下文,您可以从一个屏幕更新并从另一个屏幕接收。
使用上下文的版本如下所示。
这里使用了一个简单的堆栈导航器,上下文从主屏幕更新,值可以从设置屏幕读取。您可以使用相同的方式更新数据变量并从另一个屏幕获取数据。这里我们不使用导航状态,但我们为变量维护自己的上下文。
const Stack = createStackNavigator();
const CountContext = React.createContext({ count: 1, setCount: () => {} });
function HomeScreen({ navigation, route }) {
const { count, setCount } = React.useContext(CountContext);
React.useEffect(() => {
const interval = setInterval(() => {
setCount(count => count + 1);
}, 1000);
return () => {
clearInterval(interval);
};
}, []);
return (
<View>
<Text>Test{count}</Text>
<Button
title="Go to settings"
onPress={() => navigation.navigate('Settings')}
/>
</View>
);
}
function SettingsScreen({ navigation, route }) {
const { count, setCount } = React.useContext(CountContext);
return (
<View>
<Text>Settings! {count}</Text>
<Button title="Go back" onPress={() => navigation.goBack()} />
</View>
);
}
export default function App() {
const [count, setCount] = React.useState(0);
const value = { count, setCount };
return (
<CountContext.Provider value={value}>
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Settings" component={SettingsScreen} />
</Stack.Navigator>
</NavigationContainer>
</CountContext.Provider>
);
}
你可以看看这个小吃
https://snack.expo.io/@guruparan/stateparamschange