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

Flutter TextFormField样式定制:背景色切换与光标图标颜色修改

解决方案

一、实现背景颜色动态切换

通过监听输入框的焦点状态与文本内容,动态调整外层Container的背景色:

  • 无焦点且文本为空时,背景为灰色
  • 获得焦点或已有文本时,背景切换为白色

二、自定义激活状态下的光标与前缀图标颜色

  • 直接指定光标颜色为自定义主题色
  • 根据焦点状态切换前缀图标的颜色

修改后的完整代码片段

Container(
  width: inputWidth,
  padding: EdgeInsets.symmetric(horizontal: 5),
  // 动态切换背景色
  decoration: BoxDecoration(
    color: firstNameNode.hasFocus || firstNameController.text.isNotEmpty 
        ? Colors.white 
        : Colors.grey.shade200,
    borderRadius: BorderRadius.circular(15)
  ),
  child: TextFormField(
    focusNode: firstNameNode,
    autofocus: false,
    controller: firstNameController,
    obscureText: false,
    textAlignVertical: TextAlignVertical.center,
    // 设置光标颜色为主题primaryColor
    cursorColor: Theme.of(context).primaryColor,
    decoration: InputDecoration(
      // 根据焦点状态切换前缀图标颜色
      prefixIcon: Icon(
        Icons.person_outline,
        color: firstNameNode.hasFocus 
            ? Theme.of(context).primaryColor 
            : Colors.grey.shade600,
      ),
      border: InputBorder.none,
      hintText: "Full Name",
    ),
    onFieldSubmitted: (value) {
      phoneNode.requestFocus();
    },
  ),
)

额外优化:全局主题统一配置(可选)

若需全局统一输入框样式,可在ThemeData中配置,避免重复代码:

theme: ThemeData(
  primaryColor: Color(0xFF623CEA),
  fontFamily: 'Manrope',
  inputDecorationTheme: InputDecorationTheme(
    // 聚焦状态下的前缀图标颜色
    focusedPrefixIconColor: Color(0xFF623CEA),
    // 默认状态下的前缀图标颜色
    prefixIconColor: Colors.grey.shade600,
  ),
  // 全局统一光标颜色
  textSelectionTheme: TextSelectionThemeData(
    cursorColor: Color(0xFF623CEA),
  ),
),

使用全局配置后,无需在单个TextFormField中重复设置光标与图标颜色,代码更简洁。

已尝试方案(中文翻译)

  • 直接为TextFormField添加focusColor属性
  • 在ThemeData和InputDecorationTheme中配置focusColor

内容的提问来源于stack exchange,提问作者Kyle Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:40:31