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
无法停止调用该方法?
答案 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
。