You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter:实现侧边菜单动画图标展开时白色、收起时红色的颜色切换

解决Flutter AnimatedIcon根据菜单开合状态切换颜色的问题

我来帮你搞定这个侧边菜单图标颜色切换的需求!核心思路就是根据菜单的开合状态动态设置AnimatedIcon的color属性,这里有两种简单靠谱的实现方式:


方法一:直接通过动画控制器状态判断

你的_animationController本身就可以反映菜单的状态——当动画完成(菜单展开)时,控制器状态是AnimationStatus.completed;动画未启动/反向完成(菜单收起)时是AnimationStatus.dismissed。直接用这个状态判断颜色:

修改后的AnimatedIcon代码:

AnimatedIcon(
  progress: _animationController.view,
  icon: menuClose,
  color: _animationController.status == AnimationStatus.completed 
      ? Colors.white 
      : Colors.red, // 收起状态红色,展开状态白色
  size: 25.sp,
)

方法二:用布尔变量跟踪菜单状态(更直观推荐)

如果你的菜单状态还需要在其他地方复用,建议定义一个专门的布尔变量来跟踪,代码可读性和维护性更好:

步骤1:定义状态变量

在你的State类里添加:

bool _isMenuExpanded = false; // 初始为收起状态

步骤2:更新onIconPressed()方法

在点击事件里同步更新状态变量:

void onIconPressed() {
  if (_isMenuExpanded) {
    _animationController.reverse();
  } else {
    _animationController.forward();
  }
  setState(() {
    _isMenuExpanded = !_isMenuExpanded;
  });
}

步骤3:设置AnimatedIcon的颜色

直接用布尔变量判断,逻辑一目了然:

AnimatedIcon(
  progress: _animationController.view,
  icon: menuClose,
  color: _isMenuExpanded ? Colors.white : Colors.red,
  size: 25.sp,
)

完整修改后的按钮代码

把上面的逻辑整合到你的完整按钮代码里,就是这样:

Align(
  alignment: Alignment(0, .99),
  child: GestureDetector(
    onTap: () {
      onIconPressed();
    },
    child: ClipRRect(
      borderRadius: BorderRadius.circular(80),
      child: Container(
        width: 50.w,
        height: 45.h,
        color: colorAnimatedButton,
        alignment: Alignment.center,
        child: AnimatedIcon(
          progress: _animationController.view,
          icon: menuClose,
          // 这里用你选的方法设置颜色
          color: _isMenuExpanded ? Colors.white : Colors.red,
          size: 25.sp,
        ),
      ),
    ),
  ),
)

这样就能完美实现:菜单收起时图标红色,展开时图标白色的效果啦!

内容的提问来源于stack exchange,提问作者M.A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 09:29:07