【问题标题】:Flutter Widget rebuild after one of the property changedFlutter Widget 在其中一项属性更改后重建
【发布时间】:2021-06-12 20:08:45
【问题描述】:

如何在某个属性值更改后立即强制重新构建 Widget? 一些伪代码:

class Live extends StatefulWidget {

  String name;
Live(this.name);

  @override
  _LiveState createState() => _LiveState();
}

class _LiveState extends State<Live> {

 // some turbo logic I don't want to move to Live class
 ..

  @override
  Widget build(BuildContext context) {
    return Column(childrens: [
    Text(widget.name),
    Card(content calculated based on turbo logic),
    ]
      
    );
  }
}

String name 属性更新时(基于父级的 setState 调用),一切都是实时发生的。更改会立即反映在 Text 小部件中。该值是立即可见的,因为我使用的是widget.name 调用,所以在built() 方法中我使用的是Live 类中的属性而不是状态。

问题是另一个被 Card 包裹的小部件被计算在标记为// some turbo logic I don't want to move to Live class 的地方。由于这个事实,当我想在本节中查看更新时,我需要切换选项卡并转到例如设置,然后返回实时选项卡以查看与卡片内容相关的更改。我相信它会再次触发 build() 方法。

戈拉斯:

  • 在 Live 小部件中更新 name 值后,状态小部件会立即重建。
  • 不要将turbo logic 移动到 Live 类并保留在 State 类中

【问题讨论】:

    标签: flutter dart flutter-state


    【解决方案1】:

    首先,您的StatefulWidget 应该是不可变的,因此只包含不可变字段。我建议您将name 字段移动到State 并使用setter 将其更改。 setter 应该调用setState(),这将导致所需的重建。

    请参阅this introduction 了解更多信息 - 特别是“Bird”示例代码,了解如何编写 setter。

    【讨论】:

    • 我在 Parent Widget 中使用 setState() 方法,我相信这个方法会更新子后代。它没有发生。 Flutter 端的示例没有展示如何从外部更新内部 State 对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2020-10-10
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多