1

我正在开发一个应用程序,当用户进入第一个屏幕时,它是一个加载屏幕,其中从提供程序初始化某些内容,用户无法在此屏幕中输入任何内容,当加载完成时,我想推送一个新屏幕,而无需用户“点击”它。

在这段代码中,我实际上为 _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(),
          ],
        ),
      ),
    );
  }
}
4

2 回答 2

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();
        }
      },
    )
于 2020-08-07T13:00:06.667 回答
0

在 initState() 方法中导航到不同的屏幕。

initState() {
  initializeAndNavigate()
}

initializeAndNavigate() async {
  await initializeSomething();
  Navigator.of(context) ...
}
于 2020-08-07T12:54:09.713 回答