flutter - 使用 StreamBuilder 制作动画
问题描述
项目
嗨,我用颤振创建了一个简单的应用程序,它根据用户垂直拖动使用流构建器更改容器的高度。
因此,由于用户输入更新非常快,这会迫使 streambuider 多次重建,从而创建动画效果。
代码
final StreamController streamController = StreamController<double>();
double height = 0.0;
StreamBuilder(
initialData: 0.0,
stream: streamController.stream,
builder: (context, snapshot) {
return Container(
height: snapshot.data,
);
},
),
....
height += (dragUpdateDY);
streamController.add(height);
问题
尽管代码按预期工作,但我一直认为这不是一个好的解决方案,因为它迫使 UI 在一秒钟内重建不可预测的时间,甚至可能超过 60 次,超过显示刷新率。
有没有更好的办法?
解决方案
这完全没问题,因为build
实际上不是您调用的!它总是被框架调用,这就是为什么它不会被调用超过 60 Hz。
这是真的,因为在内部StreamBuilder
调用State.setState
,它执行以下操作:
调用setState会通知框架此对象的内部状态已以可能影响此子树中的用户界面的方式发生更改,这会导致框架为此State对象安排构建。
如果您想要更细粒度的控制,您可以创建自己的RenderObject
并调用markNeedsPaint
或markNeedsLayout
在需要时基于GestureRecognizer
s.
推荐阅读
- c - 步进电机C实现
- r - 点语法访问 ggplot2 层中的数据
- java - 我的基本碰撞检测计算不起作用。即使两个物体没有接触也能继续检测碰撞
- c# - 在本地计算机上找不到时区 ID“Central Daylight Time”
- amazon-web-services - 在 AWS 中恢复显示不同配置的数据库快照
- python - 本地连接时如何指定mongo数据库
- node.js - 如何安排在终端中运行的 node.js 文件?
- visual-studio-code - Visual Studio Code 的 PHP Doc Blocker 无法正常工作
- ios - 如何根据设备方向更改堆栈视图方向?
- twitter-bootstrap - Bootstrap 的可折叠菜单不起作用