gpt4 book ai didi

dart - 上下文从哪里传入?

转载 作者:IT王子 更新时间:2023-10-29 06:48:24 24 4
gpt4 key购买 nike

考虑以下代码:

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 的理解是它是小部件的“上下文”(如果我错了或进一步阐述,请纠正我)。我不明白的是参数“上下文”是如何传递到方法中的。 runApp 函数是否提供“上下文”?

最佳答案

TLDR:这由框架控制

对于喜欢阅读的人:

从头开始。 runApp 方法获取您的应用小部件并将其插入到树中,根据对该方法的评论 (binding.dart):

Inflate the given widget and attach it to the screen.

完成后,应用 StatelessWidget(显然是一个 Widget)被膨胀成一个 Element(Widget framework.dart file 中的类注释)

Each time a widget is placed in the tree, it is inflated into an [Element], which means a widget that is incorporated into the tree multiple times will be inflated multiple times.

如果您随后查看抽象类 Element,在同一个 GitHub 存储库文件 ( framework.dart ) 中,您将看到它上面的评论,说:

Elements have the following lifecycle:

  • The framework creates an element by calling [Widget.createElement] on the widget that will be used as the element's initial configuration.
  • The framework calls [mount] to add the newly created element to the tree at a given slot in a given parent. The [mount] method is responsible for inflating any child widgets and calling [attachRenderObject] as necessary to attach any associated render objects to the render tree.

createElementmount 这两个方法是负责调用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。如果我对小部件背后的机制的理解是正确的,那么如果一些更有经验的开发人员可以确认或不确认,那就太好了。

编辑:回答评论问题

  1. 膨胀(在我看来)是在内存中创建对象(以便框架有它的引用)并将其呈现在屏幕上。

  2. 是的,BuildContext将成为 StatelessElement,其中包含对应用本身的引用

Debugging with VS Code - Flutter Redux architecture sample

关于dart - 上下文从哪里传入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50248638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com