Flutter:主题切换时TextFormField前缀图标聚焦颜色异常问题
解决方案
你之前的问题出在直接用ColorScheme(primary: Colors.red)完全替换了主题,导致暗黑模式下丢失了原有主题的其他样式属性。下面提供几种更精准的处理方式,既满足聚焦时前缀图标变红的需求,又能适配明暗模式:
方法一:局部Theme定制(推荐)
通过Theme.of(context).copyWith仅修改输入框的前缀图标颜色规则,继承父主题的其他所有样式,这样明暗模式都会正常适配:
Theme( data: Theme.of(context).copyWith( inputDecorationTheme: Theme.of(context).inputDecorationTheme.copyWith( prefixIconColor: MaterialStateColor.resolveWith((states) { // 聚焦时显示红色,非聚焦时沿用主题默认图标颜色 return states.contains(MaterialState.focused) ? Colors.red : Theme.of(context).iconTheme.color!; }), ), ), child: TextFormField( decoration: const InputDecoration( prefixIcon: Icon(Icons.person), hintText: "请输入内容", ), ), )
方法二:手动监听焦点控制图标颜色
无需Theme包裹,通过FocusNode监听焦点状态,动态设置图标颜色:
late FocusNode _inputFocusNode; bool _isInputFocused = false; @override void initState() { super.initState(); _inputFocusNode = FocusNode() ..addListener(() { setState(() { _isInputFocused = _inputFocusNode.hasFocus; }); }); } @override void dispose() { _inputFocusNode.dispose(); super.dispose(); } // 构建TextFormField TextFormField( focusNode: _inputFocusNode, decoration: InputDecoration( prefixIcon: Icon( Icons.person, color: _isInputFocused ? Colors.red : Theme.of(context).iconTheme.color, ), hintText: "请输入内容", ), )
方法三:全局主题定制(多输入框场景)
如果你的App中有多个输入框需要相同效果,可以在全局主题中统一配置,避免重复代码:
MaterialApp( theme: ThemeData.light().copyWith( inputDecorationTheme: InputDecorationTheme( prefixIconColor: MaterialStateColor.resolveWith((states) { return states.contains(MaterialState.focused) ? Colors.red : null; }), ), ), darkTheme: ThemeData.dark().copyWith( inputDecorationTheme: InputDecorationTheme( prefixIconColor: MaterialStateColor.resolveWith((states) { return states.contains(MaterialState.focused) ? Colors.red : null; }), ), ), home: const YourHomePage(), )
总结
不需要完全自定义应用主题,局部修改即可解决问题——除非你有大量输入框需要统一该规则。核心是避免直接覆盖整个ColorScheme,而是精准修改输入框的装饰属性,保留原有主题的明暗模式适配逻辑。
内容的提问来源于stack exchange,提问作者tomerpacific
相关产品推荐
相关产品推荐

