所以,对于特定的动画案例,我在Flutter方面遇到了一些问题 .
基本上,我正在尝试做的是同时为路线更改运行英雄过渡运行和在相邻小部件上进行自定义动画 .
细分,我在我的root上有一个自定义的InheritedWidget,它从StatefulWidget父级提供一个app状态 . 嵌套在我的InheritedWidget中,我有一个WidgetsApp和一个自定义选项卡导航的相邻兄弟 . 树看起来像这样:
Root Widget (Stateful)
|
|__InheritedWidget
|
|__WidgetsApp (Handles routing)
|
|__Navigation Bar (Overlay)
当我在我的WidgetsApp上执行使用Hero过渡的路线更改时,我的问题出现了 . 在发生这种情况时,我还试图根据用户所在的视图显示或隐藏导航栏的动画 . 但是,由于我在我的应用程序状态中使用bool变量来通过动画显示或隐藏导航栏,因此SetState调用'覆盖'英雄转换,因为树在此过程中重建(就是我所知道的)思维) .
我最初的想法是,InheritedWidget会捕获应用程序状态更改并仅通过updateShouldNotify重建导航栏,但是这不是我所看到的所需的效果:(
那么 - 有没有人尝试过类似的东西,或者想知道如何优雅地处理它? :)
1 回答
我已经做了类似的事情,但遗憾的是我的代码还包含了许多其他的东西,这是相对复杂的事情,所以我必须把事情拆分成一个例子,这比现在我做的要多一些 . 我将解释我所做的一般概念 . 也许有更好的方法可以做到这一点 .
您希望使用也扩展NavigatorObserver的State编写StatefulWidget(您可能可以使用无状态小部件,但我不这么认为) . 我个人将它放在树中的导航器上方(即它在其构建功能中构建导航器),但你很可能也在导航器旁边 .
从NavigatorObserver覆盖didPush,didRemove,didPop等方法 . 在每个中,调用一个setState并保存动画和其他参数,如下所示:
在你的构建函数中,你需要根据它是否存在来检查_animation和animate,以及你可能想要设置的任何其他参数(即标记是否要设置动画,以及向前或向后是否有用 - 我相信'pop'动画已经从0开始并且与推进动画一样变为1,但我可能是错的) . 然后,您可以将此动画连接到想要为导航栏设置动画,可能使用AnimatedBuilder或直接连接动画或其他内容 . 如果有关于这一切是如何运作的任何具体问题,请发表评论,我会添加一些评论等 .
希望有帮助=)
编辑:完整的代码示例 . 为了记录,我不建议这个代码是那么好,或者这是你应该做的事情 . 但这是一种解决问题的方法 . 在真正的应用程序中使用它之前,值得测试它,并可能添加一些断言来检查状态等 .
import'package:flutter / material.dart';