我正在使用AsyncStorage来检测它是否是第一次启动。
[如果用户是第一次启动该应用程序,则该应用程序会将他们带到“ TourScreen1”页面。或“ Feed”。
但是下面的代码不起作用。
此返回对象。它应该返回字符串。
是否有办法使此代码返回字符串?
还是我需要使用其他方式?
const Initial = createAppContainer(
createSwitchNavigator(
{
Cover,
TourScreen1,
TourScreen2,
TourScreen3,
TourScreen4,
Register: RegisterToLogin,
Feed: TabNavigator
},
{
initialRouteName: AsyncStorage.getItem("isLaunched").then(value => {
if (value === null) {
return "TourScreen1";
} else return "Feed";
})
}
)
);
因为createSwitchNavigator如suraj所述是同步的,所以您不能提供动态的initialroute名称,我所做的就是将初始屏幕设为初始屏幕,并且该页面仅带有您应用的徽标,并且在该页面中您可以拥有:
class SplashScreen extends React.Component {
constructor(){
super();
}
componentDidMount(){
AsyncStorage.getItem("alreadyLaunched").then(value => {
if(value == null){
AsyncStorage.setItem('alreadyLaunched', true); // No need to wait for `setItem` to finish, although you might want to handle errors
this.props.navigation.navigate('FirstTimeScreen');
}
else{
this.props.navigation.navigate('UsualScreen');
}}) // Add some error handling, also you can simply do
}
render(){
return(
<Image /> // image of app
)
}
希望有帮助。如有疑问,请随时
getItem
返回一个诺言,它是一个对象,createSwitchNavigator
是同步的,不等待getItem
的诺言得到履行或拒绝就可以完成执行。因此,promise正在馈送到您的initialRoute,这是导致错误的对象。
进入动态的initialRoute值,没有办法动态设置initialRoute
https://reactnavigation.org/docs/en/limitations.html#dynamic-routes
至少到[email protected]
为止,React Navigation的任何导航器中都没有办法,因此要实现这一点,如果您想坚持使用相同的React Navigation的版本,则可以根据数据动态创建导航器本身将导航库升级到React Navigation 5
,可以克服此限制。link的官方文档中引用的上述限制参考React Navigation
也包含克服此限制的新API的超链接。
希望这会有所帮助。干杯!