gpt4 book ai didi

animation - 如何在父状态更改后重建子级(和重播动画)

转载 作者:IT王子 更新时间:2023-10-29 07:10:21 29 4
gpt4 key购买 nike

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

当最初构建子部件时,它们会播放自己的动画。请注意以下代码段:

@override
void initState() {
...
_animationController.forward();
}

我正在使用 InheritedWidget 访问父级的状态。我尝试将 _animationController.reset() 添加到 initState(),但这也不起作用。

我认为这个子组件在父状态更新时没有被重建。我正在使用以下(可重用)代码将状态向下传递到小部件树,如 flutter reactive state article. 中所述

import 'package:flutter/widgets.dart';

class Provider extends StatefulWidget {
const Provider({this.data, this.child});

static of(BuildContext context) {
_InheritedProvider p =
context.inheritFromWidgetOfExactType(_InheritedProvider);
return p.data;
}

final data;
final child;

@override
State<StatefulWidget> createState() => new _ProviderState();
}

class _ProviderState extends State<Provider> {
@override
initState() {
super.initState();
widget.data.addListener(didValueChange);
}

didValueChange() => setState(() {});

@override
Widget build(BuildContext context) {
return new _InheritedProvider(
data: widget.data,
child: widget.child,
);
}

@override
dispose() {
widget.data.removeListener(didValueChange);
super.dispose();
}
}

class _InheritedProvider extends InheritedWidget {
_InheritedProvider({this.data, this.child})
: _dataValue = data.value,
super(child: child);
final data;
final child;
final _dataValue;

@override
bool updateShouldNotify(_InheritedProvider oldWidget) {
return _dataValue != oldWidget._dataValue;
}
}

最佳答案

您的子部件正在重建,但它们相应的 State 对象没有。 initState 只被调用一次,因为框架会尽可能重用它们。要在发生这种情况时收到通知,您可以使用 didUpdateWidget 生命周期方法。例如,每次配置更改时重新启动 Controller :

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

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

...
}

您甚至可以比较 widgetoldWidget 上的成员,并有条件地重新启动或停止动画。

关于animation - 如何在父状态更改后重建子级(和重播动画),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49641712/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com