颤振-创建移动应用程序时对象创建顺序是什么?

时间:2019-07-24 00:46:02

标签: flutter dart

假设应用程序的main.dart文件包含以下代码:

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  Widget build(BuildContext context) {
    return MaterialApp(
      //theme, etc.,
      home: StoryPage(),
    );
  }
}

SomeCustomClass myCustomClass = SomeCustomClass();

class StoryPage extends StatefulWidget {
  _StoryPageState createState() => _StoryPageState();
}

class _StoryPageState extends State<StoryPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      //more code ...

我很难确定创建对象的顺序。我认为

  1. main()首先运行,即
  2. 创建StatelessWidget MyApp对象,该对象构成应用程序的基础。构建MyApp后,它
  3. 创建一个StatefulWidget StoryPage对象。

那么准确吗?而且,如果是这样,myCustomClass何时实例化?

1 个答案:

答案 0 :(得分:3)

main()始终是第一个要调用的函数。它会在您的应用程序中的任何其他Dart代码之前被调用。

所有顶级对象和静态对象都是在第一次访问时懒惰地创建的。为了演示,请尝试运行以下代码:

final Foo foo = Foo();

void main() {
  print('hello');
  foo.toString(); // Just to access foo.
}

class Foo {
  Foo() { print('world'); }
}

如果顶级对象是在main之前构造的,那么您会看到'world \ nhello'。相反,我们可以正确看到hello\nworld

任何const对象都是在“编译时”创建的,因此在运行时不会完成任何对象的创建。它们作为数据存在于程序的内存中。当然,这是无法观察到的,因为构造const对象在设计上不会产生副作用。