【问题标题】:splash screen and one time intro in flutter闪屏和一次在颤振中的介绍
【发布时间】:2018-12-30 23:22:48
【问题描述】:

我希望我的启动画面始终出现在我的应用程序中,这很好,但我在启动画面之后有一个遍历,我希望它是一次性遍历,所以我想添加一个整数到值为 0 的共享首选项,每次我打开初始屏幕时,该值都会增加 1,因此当“数字”在第二次运行时等于或大于 1 时,初始屏幕会跳过演练并返回主页,这里是我现在要编辑的代码:

void initState() {
    // TODO: implement initState
    super.initState();
    Timer(Duration(seconds: 5), () => MyNavigator.goToIntro(context));
}

我希望它是这样的:

void initState() {
    // TODO: implement initState
    super.initState();int number=0;//this is in the shared prefs
    Timer(Duration(seconds: 5), () => if(number==0){MyNavigator.goToIntro(context));
    }else{MyNavigator.goToHome(context));
    number++;}
}

【问题讨论】:

    标签: dart flutter splash-screen


    【解决方案1】:

    我们需要在多个应用启动时保存number 值。我们可以使用shared_preference插件来实现。

    【讨论】:

    • 我知道我们可以做到这一点,但我试过但不能这样做你能告诉我如何@Dinesh Balasubramanian
    【解决方案2】:

    以下代码如我们预期的那样完美打印(仅在首次启动期间,“首次启动”)。您可以使用导航逻辑代替打印。

    @override
    void initState() {
        super.initState();
        setValue();
    }
    
    void setValue() async {
        final prefs = await SharedPreferences.getInstance();
        int launchCount = prefs.getInt('counter') ?? 0;
        prefs.setInt('counter', launchCount + 1);
        if (launchCount == 0) {
            print("first launch"); //setState to refresh or move to some other page
        } else {
            print("Not first launch");
        }
    }
    

    【讨论】:

      【解决方案3】:

      首先,我们将数据保存为布尔值

      Future<void> saveData() async {
          SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
          bool isIntroScreenOpened = true;
          sharedPreferences.setBool("isIntroScreenOpened", isIntroScreenOpened); // saved data to your device.
      }
      

      【讨论】:

        【解决方案4】:

        其次,getData 保存在我们的设备中。

        Future<bool> getSaveData() async {
            SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
            bool isIntroScreenOpenedBefore =
                sharedPreferences.getBool("isIntroScreenOpened") ?? false;
            print(sharedPreferences.containsKey("isIntroScreenOpened")); // check your key either it is save or not? 
        
            if (isIntroScreenOpenedBefore == true) {
              Navigator.push(context, MaterialPageRoute(builder: (context) {
                return LoginBoard();
              }));
            } else {
              Navigator.push(context, MaterialPageRoute(builder: (context) {
                return WalKThroughScreen();
              }));
            }
            return isIntroScreenOpenedBefore;
          }
        

        【讨论】:

          【解决方案5】:

          @Dinesh Balasubramanian 的回答非常好。

          但我有 4 个初始屏幕需要显示一次。我已经在每个屏幕中使用相同的逻辑来做到这一点。然后我的应用第二次显示第 5 个屏幕,就像快进所有前一个屏幕并在第 5 个屏幕上停止一样。

          为了解决这个问题,我在 main.dart 中设置了所有首选项以直接打开第 5 个屏幕。但是当我这样做时,我遇到了这个问题,

          “E/flutter (32606): [错误:flutter/lib/ui/ui_dart_state.cc(186)] 未处理的异常:使用上下文请求的导航器操作 不包括导航器。

          E/flutter (32606):上下文用于 来自 Navigator 的 push 或 pop 路由必须是 Navigator 小部件的后代。”

          这是从 main.dart 切换的代码:

          int firstLogin, firstMobile, firstOtp, firstInfo;
            void setValue() async {
              final prefs = await SharedPreferences.getInstance();
              firstLogin = prefs.getInt('counterLogin') ?? 0;
              firstMobile = prefs.getInt('counterMobile') ?? 0;
              firstOtp = prefs.getInt('counterOtp') ?? 0;
              firstInfo = prefs.getInt('counterInfo') ?? 0;
          
              prefs.setInt('counterLogin', firstLogin + 1);
              prefs.setInt('counterMobile', firstMobile + 1);
              prefs.setInt('counterOtp', firstOtp + 1);
              prefs.setInt('counterInfo', firstInfo + 1);
          
              if ((firstLogin == 0) && (firstMobile == 0) && (firstOtp == 0) && (firstInfo == 0)) {
                setState(() {
                  print("first launch");
                  Navigator.of(context).pushNamed(LoginScreen.routeName);
                });
              } else {
                setState(() {
                  print("not first launch");
                  Navigator.of(context).pushNamed(LandingSection.routeName);
                });
              }
          
            }
          

          并在initState() 中调用setValue()

          我期待解决方案。

          【讨论】:

            猜你喜欢
            • 2021-10-25
            • 2020-04-15
            • 1970-01-01
            • 2020-04-13
            • 2022-08-02
            • 1970-01-01
            • 2021-10-28
            • 1970-01-01
            相关资源
            最近更新 更多