请考虑以下代码:
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Welcome to Flutter',
home: new Scaffold(
appBar: new AppBar(
title: new Text('Welcome to Flutter'),
),
body: new Center(
child: new Text('Hello World'),
),
),
);
}
}
我对Buildcontext的理解是它是小部件的“上下文”(如果我错了或请进一步详细说明,请纠正我)。我不明白的是参数“context”是如何传递给方法的。 runApp函数是否提供“上下文”?
答案 0 :(得分:5)
TLDR:这是由框架控制的。
对于喜欢阅读的人:
从一开始就开始。 runApp
方法根据方法(binding.dart)的注释获取您的应用小部件并将其插入树中:
给给定小部件充气并将其附加到屏幕上。
完成该操作后,应用StatelessWidget
(显然是一个Widget
)正在Element
{Widget
类注释{ {3}})
每次将小部件放置在树中时,它都会膨胀为 [Element],表示合并到树中的小部件 多次充气会多次充气。
如果你看一下抽象类Element
,在同一个GitHub仓库文件(framework.dart file)中,你会看到上面的评论,说:
元素具有以下生命周期:
- 框架通过调用[ Widget.createElement ]创建一个元素 在小部件上将用作元素的首字母 组态。
- 框架调用[ mount ]添加新创建的 给定父级中给定插槽的树的元素。 [mount] 方法负责对任何子窗口小部件进行膨胀和调用 [attachRenderObject]根据需要附加任何关联的渲染 对象到渲染树。
这两个方法createElement
和mount
是负责调用build
方法的方法。
如果查看StatelessWidget
课程,您会看到它覆盖了createElement
方法(framework.dart)。其中创建StatelessElement
对象并将其自身(this
)作为构造函数参数传递。请注意,StatelessElement
类如何覆盖build
方法并调用widget.build
方法(在这种情况下,widget
是您的应用小部件 - 即MyApp
)。这仍然没有告诉我们如何调用build
方法。如果您深入了解ComponentElement
(StatelessElement
派生的类 - framework.dart),您可以看到mount
方法被覆盖。在此方法(由框架调用)中,调用_firstBuild
方法,然后调用rebuild
,此方法然后调用performRebuild
方法,最终结束调用build
方法。
简单,对吧?
免责声明:这只是我连接点。我不是Flutter的专家 - 我一周前开始使用Flutter。如果我对小部件背后的机制的理解是正确的,那么一些更有经验的开发人员可以确认与否是好的。
编辑:回答评论问题
膨胀(在我看来)是在内存中创建对象(以便框架具有它的引用)并在屏幕上呈现它。
是的,BuildContext
将成为StatelessElement
,其中包含对应用程序本身的引用