Flutter 使用内部动画设置两条路线动画的颤振

Flutter 使用内部动画设置两条路线动画的颤振,flutter,animation,routes,page-transition,Flutter,Animation,Routes,Page Transition,我完全受不了了。我想创建一个自定义页面路由,该路由将设置输入和输出页面的动画。路线本身的动画是一项简单的任务,我是这样做的: 导入“包装:颤振/材料.省道”; 类FromMenuRoute扩展了PageRouteBuilder{ 最后一页; 最后一页; FromMenuRoute({this.prevPage,this.nextPage}):超级( 转换持续时间:持续时间(毫秒:500), 页面生成器:( 构建上下文上下文, 动画,, 动画二级动画, ) { 返回下一页; }, 国家:错, 转换

我完全受不了了。我想创建一个自定义页面路由,该路由将设置输入和输出页面的动画。路线本身的动画是一项简单的任务,我是这样做的:

导入“包装:颤振/材料.省道”;
类FromMenuRoute扩展了PageRouteBuilder{
最后一页;
最后一页;
FromMenuRoute({this.prevPage,this.nextPage}):超级(
转换持续时间:持续时间(毫秒:500),
页面生成器:(
构建上下文上下文,
动画,,
动画二级动画,
) {
返回下一页;
},
国家:错,
转换生成器:(
构建上下文上下文,
动画,,
动画二级动画,
孩子,
) {
var colorTheme=customthemetdata.of(context).colorTheme;
退货(
子:堆栈(
溢出:溢出。可见,
儿童:[
幻灯片转换(
位置:吐温(
开始:常数偏移(0.0,0.0),
结束:常数偏移(-0.3,0.0),
).制作动画(动画),
孩子:上一页,
),
幻灯片转换(
位置:吐温(
开始:常数偏移(1.0,0.0),
结束:偏移0.0,
).制作动画(动画),
子对象:动画生成器(
动画:动画,
建筑商:(c、w){
退货(
shadowColor:colorTheme.textColor,
标高:30.0*animation.value,
孩子:下一页
);
},
),
)
],
),
);
}
);
}
但问题是,我还想在这些页面中运行一些动画,而不仅仅是页面小部件本身的动画。我不知道该怎么做

我用的是这样的路线

Navigator.of(context).push(
FromMenuRoute(上一页:小部件,下一页:下一页小部件)
);
我的第一个想法是在推送路线之前在OUT页面中启动动画控制器,如下所示:

\u animationController.forward();
导航器.of(上下文).push(
FromMenuRoute(上一页:小部件,下一页:下一页小部件)
);
它成功了。页面动画与页面转换一起运行。但是当我需要弹出路线时,我无法反转控制器。 我的意思是,我当然可以,例如,在didWidgetUpdate方法中,但它没有效果,因为小部件(在本例中称为nextPage)失去了它的上下文,动画控制器为小部件的另一个副本设置了动画,直到pop转换结束才显示。 当pop转换运行时,它显示了“下一页”的旧副本

第二个想法是使用GlobalKey来保持小部件的状态,该小部件也因错误而失败 使用2个重复的全局键

理想的选择是在我的FromMenuRoute中类似这样的内容

SlideTransition(
位置:吐温(
开始:常数偏移(0.0,0.0),
结束:常数偏移(-0.3,0.0),
).制作动画(动画),
child:prevPage.copyWith(animation:animation),//但我明白这是做不到的
),
所以我已经没有好主意了。我不想用一些非常狡猾的方式。也许有更好的办法我不知道。如果你知道如何解决这个问题,请分享


下面是我想要实现的详细示例

导入“包装:颤振/材料.省道”;
类Page1扩展了StatefulWidget{
@凌驾
_Page1State createState();
}
类_Page1State使用SingleTickerProviderStateMixin扩展状态{
AnimationController _AnimationController;
@凌驾
void initState(){
_animationController=animationController(
vsync:这个,,
lowerBound:0.0,
上限:1.0,
持续时间:持续时间(毫秒:3000)
);
super.initState();
}
@凌驾
无效处置(){
_animationController.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回容器(
颜色:颜色,红色,
宽度:double.infinity,
高度:双无限,
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
容器(
宽度:double.infinity,
身高:60.0,
颜色:颜色。琥珀色,
子:堆栈(
儿童:[
幻灯片转换(
位置:吐温(
开始:常数偏移(0.0,0.0),
结束:偏移量(3.0,0.0),
).animate(_animationController),
子:容器(
身高:60.0,
宽度:60.0,
颜色:颜色,蓝色,
),
),
],
),
),
尺寸箱(高度:100.0,),
升起的按钮(
子项:文本(“添加新路线”),
已按下:(){
///在此处调用不会影响动画,因为
///在此基础上创建一个新的小部件
///但是如果我从initState()调用它,我将无法访问
///稍后,当我需要还原动画时
_animationController.forward();
导航器.of(上下文).push(
FromMenuRoute(上一页:小部件,下一页:Page2())
);
},
),
],
),
);
}
}
类Page2扩展了StatefulWidget{
@凌驾
_Page2State createState()=>\u Page2Stat