在一个flutter应用程序中,假设我有一个包含多个小部件的小部件类(即,只有一个典型的单个长Widget build()
类,其中有多个小部件)。然后将它们拆分为多个带有各自类的子窗口小部件:例如,
之前:
class Parents extend StatelessWidget{
Widget build(BuildContext context){
//Parent
return Column{
children: <Widget>[
//Child 1
Container('something inside'),
//Child 2
Container('something inside'),
//Child 3
Container('something inside'),
...
]
}
}
}
现在:
class Parents extend StatelessWidget{
Widget build(BuildContext context){
//Parent
return Column{
children: <Widget>[
//Child 1
myContainer('first child'),
//Child 2
myContainer('first child'),
//Child 3
myContainer('first child'),
...
]
}
}
}
class myContainer extend StatelessWidget{
Widget build(BuildContext context){
//child reusable widget
return Container{
'something inside'
}
}
}
我的问题是这个Widget build(BuildContext context)
。
在上面的示例中,我在父类中多次调用myContainer
类。在我看来,这意味着build
小部件被调用了四次(其中有一个父项,每个孩子3次)。
我的意思是,我在线上看到了很多建议使用上述方法的示例,但这真的是一种适当的方法吗?我可能还没有完全理解颤动,但是由于它是一个小部件树,仅将父级context
传递给子级是否会更有效率(就性能而言)?如下所示:
class myContainer extend StatelessWidget{
final BuildContext parentContext;
Widget build(parentContext){
//child reusable widget
return Container{
'something inside'
}
}
}
这两种方法似乎都行得通,但想看看我的思维方式是否有效。我不完全了解Context
的机制,因此请多加澄清!
谢谢大家!
答案 0 :(得分:1)
来自docs:
每个小部件都有自己的BuildContext,它将成为 由StatelessWidget.build或State.build函数返回的窗口小部件。 (同样,RenderObjectWidgets的任何子项的父项。)
尤其是,这意味着在构建方法中, build方法的小部件的上下文与build不同 该build方法返回的窗口小部件的上下文。这可能导致 一些棘手的情况。例如,Theme.of(context)查找 给定构建上下文的最接近的封闭主题。如果是构建方法 对于小部件Q,其返回的小部件树中包含一个主题,并且 尝试使用Theme.of传递自己的上下文,该构建方法用于 Q将找不到该主题对象。相反,它将找到任何主题 是小部件Q的祖先。如果的子部分的构建上下文 需要返回的树,可以使用Builder小部件: 传递给Builder.builder回调的上下文将是 生成器本身。
因此,这基本上意味着BuildContext
方法内的build()
实际上是它的父方法。因此,他们无需显式传递它。