Flutter 更改默认TextFormField';s图标颜色从灰色变为除选择时显示原色以外的任何颜色

Flutter 更改默认TextFormField';s图标颜色从灰色变为除选择时显示原色以外的任何颜色,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我想更改TextFormField图标的默认颜色,这也会在选择时得到更改。几乎没有改变颜色的方法,但没有一种适合我 1.设置图标颜色 当直接在下方更改图标颜色时,图标颜色在选中时不会更改,下面是相同的代码,以及在选中或未选中字段时显示红色的屏幕截图 TextFormField( maxLength: 15, decoration: InputDecoration( labelText: "USER NAME", p

我想更改TextFormField图标的默认颜色,这也会在选择时得到更改。几乎没有改变颜色的方法,但没有一种适合我

1.设置图标颜色

当直接在下方更改图标颜色时,图标颜色在选中时不会更改,下面是相同的代码,以及在选中或未选中字段时显示红色的屏幕截图

     TextFormField(
        maxLength: 15,
        decoration: InputDecoration(
          labelText: "USER NAME",
          prefixIcon: IconTheme(data: IconThemeData(
            color: Colors.redAccent
          ), child: Icon(Icons.email,))
        ),
        onSaved: (username) => _username = username,
      ),

2.保留默认值

当未选择字段时,它将显示灰色,当选择字段时,它将显示原色。下面是相同的屏幕截图。在这里,我想改变颜色的图标从灰色到红色,并希望显示原色的选择

注意:-如果我们能用主题来做这件事就好了


下面的代码将生成
FocusNodes
您需要管理
TextFormFields
的焦点,并在焦点从一个字段更改到另一个字段时执行
setState
。我们只是创建一个焦点节点列表,监听每个节点上的更改,并将它们分配给一个字段:

List<FocusNode> _focusNodes = [
  FocusNode(),
  FocusNode(),
  FocusNode(),
  FocusNode(),
];

@override
void initState() {
  _focusNodes.forEach((node){
    node.addListener(() {
      setState(() {});
    });
  });
  super.initState();
}

@override
Widget build(BuildContext context) {
  return Column(
    children: <Widget>[
      TextFormField(
        focusNode: _focusNodes[0],
        decoration: InputDecoration(
          prefixIcon: Icon(Icons.email,
            color: _focusNodes[0].hasFocus ? Theme.of(context).accentColor : Colors.grey,
          ),
        ),
      ),
      TextFormField(
        focusNode: _focusNodes[1],
        decoration: InputDecoration(
          prefixIcon: Icon(Icons.email,
            color: _focusNodes[1].hasFocus ? Theme.of(context).accentColor : Colors.grey,
          ),
        ),
      ),
      TextFormField(
        focusNode: _focusNodes[2],
        decoration: InputDecoration(
          prefixIcon: Icon(Icons.email,
            color: _focusNodes[2].hasFocus ? Theme.of(context).accentColor : Colors.grey,
          ),
        ),
      ),
    ],
  );
}
List\u focusNodes=[
FocusNode(),
FocusNode(),
FocusNode(),
FocusNode(),
];
@凌驾
void initState(){
_focusNodes.forEach((节点){
node.addListener((){
setState((){});
});
});
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
TextFormField(
焦点节点:_焦点节点[0],
装饰:输入装饰(
前缀图标:图标(Icons.email,
颜色:_focusNodes[0]。hasFocus?主题。of(上下文)。accentColor:Colors.grey,
),
),
),
TextFormField(
聚焦节点:_聚焦节点[1],
装饰:输入装饰(
前缀图标:图标(Icons.email,
颜色:_focusNodes[1]。hasFocus?主题。of(上下文)。accentColor:Colors.grey,
),
),
),
TextFormField(
聚焦节点:_聚焦节点[2],
装饰:输入装饰(
前缀图标:图标(Icons.email,
颜色:_focusNodes[2]。hasFocus?主题。of(上下文)。accentColor:Colors.grey,
),
),
),
],
);
}

下面的代码将生成
FocusNodes
您需要管理
TextFormFields
的焦点,并在焦点从一个字段切换到另一个字段时执行
setState
。我们只是创建一个焦点节点列表,监听每个节点上的更改,并将它们分配给一个字段:

List<FocusNode> _focusNodes = [
  FocusNode(),
  FocusNode(),
  FocusNode(),
  FocusNode(),
];

@override
void initState() {
  _focusNodes.forEach((node){
    node.addListener(() {
      setState(() {});
    });
  });
  super.initState();
}

