Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何根据首次启动与否设置初始屏幕?_Javascript_React Native_React Navigation - Fatal编程技术网

Javascript 如何根据首次启动与否设置初始屏幕?

Javascript 如何根据首次启动与否设置初始屏幕?,javascript,react-native,react-navigation,Javascript,React Native,React Navigation,我正在使用AsyncStorage来检测它是否是第一次启动 如果用户第一次启动应用程序,应用程序会将他们带到“TourScreen1”页面。或“饲料” 但下面的代码不起作用 这将返回一个对象。它应该返回字符串 有没有办法让这个代码返回字符串 还是我需要用另一种方式 const Initial = createAppContainer( createSwitchNavigator( { Cover, TourScreen1, TourScreen2,

我正在使用AsyncStorage来检测它是否是第一次启动

如果用户第一次启动应用程序,应用程序会将他们带到“TourScreen1”页面。或“饲料”

但下面的代码不起作用

这将返回一个对象。它应该返回字符串

有没有办法让这个代码返回字符串

还是我需要用另一种方式

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”。如何处理此问题?