如何让TextFormField内的icon调用setState()后保持着色状态
问题原因
TextFormField的icon默认采用Material状态响应式配色规则:未聚焦状态默认读取主题的unselectedWidgetColor,仅聚焦状态会应用配置的聚焦色。调用setState()触发组件重建时,框架会重新校验当前组件状态匹配对应配色,因此非聚焦状态下会回退到默认未选中色,无法保持聚焦态的着色效果。
可行配置方案
任选一种方式修改即可实现图标颜色固定,不受聚焦状态、setState重建影响:
方案1:通过
InputDecoration的iconColor参数固定全状态色
该参数设置的颜色优先级高于默认状态配色规则,所有交互状态下都会生效:TextFormField( decoration: InputDecoration( icon: Icon(Icons.account_circle), // 替换为你需要的自定义颜色 iconColor: Colors.deepPurple, ), )如果你用的是前缀/后缀图标,对应设置
prefixIconColor、suffixIconColor即可。方案2:通过局部/全局主题统一配置固定色
如果需要当前页面甚至全局所有输入框图标都保持该固定色,可以配置InputDecorationTheme统一覆盖默认状态配色:// 局部配置示例:用Theme组件包裹TextFormField Theme( data: Theme.of(context).copyWith( inputDecorationTheme: const InputDecorationTheme( iconColor: Colors.deepPurple, prefixIconColor: Colors.deepPurple, suffixIconColor: Colors.deepPurple, ), ), child: TextFormField( decoration: InputDecoration( icon: Icon(Icons.account_circle), ), ), )把该配置写入APP根主题的
ThemeData即可实现全局生效。方案3:直接给图标组件设置颜色
不需要响应任何输入框状态变化的场景下,直接给传入的Icon组件指定color属性,该配置优先级最高,会完全覆盖输入框的状态配色逻辑,无论组件怎么重建、是否聚焦都会保持设置的颜色:TextFormField( decoration: InputDecoration( icon: Icon( Icons.account_circle, color: Colors.deepPurple, ), ), )
配色优先级说明:
Icon组件自带color>InputDecoration单独设置的iconColor>InputDecorationTheme主题配置 > 系统默认状态响应配色。
内容的提问来源于stack exchange,提问作者Jiehfeng
相关产品推荐
相关产品推荐

