在构建方法中分配 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 读起来更好,但是,当然,它们并不等同。

我不知道性能差异大到足以在这里讨论。