当其中的代码仍然有效时,使用“可见性”有什么好处

时间:2019-09-05 15:22:03

标签: flutter dart

Flutter建议我们不要更改小部件树的深度以获得更好的性能。

代码1(更改深度但阻止调用方法):

@override
Widget build(BuildContext context) {
  return Column(
    children: <Widget>[
      Text("Keep it visible"),
      if (_show) _buildAnotherWidget(), // it changes depth of the tree, not good, but my method doesn't get called
    ],
  );
}

代码2(不会更改深度,也无法阻止调用方法):

@override
Widget build(BuildContext context) {
  return Column(
    children: <Widget>[
      Text("Keep it visible"),
      Visibility(
        visible: false,
        child: _buildAnotherWidget(), // recommended way but even my method keeps getting called
      ),
    ],
  );
}

那么,当Visibility设置为visible时,为什么false无法停止调用该方法?

2 个答案:

答案 0 :(得分:0)

您对Visibility不改变树的深度的假设是错误的。

默认情况下,它等同于:

if (visible)
  return child;
else
  return const SizedBox();

因此,这可能会使该问题完全无效。

答案 1 :(得分:0)

如果您问为什么用_buildAnotherWidget()小部件调用Visibility,那是因为您正在无条件调用_buildAnotherWidget()。。在调用函数/构造函数之前,先在 中评估参数; Visibility小部件对此无能为力。如果您希望通过这种方法懒惰地调用_buildAnotherWidget(),则需要使用Builder。也就是说,the recommendation is to prefer omitting the widget from the tree instead of using Visibility