在Flutter中,"Widget build(BuildContext context)"中的"context"是什么意思?

52

TL;DR:
在Flutter的build方法中,是第二个参数还是按常规方式声明BuildContext参数的名称?

我目前正在通过分解"Widget build(BuildContext context)"的每个元素来学习Flutter的build方法的基本语法。

到目前为止,我的理解如下:

  • @override: 注释
  • Widget build() {}: build方法返回一个widget
  • BuildContext:包含有关构建此widget所在树中位置的信息的参数/参数

然而,即使我阅读了相关的SO问题和官方文档,最后一个单词"context"的确切含义仍不清楚。

到目前为止,我确定的是,名称"context"可更改为任何您想要的内容,这意味着它不必与"context"相同。

3个回答

60

从文档中可以了解到,BuildContext 是:

该 widget 在 widget tree 中所处位置的句柄。

context 是一个 BuildContext 实例,传递给 widget 的构建器,以便让它知道它在应用程序的 Widget Tree 中的位置。

其中一个常见的用法是在使用 Inherited Widget 时将其传递给 of 方法。

例如,调用 Something.of(context),返回相对于树中最接近的能提供给你那个 Something 的 widget。

你可以在这里的文档中获取有关 BuildContext 的更多信息。


4
谢谢magicleon94!“context是一个BuildContext实例”,这正是我想要的。只是为了确认,在这种情况下,“context”只是一个常规实例名称吗? - Baka
2
通常情况下,通过“context”您指的是从上面传递的实例。我曾经遇到过一个问题,我在调用它的方法中传递了context,而“传统”的context掩盖了我传递的那个。将方法参数命名为somethingElse而不是context解决了这个问题。所以我相信这纯粹是惯例! - magicleon94

1

“ya Baka context”只是常规的名称,你可以使用其他名称。例如,在给出的示例中,“mycontext”只是实例名称,你可以这样说...

import 'package:flutter/material.dart';
void main()
{

runApp(myApp());

}

 class myApp extends StatelessWidget{
  @override
  Widget build(BuildContext mycontext) {
    return MaterialApp(
      title: "my app",
      home: Scaffold(
      appBar: AppBar(),
      ),
    );
  }

}

虽然正确,但这个问题在1.5年前已经有了被接受的答案解释过了。 - nvoigt

0

你可以说上下文是小部件树的元素,记住小部件保存配置,元素使小部件在屏幕上呈现,而上下文彼此了解,这就是为什么您可以在项目中随处使用主题或媒体查询的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接