【问题标题】:Parent's LayoutBuilder is called too often, every time a change in TextField occursParent的LayoutBuilder调用太频繁,每次TextField发生变化
【发布时间】:2020-03-31 09:39:47
【问题描述】:

每次我关注文本字段、输入或删除新字符时,都会看到“被调用”的打印。我真正的小部件树包含一个列表,其瓷砖具有动画,由于滚动位置更改后重新创建整个列表视图而无法正常工作。那么,我怎样才能仍然使用 LayoutBuilder 提供的东西,即 constraints 数据,而无需在发生某些更改后重建其整个子树?

class _AppState extends State<App> with AfterLayoutMixin<App>
{
  AppCoordinator appCoordinator;
  @override
  Widget build(BuildContext context)
  {
    return Scaffold(
        key: Key("sadf"),
      body: new LayoutBuilder(
          key: Key("sadd"),
          builder: (context, constraint)
      {
        print("called");
        return TextField(
          key: Key("sad")
        );
      }),
    );
  }
}

【问题讨论】:

  • 这是预期的行为。
  • @RémiRousselet 那么对于我的情况,LayoutBuilder 的替代方案是什么?
  • LayoutBuilder 或构建计数不是问题。根据您的描述,问题似乎是您的动画/列表视图
  • @RémiRousselet 目前不愿意修改动画库,通过布局构建器修复它是最简单的
  • 你没有解释动画的问题是什么。

标签: flutter flutter-layout


【解决方案1】:

您可以假设构建方法将被过度调用。如果这是一个问题,请使用有状态小部件并缓存您从构建返回的小部件。

class _FooState extends State<Foo> {
  Widget _child;
  Widget build(BuildContext context) {
    _child ??= Container();
    return _child;
  }
}

这可以与布局生成器一起使用。

【讨论】:

  • 这样做很危险
  • 为什么?你能解释一下吗?
  • 这里使用??=意味着当widget使用的参数/inheritedwidgets改变时,创建的widget不会更新。如果有问题,作者应该正确解决问题,而不是解决构建计数问题
  • @RémiRousselet 我在 OP 上回复说,其他解决方案是手动检查和修复动画库,但对于这么简单的事情来说,这涉及太多工作。在这种情况下,有什么替代 LayoutBuilder 的替代方法可以以类似的方式工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
相关资源
最近更新 更多