Flutter 脚手架能找到远方的麻醉师吗?
我正在努力学习更多关于Flutter 脚手架能找到远方的麻醉师吗?,flutter,Flutter,我正在努力学习更多关于BuildContext和Scaffold.of()的知识 我理解,当您显示一个SnackBar时,您通常需要添加一个Builder,以获取您所添加的脚手架下的上下文 因此: class MyScreen extends StatelessWidget { build(BuildContext context) { return Scaffold( body: Builder( builder: (context) =&g
BuildContext
和Scaffold.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 Scaffold?
当我们删除生成器并创建此错误代码时:
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()使用不包含脚手架的上下文调用。
I/颤振(7750)
从传递给Scaffold.of()的上下文开始,找不到任何Scaffold祖先。
即使在BuildContext
中没有直接的父脚手架,怎么也找不到脚手架祖先(例如祖父母祖先)?我的应用程序中以前的所有页面都有一个脚手架,它们是否不再在小部件树中
我知道,如果它发现了脚手架并渲染了蛇形条,我们将无法看到它,但我仍然不明白它为什么找不到。也许我误解了“祖先”的意思
谢谢
BuildContext
表示小部件树中一个特定小部件的位置
因此,根据您使用的BuildContext
,调用(context)的Scaffold.of(Scaffold)可能会有不同的行为
在以下示例中:
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'))),
),
),
);
}
}
在这里,您使用的是
MyScreen
的BuildContext
。问题是MyScreen
是创建Scaffold
的小部件。因此,MyScreen
是Scaffold
的祖先,无法通过Scaffold.of(context)
访问它,谢谢您的回复。我仍然不明白为什么Scaffold.of(context)
没有从我的应用程序返回其他的Scaffold。如果它返回最近的祖先,并且MyScreen中没有脚手架,那么它不应该在widget树上进一步搜索,直到找到一个吗?不,因为它不是祖先。小部件无法访问其子体。他们根本不可能这么做1.开始屏幕-->2.注释屏幕-->3.我的屏幕。我在描述这样一种情况,所以Start Screen
Screen是My Screen
的祖先,不是后代,或者我遗漏了什么?我想我有一个同事的解决方案:鉴于Theme.of(context)
和Navigator.of(context)
将一直搜索小部件树,直到找到主题或导航器,Scaffold.of(context)
只搜索可见的框架。因此,它找不到(不可见的)祖先支架,例如StartScreen。是的,但要查看其他屏幕,它必须先上后下。