异步功能完成后如何推送到页面?

时间:2020-08-07 12:29:07

标签: flutter dart

我正在开发一个应用程序,当用户进入第一个屏幕时是一个加载屏幕,在该屏幕上可以从提供者进行初始化,用户无法在此屏幕中输入任何内容,加载完成后,我想在没有用户的情况下推送新屏幕点击”。

在此代码中,我实际上为_login.getStoredEmail()运行并设置了3秒的延迟,并在LoginController内设置了一个变量,该变量在下一个屏幕中消耗,但是每次都无法正常工作,最终会中断。

class GeneralSplashScreen extends StatefulWidget {
  @override
  _GeneralSplashScreenState createState() => _GeneralSplashScreenState();
}

class _GeneralSplashScreenState extends State<GeneralSplashScreen> {
  @override
  void initState() {
    Future.delayed(
      Duration(
        seconds: 3,
      ),
      () {
        Navigator.pushReplacementNamed(context, kRoutes.login);
      },
    );
    super.initState();
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final LoginController _login = Provider.of<LoginController>(context);

    _login.getStoredEmail();

    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 60),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            Image.asset(
              'lib/assets/images/logo.png',
              fit: BoxFit.contain,
            ),
            Text(
              "Business Mananger",
              textAlign: TextAlign.end,
              style: TextStyle(
                fontFamily: kFontFamily.montserrat,
                fontSize: 10,
              ),
            ),
            LoadingBar(),
          ],
        ),
      ),
    );
  }
}

2 个答案:

答案 0 :(得分:0)

导航到initState()方法内的其他屏幕。

initState() {
  initializeAndNavigate()
}

initializeAndNavigate() async {
  await initializeSomething();
  Navigator.of(context) ...
}

答案 1 :(得分:0)

声明initState

  Future _future;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _future = doStuff();
  }

使用FutureBuilder

FutureBuilder(
      future: _future,
      builder: (_, dataSnapshot) {

        if (dataSnapshot.connectionState == ConnectionState.waiting) {
          return Center(child: CircularProgressIndicator()); // here add loading screen
        } else {
          return Dashboard();
        }
      },
    )