@override
Widget build(BuildContext context) {
  return Column(
    children: <Widget>[
      TextFormField(
        focusNode: _focusNodes[0],
        decoration: InputDecoration(
          prefixIcon: Icon(Icons.email,
            color: _focusNodes[0].hasFocus ? Theme.of(context).accentColor : Colors.grey,
          ),
        ),
      ),
      TextFormField(
        focusNode: _focusNodes[1],
        decoration: InputDecoration(
          prefixIcon: Icon(Icons.email,
            color: _focusNodes[1].hasFocus ? Theme.of(context).accentColor : Colors.grey,
          ),
        ),
      ),
      TextFormField(
        focusNode: _focusNodes[2],
        decoration: InputDecoration(
          prefixIcon: Icon(Icons.email,
            color: _focusNodes[2].hasFocus ? Theme.of(context).accentColor : Colors.grey,
          ),
        ),
      ),
    ],
  );
}
List\u focusNodes=[
FocusNode(),
FocusNode(),
FocusNode(),
FocusNode(),
];
@凌驾
void initState(){
_focusNodes.forEach((节点){
node.addListener((){
setState((){});
});
});
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
TextFormField(
焦点节点:_焦点节点[0],
装饰:输入装饰(
前缀图标:图标(Icons.email,
颜色:_focusNodes[0]。hasFocus?主题。of(上下文)。accentColor:Colors.grey,
),
),
),
TextFormField(
聚焦节点:_聚焦节点[1],
装饰:输入装饰(
前缀图标:图标(Icons.email,
颜色:_focusNodes[1]。hasFocus?主题。of(上下文)。accentColor:Colors.grey,
),
),
),
TextFormField(
聚焦节点:_聚焦节点[2],
装饰:输入装饰(
前缀图标:图标(Icons.email,
颜色:_focusNodes[2]。hasFocus?主题。of(上下文)。accentColor:Colors.grey,
),
),
),
],
);
}

如果要在选择textFormField时更改图标颜色,
根据下面的说明进行更改

...
            Theme(
              child: Column(
                children: <Widget>[
                  TextFormField(
                    maxLength: 15,
                    decoration: InputDecoration(
                        labelText: "USER NAME",
                        prefixIcon: Icon(Icons.email,)
                    ),
                    onSaved: (username) => _username = username,
                  ),
                  TextFormField(
                    maxLength: 15,
                    decoration: InputDecoration(
                        labelText: "EMAIL",
                        prefixIcon: Icon(Icons.email,)
                    ),
                    onSaved: (usermail) => _useremail = usermail,
                  ),
                ],
              ),
              data: Theme.of(context)
                  .copyWith(primaryColor: Colors.redAccent,),
            ),
...
。。。
主题(
子:列(
儿童:[
TextFormField(
最大长度:15,
装饰:输入装饰(
labelText:“用户名”,
前缀:图标(Icons.email,)
),
onSaved:(用户名)=>\u用户名=用户名,
),
TextFormField(
最大长度:15,
装饰:输入装饰(
labelText:“电子邮件”,
前缀:图标(Icons.email,)
),
onSaved:(usermail)=>\u useremail=usermail,
),
],
),
数据:主题(上下文)
.copyWith(原色:Colors.redAccent,),
),
...
结论:

使用主题小部件包装所有textFormFields小部件,并将数据设置为高亮显示的颜色。

如果要在选择textFormField时更改图标颜色,
根据下面的说明进行更改

...
            Theme(
              child: Column(
                children: <Widget>[
                  TextFormField(
                    maxLength: 15,
                    decoration: InputDecoration(
                        labelText: "USER NAME",
                        prefixIcon: Icon(Icons.email,)
                    ),
                    onSaved: (username) => _username = username,
                  ),
                  TextFormField(
                    maxLength: 15,
                    decoration: InputDecoration(
                        labelText: "EMAIL",
                        prefixIcon: Icon(Icons.email,)
                    ),
                    onSaved: (usermail) => _useremail = usermail,
                  ),
                ],
              ),
              data: Theme.of(context)
                  .copyWith(primaryColor: Colors.redAccent,),
            ),
...
。。。
主题(
子:列(
儿童:[
TextFormField(
最大长度:15,
装饰:输入装饰(
labelText:“用户名”,
前缀:图标(Icons.email,)
),
onSaved:(用户名)=>\u用户名=用户名,
),
TextFormField(
最大长度:15,
装饰:输入装饰(
labelText:“电子邮件”,
前缀:图标(Icons.email,)
),
onSaved:(usermail)=>\u useremail=usermail,
),
],
),
数据:主题(上下文)
.copyWith(原色:Colors.redAccent,),
),
...
结论:
包扎