Navigator.push中每个“上下文”词指的是什么?

时间:2019-12-28 20:30:59

标签: flutter dart flutter-layout

我相信上下文的第一个用法是指您所处的当前上下文,但是第二个上下文是指什么?还是当前的,还是点击时将显示的路径/屏幕的上下文?如果是这样,当它们都被命名为相同名称时,flutter如何知道您要指的是哪个BuildContext?我真的只是没有获得整个第二部分的内容,因此,如果有人可以解释每个单词的含义/含义,那将会很棒。

// Within the `FirstRoute` widget
    onPressed: () {
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => SecondRoute()),
      );
    }

2 个答案:

答案 0 :(得分:0)

根据docs

  

要在堆栈上推送新路线,您可以使用构建器功能创建MaterialPageRoute的实例,该功能创建您想在屏幕上显示的内容。

因此,第二个上下文是SecondRoute的上下文。

在下面同一页上查看规定的示例

Navigator.push(context, MaterialPageRoute<void>(
  builder: (BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('My Page')),
      body: Center(
        child: FlatButton(
          child: Text('POP'),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
    );
  },
));

onPressesd函数中,您会注意到传递到builder的{​​{1}}中的上下文也是从堆栈弹出的上下文。

如果没有被推到栈顶的那条路由会弹出栈顶呢? MaterialPageRoute的上下文就是您的答案

关于如何颤动地知道第二个小部件的上下文的问题,那么,请检查the doc for the builder property of the Builderclass,您会发现此语句

  

被调用以获得子窗口小部件。

     

只要此窗口小部件包含在其父级的内部版本中并且与其进行同步的旧窗口小部件(在这种情况下为SecondRoute)都具有独特的对象标识(与FirstRoute'分开),就会调用此函数。 s)。通常,父级的build方法将构建新的窗口小部件树,因此新的Builder子级(SecondRoute的子级)与相应的旧子级不相同。

PS:我在括号中加上了注释

答案 1 :(得分:0)

简单来说,上下文就是当前上下文,它位于您前面的屏幕上。它可以是屏幕,任何小部件或任何对话框,例如AlertDialog小部件。使用代码Navigator.push,您可以将上下文从一个屏幕推送/路由/导航到另一个屏幕。现在,新屏幕成为当前上下文。     如果使用Navigator.pop,则上下文将回到其推送到的位置。假设现在打开一个AlertDialog小部件。因此,此小部件是当前上下文。如果使用Navigator.pop,则上下文将成为上一个屏幕/窗口小部件。     它有一些理论上的解释,可以说明正在使用的堆栈。希望我的回答能给您真正的想法。