UI状态与逻辑状态管理不一而足

时间:2020-07-08 11:19:36

标签: flutter dart flutter-animation flutter-provider

我已经尝试了几天,但是我真的没有什么好主意了。可以在这里找到代码:https://github.com/Sileadim/provider_test

这是我要做什么的解释:

  • 创建思维导图工具
  • 用户应该能够拖动节点,缩放和滚动。
  • 单击节点时,该节点周围应弹出一些按钮,允许删除该节点,添加子节点等。
  • 节点和按钮应具有介绍性动画,例如滑动和增长。当我单击另一个节点时,应使用动画删除当前选定节点的按钮,并应显示新选定的按钮。我要添加一个新节点。

到目前为止我所做的:

  • 要管理状态,我使用提供程序。提供者保存类中每个节点的位置和其他信息,它保存当前缩放和矩阵滚动,并具有检查该节点是否处于活动状态的方法等。请参见:https://github.com/Sileadim/provider_test/blob/master/lib/node.dart
  • 我在第一级使用context.watch<NodeStates>.nodes为每个节点创建一个Node小部件。该小部件为抽象节点信息提供主体和一些动画。类似地,我布置按钮。
  • 所有节点/按钮都具有诸如context.watch<NodeStates>.addChild(widget.node)之类的提供者方法,该方法在最后调用notifyListeners()。看到这里:https://github.com/Sileadim/provider_test/blob/master/lib/main.dart
  • 为节点/按钮提供视觉效果的小部件是一个有状态的小部件,其中包含animationController,因为我读到的应该将UI状态与逻辑状态分开。因此,build()方法会触发动画控制器,并返回包装在例如GestureDetector,取决于传递给窗口小部件的节点是否处于活动状态如果正确,我现在不知道。
  • 每次滚动级别更改SlideAnimation都会触发重建 整个视图
  • 每次将新节点添加到context.watch<NodeStates>.matrix时,也会触发整个视图的重建。

问题:

  • context.watch<NodeStates>.nodes添加节点会重新触发整个节点,按钮等视图的构建,但是 从未调用此新节点的小部件的context.watch<NodeStates>.nodes,因此未设置animationController。看来它是从其他小部件中获取的,而我不知道如何以及为什么?也不会再次调用已经存在的节点的initState(),只有initState()
  • 用于所有新的和旧的按钮,依次调用build()initState(),这会触发幻灯片动画再次显示该按钮。
  • 通常::如何管理持久性UI状态?如何有效管理新窗口小部件的添加并存储动画状态,以便在重建整个视图时不会再次调用它?提供程序仅在节点处于活动状态时存储,而不存储当前动画状态是什么。

谢谢。

0 个答案:

没有答案