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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:20:42