闪屏和颤振一次介绍

时间:2018-07-23 13:26:35

标签: dart flutter splash-screen

我希望我的启动画面始终出现在我的应用程序中,这确实很棒,但是我在启动画面之后进行了一次遍历,我希望它是一次遍历,所以我想添加一个整数设置为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++;}
}

5 个答案:

答案 0 :(得分:1)

我们需要具有number值,才能在多个应用程序启动之间进行保存。我们可以使用shared_preference插件来实现这一点。

答案 1 :(得分:0)

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

@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");
    }
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

第二,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;
  }

答案 4 :(得分:0)

@Dinesh Balasubramanian 的回答非常好。

但我有 4 个初始屏幕需要显示一次。我已经在每个屏幕中使用相同的逻辑完成了这项工作。然后我的应用第二次显示第 5 个屏幕,例如快进所有前一个屏幕并在第 5 个屏幕上停止。

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

<块引用>

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

E/flutter (32606):用于 来自导航器的推送或弹出路由必须是 导航器小部件的后代。”

这是从 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);
      });
    }

  }
<块引用>

并调用 setValue() 中的 initState()

我期待解决方案。