启动Flutter应用程序时应在哪里运行初始化代码?

时间:2019-05-07 14:27:54

标签: flutter

启动Flutter应用程序时应在哪里运行初始化代码?

void main() {

  return runApp(MaterialApp(
    title: "My Flutter App",

    theme: new ThemeData(
        primaryColor: globals.AFI_COLOUR_PINK,
                backgroundColor: Colors.white),

        home: RouteSplash(),

    ));
}

如果我想运行一些初始化代码来获取共享的首选项,或者(对于我而言)初始化一个包(并且我需要传递MaterialApp小部件的BuildContext),那么正确的方法是这个?

我应该将MaterialApp包装在FutureBuilder中吗?还是有一种更“正确”的方式?

-------编辑--------------------------------------- ------------

我现在已将初始化代码放在RouteSplash()小部件中。但是,由于我需要使用应用程序根目录的BuildContext进行初始化,因此我在小部件build中调用了初始化,并在context.ancestorInheritedElementForWidgetOfExactType(MaterialApp)中进行了传递。由于我无需等待初始化完成即可显示初始屏幕,因此我没有使用Future

2 个答案:

答案 0 :(得分:1)

一种简单的方法是调用RouteSplash作为初始屏幕,并在其内部执行所示的初始化代码。

class RouteSplash extends StatefulWidget {
  @override
  _RouteSplashState createState() => _RouteSplashState();
}

class _RouteSplashState extends State<RouteSplash> {
  bool shouldProceed = false;

  _fetchPrefs() async {
    await Future.delayed(Duration(seconds: 1));// dummy code showing the wait period while getting the preferences
    setState(() {
      shouldProceed = true;//got the prefs; set to some value if needed
    });
  }

  @override
  void initState() {
    super.initState();
    _fetchPrefs();//running initialisation code; getting prefs etc.
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: shouldProceed
            ? RaisedButton(
                onPressed: () {
                  //move to next screen and pass the prefs if you want
                },
                child: Text("Continue"),
              )
            : CircularProgressIndicator(),//show splash screen here instead of progress indicator
      ),
    );
  }
}

main()

void main() {
  runApp(MaterialApp(
    home: RouteSplash(),
  ));
}

注意:这只是其中一种方法。如果需要,可以使用FutureBuilder

答案 1 :(得分:0)

要在启动时运行代码,请将其放在main.dart中。就我个人而言,这就是初始化列表等的方法。