0

让 A 成为一个 InheritedWidget,我可以通过调用 A.of(context) 来获取整个应用程序。

如果我有 StatefulWidget,那么更好的选择是什么(就性能或代码质量而言):

一个)

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();
  }
}

二)

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 类中的每个方法都可以轻松使用 a-Object,并且它在构建方法中也只分配一次。

4

1 回答 1

1

如果您保持小部件很小,选项 B 可能就足够了。如果您有许多方法依赖于继承的小部件,那将不是很好。

阅读选项 A 在我的脑海中提出了一些问题,例如

  • “你在缓存A,你关心A树上的变化吗?”
  • A在构建之外需要吗?”
    • “如果是这样,为什么?我们知道它会在那个时候初始化吗?”
    • “如果不是,为什么是实例字段?”

不过,这两种选择都有效。

就代码质量而言,第三种选择是通过为小部件设置参数来应用依赖倒置原则。A

class MyStatefulWidget extends StatefulWidget {
  MyStatefulWidget({@required this.a});
  final A a;
  ...
}

然后调用者可以使用MyStatefulWidget(a: A.of(context)). 这读起来比选项 A 好,但是,当然,它们并不等效。

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

于 2020-07-08T18:48:39.480 回答