上下文传入的位置在哪里?

时间:2018-05-09 08:18:55

标签: dart flutter

请考虑以下代码:

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函数是否提供“上下文”?

1 个答案:

答案 0 :(得分:5)

TLDR:这是由框架控制的。

对于喜欢阅读的人:

从一开始就开始。 runApp方法根据方法(binding.dart)的注释获取您的应用小部件并将其插入树中:

  

给给定小部件充气并将其附加到屏幕上。

完成该操作后,应用StatelessWidget(显然是一个Widget)正在Element {Widget类注释{ {3}})

  

每次将小部件放置在树中时,它都会膨胀为   [Element],表示合并到树中的小部件   多次充气会多次充气。

如果你看一下抽象类Element,在同一个GitHub仓库文件(framework.dart file)中,你会看到上面的评论,说:

  

元素具有以下生命周期:

     
      
  • 框架通过调用[ Widget.createElement ]创建一个元素   在小部件上将用作元素的首字母   组态。
  •   
  • 框架调用[ mount ]添加新创建的   给定父级中给定插槽的树的元素。 [mount]   方法负责对任何子窗口小部件进行膨胀和调用   [attachRenderObject]根据需要附加任何关联的渲染   对象到渲染树。
  •   

这两个方法createElementmount是负责调用build方法的方法。

如果查看StatelessWidget课程,您会看到它覆盖了createElement方法(framework.dart)。其中创建StatelessElement对象并将其自身(this)作为构造函数参数传递。请注意,StatelessElement类如何覆盖build方法并调用widget.build方法(在这种情况下,widget是您的应用小部件 - 即MyApp)。这仍然没有告诉我们如何调用build方法。如果您深入了解ComponentElementStatelessElement派生的类 - framework.dart),您可以看到mount方法被覆盖。在此方法(由框架调用)中,调用_firstBuild方法,然后调用rebuild,此方法然后调用performRebuild方法,最终结束调用build方法。

简单,对吧?

免责声明:这只是我连接点。我不是Flutter的专家 - 我一周前开始使用Flutter。如果我对小部件背后的机制的理解是正确的,那么一些更有经验的开发人员可以确认与否是好的。

编辑:回答评论问题

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

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

  3. framework.dart