我想在用户输入内容时更改文本的颜色。但是只有当用户输入内容时。否则,应保持为灰色。为此,我正在组件内部创建一个Focus节点,并将其分配给textformfield focusNode
属性。在initState
中,我要添加一个侦听器,以便每当我的textformfield获得焦点时,我都可以更改提示文本的颜色以及边框颜色。但这给了我一个错误,我无法更改用户输入文本的颜色。
FocusNode _focusNode = FocusNode();
@override
void initState() {
_focusNode.addListener(() {
setState(() => color = _focusNode.hasFocus ? Colors.blue : Colors.grey);
});
super.initState();
}
@override
void dispose() {
_focusNode.dispose();
super.dispose();
}
我的组件如下:
return Container(
height: MediaQuery.of(context).size.height * 0.06,
child: Material(
elevation: 5.0,
borderRadius: BorderRadius.all(
Radius.circular(30.0),
),
child: TextFormField(
controller: textController,
focusNode: _focusNode,
onTap: _requestFocus,
keyboardType: this.widget.type,
textAlignVertical: TextAlignVertical.bottom,
onChanged: (value) => {
setState(() {
_color = Colors.blue;
})
},
style: TextStyle(
color: color,
fontWeight: FontWeight.w400,
fontSize: 15.0,
),
obscureText: widget.obscureText,
decoration: InputDecoration(
filled: true,
fillColor: Color(0xFFFCFCFC),
hintText: this.widget.hintText,
isDense: true,
contentPadding: EdgeInsets.all(40.0),
hintStyle: TextStyle(
color: _focusNode.hasFocus ? Colors.blue : Colors.grey,
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(50.0),
),
borderSide: const BorderSide(color: Colors.white, width: 0.0),
),
prefixIcon: Icon(
this.widget.icon,
color: Colors.grey,
),
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(50.0)),
borderSide: BorderSide(
color: Colors.blue,
),
),
),
validator: (String value) {
return;
},
),
),
);
我无法确定我在做什么错。
编辑:我已经在initSate
中移动了焦点节点的初始化,并且在onChanged
属性中将setState
中的颜色设置为灰色。但仍然给出错误Failed assertion: line 742 pos 12: 'attached': is not true.
答案 0 :(得分:0)
我通过以下更改解决了该问题:
void _requestFocus() {
setState(() {
FocusScope.of(context).unfocus();
FocusScope.of(context).requestFocus(_focusNode);
});
}
删除onChanged回调,并将蓝色赋予文本字段。 就是这样。