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
相关产品推荐
相关产品推荐

