Animation 如何在父级状态更改后重建子级(&;回放动画)

Animation 如何在父级状态更改后重建子级(&;回放动画),animation,state,flutter,Animation,State,Flutter,我的父窗口小部件包含一个isLikedbool字段 最初构建子窗口小部件时,它们会播放动画。请注意以下代码段: @override void initState() { ... _animationController.forward(); } 我正在使用InheritedWidget访问父级的状态。我尝试将\u animationController.reset()添加到initState(),但这也不起作用 我认为当父状态更新时,这个子组件没有被重建。我使用以下(可重用)代

我的父窗口小部件包含一个
isLiked
bool
字段

最初构建子窗口小部件时,它们会播放动画。请注意以下代码段:

@override
void initState() {
    ...
    _animationController.forward();
}
我正在使用
InheritedWidget
访问父级的状态。我尝试将
\u animationController.reset()
添加到
initState()
,但这也不起作用

我认为当父状态更新时,这个子组件没有被重建。我使用以下(可重用)代码将状态向下传递到小部件树,如本文所述

import'package:flatter/widgets.dart';
类提供程序扩展StatefulWidget{
常量提供程序({this.data,this.child});
静态的(构建上下文){
_继承提供程序=
context.inheritFromWidgetOfExactType(_InheritedProvider);
返回p.data;
}
最终数据;
最后一个孩子;
@凌驾
State createState()=>new _ProviderState();
}
类_ProviderState扩展状态{
@凌驾
initState(){
super.initState();
widget.data.addListener(didValueChange);
}
didValueChange()=>setState((){});
@凌驾
小部件构建(构建上下文){
返回新的\u继承的提供程序(
数据:widget.data,
child:widget.child,
);
}
@凌驾
处置{
widget.data.removeListener(didValueChange);
super.dispose();
}
}
类_InheritedProvider扩展InheritedWidget{
_InheritedProvider({this.data,this.child})
:_dataValue=data.value,
超级(儿童:儿童);
最终数据;
最后一个孩子;
最终数据值;
@凌驾
bool updateShouldNotify(\u InheritedProvider oldWidget){
返回_dataValue!=oldWidget.\u dataValue;
}
}

您的子窗口小部件正在重建,但相应的
状态
对象没有重建
initState
只被调用一次,因为框架会在可能的情况下尝试重用它们。要在发生这种情况时得到通知,可以使用
didUpdateWidget
lifecycle方法。例如,要在每次配置更改时重新启动控制器,请执行以下操作:

class MyState extends State<MyWidget> {
  @override
  void initState() {
    super.initState();
    // do initial setup.
  }

  @override
  void didUpdateWidget(MyWidget oldWidget) {
     super.didUpdateWidget(oldWidget);
    // do subsequent updates.
  }

  ...
}
类MyState扩展状态{
@凌驾
void initState(){
super.initState();
//进行初始设置。
}
@凌驾
void didUpdateWidget(MyWidget oldWidget){
super.didUpdateWidget(oldWidget);
//进行后续更新。
}
...
}
您甚至可以比较
widget
oldWidget
上的成员,并有条件地重新启动或停止动画

class MyState extends State<MyWidget> {
  @override
  void initState() {
    super.initState();
    // do initial setup.
  }

  @override
  void didUpdateWidget(MyWidget oldWidget) {
     super.didUpdateWidget(oldWidget);
    // do subsequent updates.
  }

  ...
}