上一篇,我们实现了普通控件的点击态背景色(无论点击快慢都有背景色变化)。但是,当我将其应用到ListItem时,出现错误。原因不知,猜测是与item复用有关。
然后我尝试使用AnimatedContainer,可以做到按下和松开时背景色变化。正如上一篇所说,AnimatedContainer无法实现快速按下松开后的背景色变化,因此,我决定参考AnimatedContainer源码实现了ListItem点击态背景色。
区别是:widget和state需继承特殊的基类,而非普通的StatefulWidget和State。
enum WidgetState { None, Down, Up, Cancel }
class _ListItem extends ImplicitlyAnimatedWidget {
final VoidCallback onPressed;
_ListItem({
@required this.onPressed,
}) : super(duration: Duration(milliseconds: 150));
@override
_ListItemState createState() => _ListItemState();
}
class _ListItemState extends AnimatedWidgetBaseState<_ListItem> {
var _state = WidgetState.None;
Animation<Color> _animation;
@override
void initState() {
super.initState();
// 必须放在initState,因为controller在基类的initState中初始化
_animat