【问题标题】:Prevent widget from being rebuilt more than one time at the same time in Flutter防止在 Flutter 中同时多次重建小部件
【发布时间】:2021-05-14 10:37:13
【问题描述】:

我正在尝试创建一个带有复杂的点击动作动画的小部件。为此,我有不同的控制器,例如首先动画到特定值,例如 onTapDown 上的 0.5,然后在 onTapUp 上转发到 1.0,但我还想添加控制器,它完全变为 1.0,持续时间不同和不同的逻辑。如果我只使用一个控制器,我可以使用AnimatedBuilder 自动设置状态,甚至可以在调用setState 的控制器更新函数上添加一个监听器。但据我所知,我不能用多个控制器来做到这一点,AnimatedBuilder 不能监听多个控制器,如果我为每个控制器添加一个监听器,当多个控制器时,setState 将在同一帧上被调用多次正在运行,我认为这会影响性能。

有没有办法解决这个问题?例如,有没有办法检查状态是否已经在特定帧中设置并避免为该控制器调用设置状态,以便每个控制器上的侦听器可以是这样的?

  _controller.addListener((){
  
  if( !stateUpdated (?) ) // I couldn't find something similar to this 
    setState(() {
    });
  });

【问题讨论】:

  • 你可以覆盖你的小部件的setState(),在里面你可以检查thungs是否已经改变,并基于你调用super.setState()。所以你可以更好地控制重建
  • 您也可以查看didUpdateWidget() Widget 类方法,看看您是否也可以使用它来确定您的小部件是否需要重建
  • “据我所知,AnimatedBuilder 不能监听多个控制器” - 然后使用 Listenable.merge,同时多次调用 setState 我们非常便宜它只设置一个标志 - github.com/flutter/flutter/blob/cc9b78fc5c/packages/flutter/lib/…

标签: flutter animation mobile


【解决方案1】:

正如@pskink 指出的,Listenable.merge 用于合并多个容器并创建一个新的Listenable,可以将其传递给AnimatedBuilderanimation 参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-13
    • 2020-09-17
    • 2022-01-17
    • 2019-08-23
    • 2021-04-19
    • 2020-08-22
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多