在构建方法中分配 InheritedWidget
Assigning InheritedWidget in build-Method
让 A 成为一个 InheritedWidget,我可以通过调用 A.of(context) 遍历整个应用程序。
如果我有一个 StatefulWidget,什么是更好的选择(就性能或代码质量而言):
A)
class Test extends StatefulWidget {
@override
_TestState createState() => _TestState();
}
class _TestState extends State<Test> {
A a;
@override
Widget build(BuildContext context) {
a ??= A.of(context);
return Container();
}
}
B)
class Test extends StatefulWidget {
@override
_TestState createState() => _TestState();
}
class _TestState extends State<Test> {
@override
Widget build(BuildContext context) {
final a = A.of(context);
return Container();
}
}
我从来没有见过有人使用选项 A),所以我想知道。我更喜欢选项 A) 因为 _TestState class 中的每个方法都可以轻松使用 a-Object,并且它在构建方法中也只分配一次。
如果您保持小部件,选项 B 可能就足够了。如果您有许多依赖于继承的小部件的方法,那将不会很好。
阅读选项 A 在我脑海中提出了一些问题,例如
- “您正在缓存
A
,您是否关心 A
是否在树中发生变化?”
- “在构建之外需要
A
吗?”
- “如果是这样,为什么?我们知道它会在那个时候初始化吗?”
- “如果不是,为什么它是实例字段?”
虽然这两个选项都有效。
就代码质量而言,第三种选择是通过将 A
作为小部件的参数来应用 dependency inversion principle。
class MyStatefulWidget extends StatefulWidget {
MyStatefulWidget({@required this.a});
final A a;
...
}
然后调用者可以使用MyStatefulWidget(a: A.of(context))
创建它。这比选项 A 读起来更好,但是,当然,它们并不等同。
我不知道性能差异大到足以在这里讨论。
让 A 成为一个 InheritedWidget,我可以通过调用 A.of(context) 遍历整个应用程序。
如果我有一个 StatefulWidget,什么是更好的选择(就性能或代码质量而言):
A)
class Test extends StatefulWidget {
@override
_TestState createState() => _TestState();
}
class _TestState extends State<Test> {
A a;
@override
Widget build(BuildContext context) {
a ??= A.of(context);
return Container();
}
}
B)
class Test extends StatefulWidget {
@override
_TestState createState() => _TestState();
}
class _TestState extends State<Test> {
@override
Widget build(BuildContext context) {
final a = A.of(context);
return Container();
}
}
我从来没有见过有人使用选项 A),所以我想知道。我更喜欢选项 A) 因为 _TestState class 中的每个方法都可以轻松使用 a-Object,并且它在构建方法中也只分配一次。
如果您保持小部件,选项 B 可能就足够了。如果您有许多依赖于继承的小部件的方法,那将不会很好。
阅读选项 A 在我脑海中提出了一些问题,例如
- “您正在缓存
A
,您是否关心A
是否在树中发生变化?” - “在构建之外需要
A
吗?”- “如果是这样,为什么?我们知道它会在那个时候初始化吗?”
- “如果不是,为什么它是实例字段?”
虽然这两个选项都有效。
就代码质量而言,第三种选择是通过将 A
作为小部件的参数来应用 dependency inversion principle。
class MyStatefulWidget extends StatefulWidget {
MyStatefulWidget({@required this.a});
final A a;
...
}
然后调用者可以使用MyStatefulWidget(a: A.of(context))
创建它。这比选项 A 读起来更好,但是,当然,它们并不等同。
我不知道性能差异大到足以在这里讨论。