Flutter Secure Storage 未按应用程序启动时的预期进行初始化

Flutter Secure Storage not initializing as itended on app start up

我正在开发一个带有动态初始屏幕图像的应用程序。 我就是这样实现的。


class _SplashScreenState extends State<SplashScreen> {

  loginState() async{
    if(await FlutterSecureStorage().read(key: "Login")!=null){
      isLoggedIn = true;
      image = await StorageAccess().readFile();

    }
  }
  bool isLoggedIn = false;
  var image;
  @override
  void initState() {
    loginState();
    super.initState();
    Timer(Duration(seconds: 4),
            ()=>Navigator.pushReplacement(context,
            MaterialPageRoute(builder:
                (context) =>
                FirstPage()
            )
        )
    );
  }
  @override
  Widget build(BuildContext context) {
    return isLoggedIn?Container(
        color: Colors.white,
        child:Image.memory(image),
    ):Container(
      color: Colors.white,
      child: Image.asset('images/logo.png'),
    );
  }
}

这在我执行热重启时工作正常,但当我关闭并启动应用程序时,变量 isLoggedIn 花费更多时间进行初始化,并且启动画面中的动态图像未显示。

任何人都知道为什么在应用程序启动时初始化需要这么多时间,但在热重启时却没有,我该如何解决这个问题?

提前致谢。

你可以试试 运行 initState with async。

void initState() async {
loginState();
super.initState();
Timer(Duration(seconds: 4),
        ()=>Navigator.pushReplacement(context,
        MaterialPageRoute(builder:
            (context) =>
            FirstPage()
        )
    )
);

}

类似的问题我也在苦苦挣扎。对于我的情况,我使用的是 getx,因此这可能会解决您遇到的问题。

我用 FutureBuilder 解决了这个问题。 更新后的代码是这样的:

class _SplashScreenState extends State<SplashScreen> {

  loginState() async{
    if(await FlutterSecureStorage().read(key: "Login")!=null){
      isLoggedIn = true;
      image = await StorageAccess().readFile();

    }
  }
  bool isLoggedIn = false;
  var image;
  @override
  void initState() {
    super.initState();
    Timer(Duration(seconds: 4),
            ()=>Navigator.pushReplacement(context,
            MaterialPageRoute(builder:
                (context) =>
                FirstPage()
            )
        )
    );
  }
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: loginState(),
      builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
        return isLoggedIn?Container(
          color: Colors.white,
          child:Image.memory(image),
        ):Container(
          color: Colors.white,
          child: Image.asset('images/logo.png'),
        );
    },);
  }
}