Scaffold.of会找到遥远的窗口小部件吗?

时间:2019-02-15 09:11:20

标签: flutter

我正尝试了解有关BuildContextScaffold.of()的更多信息。

我了解到,当您显示SnackBar时,通常需要添加一个Builder才能使上下文位于添加的脚手架下方。

因此:

class MyScreen extends StatelessWidget {
   build(BuildContext context) {
    return Scaffold(

        body: Builder(
          builder: (context) =>
           RaisedButton(
                child: Text('push me'),
                onPressed: () => Scaffold.of(context).showSnackBar(
                    SnackBar(content: Text('this will work'))),
              ),
        ));
  }
}

我的问题是这样的:如果Scaffold.of()得到最接近的祖先,通常它最终是否不应该在小部件树的上方找到更高的东西? SplashScreen支架? 当我们拿走构建器并创建此错误代码时:

class MyScreen extends StatelessWidget {
   build(BuildContext context) {
    return Scaffold(

        body: RaisedButton(
                child: Text('push me'),
                onPressed: () => Scaffold.of(context).showSnackBar(
                    SnackBar(content: Text('broken'))),
              ),
        ));
  }
}

然后我们得到标准错误 Scaffold.of() called with a context that does not contain a Scaffold. I/flutter ( 7750) No Scaffold ancestor could be found starting from the context that was passed to Scaffold.of().

即使BuildContext中没有直接的父代脚手架,怎么也找不到脚手架的祖先(例如祖父母祖先)?我的应用程序中的所有先前页面都有一个脚手架,它们不再位于小部件树中吗?

我知道,如果找到了脚手架并渲染了SnackBar,我们将无法看到它,但是我仍然不明白它是如何找不到的。也许我误解了“祖先”的含义。

谢谢

1 个答案:

答案 0 :(得分:0)

Execute表示一个特定窗口小部件在窗口小部件树中的位置。

这样,根据您使用的BuildContext,呼叫BuildContext的行为可能会有所不同。

在您的以下示例中:

Scaffold.of(context)

在这里,您正在使用class MyScreen extends StatelessWidget { build(BuildContext context) { return Scaffold( body: RaisedButton( child: Text('push me'), onPressed: () => Scaffold.of(context).showSnackBar( SnackBar(content: Text('this will work'))), ), ), ); } } 中的BuildContext。问题是MyScreen创建 MyScreen的窗口小部件。因此,ScaffoldMyScreen的祖先,无法通过Scaffold访问它。