假设应用程序的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 ...
我很难确定创建对象的顺序。我认为
main()
首先运行,即MyApp
对象,该对象构成应用程序的基础。构建MyApp
后,它StoryPage
对象。 那么准确吗?而且,如果是这样,myCustomClass
何时实例化?
答案 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对象在设计上不会产生副作用。