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

Flutter无状态组件局部状态更新:无需转Stateful实现侧边菜单字体色切换

实现方案

你可以用Flutter自带的ValueNotifier实现轻量级局部状态监听,全程无需修改任何组件为Stateful,仅重绘需要变色的文本区域。


步骤1:修改全局sideMenuValue定义

将你外部文件中定义的int类型sideMenuValue替换为ValueNotifier类型:

// 你的外部常量/全局变量文件中调整定义
ValueNotifier<int> sideMenuValue = ValueNotifier(1); 
// 初始值1为默认选中的菜单key,可根据需求自行调整

步骤2:修改DrawerListTile的文本渲染逻辑

仅用ValueListenableBuilder包裹需要变色的Text组件,实现最小范围局部刷新:

class DrawerListTile extends StatelessWidget {
  const DrawerListTile({
    Key? key,
    required this.intKey,
    required this.title,
    required this.svgSrc,
    required this.press,
  }) : super(key: key);

  final String title, svgSrc;
  final VoidCallback press;
  final int intKey;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: press,
      child: Padding(
        padding: const EdgeInsets.only(left: 30, bottom: 30),
        child: Container(
            child: Row(
          children: [
            SvgPicture.asset(
              svgSrc,
              height: 18,
            ),
            const SizedBox(
              width: 13,
            ),
            // 仅包裹需要监听状态变化的Text组件
            ValueListenableBuilder<int>(
              valueListenable: sideMenuValue,
              builder: (context, currentSelectedValue, child) {
                return Text(
                  title,
                  style: currentSelectedValue == intKey
                      ? const TextStyle(
                          fontSize: 18.0,
                          fontFamily: 'Barlow-Medium',
                          color: Color(0xfff00B074))
                      : Theme.of(context).textTheme.bodyText1,
                );
              },
            ),
          ],
        )),
      ),
    );
  }
}

步骤3:修改菜单点击赋值逻辑

将SideMenu中所有点击事件的赋值语句,改为给ValueNotifier的value属性赋值:

// 原逻辑 sideMenuValue = 1; 改为以下写法,其他key同理调整
press: () {
  sideMenuValue.value = 1;
},

原理说明

ValueListenableBuilder只会监听绑定的ValueNotifier值变化,仅重绘自身包裹的组件区域,不会触发父级、其他同级组件重绘,所有上层组件都可以保持Stateless状态,完全满足你避免全量重绘的需求。

内容的提问来源于stack exchange,提问作者rameez khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:45:04