Javascript 如何根据首次启动与否设置初始屏幕?
我正在使用AsyncStorage来检测它是否是第一次启动 如果用户第一次启动应用程序,应用程序会将他们带到“TourScreen1”页面。或“饲料” 但下面的代码不起作用 这将返回一个对象。它应该返回字符串 有没有办法让这个代码返回字符串 还是我需要用另一种方式Javascript 如何根据首次启动与否设置初始屏幕?,javascript,react-native,react-navigation,Javascript,React Native,React Navigation,我正在使用AsyncStorage来检测它是否是第一次启动 如果用户第一次启动应用程序,应用程序会将他们带到“TourScreen1”页面。或“饲料” 但下面的代码不起作用 这将返回一个对象。它应该返回字符串 有没有办法让这个代码返回字符串 还是我需要用另一种方式 const Initial = createAppContainer( createSwitchNavigator( { Cover, TourScreen1, TourScreen2,
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";
})
}
)
);
getItem
返回一个承诺,该承诺是一个对象,createSwitchNavigator
是同步的,不会等待getItem
的承诺被履行或拒绝,直到执行完毕。因此,承诺被馈送到您的initialRoute,这是一个导致错误的对象
对于动态initialRoute值,无法动态设置initialRoute
至少在反应之前-navigation@4.x
React导航的任何导航器都无法,因此,要实现这一目标,如果您希望坚持使用相同的React Navigation版本,或者希望将导航库升级到React Navigation 5
,则可以根据数据动态创建导航器本身,从而克服此限制。
t上述关于React Navigation
官方文档中引用的限制的参考还包含克服此限制的新API的超链接
希望这有帮助。干杯
getItem
返回一个承诺,该承诺是一个对象,createSwitchNavigator
是同步的,不会等待getItem
的承诺被履行或拒绝,直到执行完毕。因此,承诺被馈送到您的initialRoute,这是一个导致错误的对象
对于动态initialRoute值,无法动态设置initialRoute
至少在反应之前-navigation@4.x
React导航的任何导航器都无法,因此,要实现这一目标,如果您希望坚持使用相同的React Navigation版本,或者希望将导航库升级到React Navigation 5
,则可以根据数据动态创建导航器本身,从而克服此限制。
t上述关于React Navigation
官方文档中引用的限制的参考还包含克服此限制的新API的超链接
希望这有帮助。干杯 因为createSwitchNavigator是同步的,正如suraj所说,你不能给出动态initialroute名称,我所做的是我制作了一个splashscreen作为初始页面,该页面只会有你的应用程序的徽标,在该页面中你可以有:
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
)
}
类SplashScreen扩展了React.Component{
构造函数(){
超级();
}
componentDidMount(){
AsyncStorage.getItem(“AlreadyLanched”)。然后(值=>{
如果(值==null){
AsyncStorage.setItem('alreadyLaunched',true);//无需等待'setItem'完成,尽管您可能希望处理错误
this.props.navigation.navigate('FirstTimeScreen');
}
否则{
this.props.navigation.navigate('UsualScreen');
}})//添加一些错误处理,也可以简单地执行
}
render(){
返回(
//应用程序的图像
)
}
希望有帮助。请不要怀疑,因为createSwitchNavigator是同步的,正如suraj所说,你不能给出动态初始路由名称,我所做的是我制作了一个splashscreen作为初始页面,该页面将只包含你的应用程序的徽标,在该页面中你可以:
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
)
}
类SplashScreen扩展了React.Component{
构造函数(){
超级();
}
componentDidMount(){
AsyncStorage.getItem(“AlreadyLanched”)。然后(值=>{
如果(值==null){
AsyncStorage.setItem('alreadyLaunched',true);//无需等待'setItem'完成,尽管您可能希望处理错误
this.props.navigation.navigate('FirstTimeScreen');
}
否则{
this.props.navigation.navigate('UsualScreen');
}})//添加一些错误处理,也可以简单地执行
}
render(){
返回(
//应用程序的图像
)
}
希望它能有所帮助。请不要怀疑。谢谢你真诚的回答。我已经尝试过类似的方法。我之所以尝试设置动态初始值,是因为当你启动应用程序时,有一个加载屏幕,它与启动屏幕不同。所以我有两个静态屏幕。一个是加载屏幕,另一个是启动屏幕。我想告诉我将它们合并到一个屏幕中。如何处理加载屏幕?当您在开始时启动react native时,有一个默认加载屏幕,您可以在其中看到“by react native”在屏幕底部。你是如何处理的?谢谢你真诚的回答。我已经尝试过类似的方法。我之所以尝试设置动态初始值,是因为当你启动应用程序时,有一个加载屏幕,它不同于初始屏幕。所以我有两个静态屏幕。一个是加载屏幕,另一个是初始屏幕。我要将它们合并到一个屏幕中。如何处理加载屏幕?在开始启动react-native时,有一个默认加载屏幕,您可以在屏幕底部看到“by react-native”。如何处理此问题?