Flutter 颤振-文本字段在焦点输出时失去值
我在一个容器中有两个文本字段。第一个定义为Flutter 颤振-文本字段在焦点输出时失去值,flutter,textfield,Flutter,Textfield,我在一个容器中有两个文本字段。第一个定义为TextInputType.text,第二个定义为TextInputType.number。无论何时更改焦点(FirstSecond或SecondFirst),失去焦点的文本字段也会失去其值 奇怪的是,如果我将两个文本字段都定义为TextInputType.text,如果我将其中一个字段设置为除TextInputType.text以外的任何值,则这两个文本字段都会在焦点输出时丢失键入的值 很烦人。我不知道为什么会这样 这是一只飞虫,还是我做错了什么 这是
TextInputType.text
,第二个定义为TextInputType.number
。无论何时更改焦点(FirstSecond或SecondFirst),失去焦点的文本字段也会失去其值
奇怪的是,如果我将两个文本字段都定义为TextInputType.text
,如果我将其中一个字段设置为除TextInputType.text
以外的任何值,则这两个文本字段都会在焦点输出时丢失键入的值
很烦人。我不知道为什么会这样
这是一只飞虫,还是我做错了什么
这是小部件代码:
class LoginInput extends StatelessWidget {
final String hintText;
final IconData icon;
final String iconTag;
final TextEditingController controller;
final TextInputType inputType;
final bool obscureText;
LoginInput(this.hintText, this.icon, this.iconTag, this.controller,
this.inputType, this.obscureText);
@override
Widget build(BuildContext context) {
return new Column(children: <Widget>[
new Container(
height: 56.0,
child: new Material(
borderRadius: BorderRadius.all(Radius.circular(5.0)),
elevation: 0.0,
color: Colors.white,
child: new Container(
child: new ListTile(
leading: new Hero(
tag: iconTag, child: new Icon(icon, color: Colors.black)),
title: new TextField(
keyboardType: inputType,
obscureText: obscureText,
textInputAction: TextInputAction.send,
controller: controller,
decoration: new InputDecoration(
border: InputBorder.none,
hintText: hintText,
),
style: new TextStyle(
color: Colors.black,
fontSize: 18.0,
fontFamily: 'Caecilia',
fontWeight: FontWeight.w500),
),
)))),
new Divider(height: 0.0, color: Theme.of(context).dividerColor),
]);
}
}
我刚刚遇到了同样的问题,解决方案是将我的小部件从无状态
转换为有状态
最后一条评论可能有助于解决您的问题 如果你移动你的
final TextEditingController controller;
在类外,文本字段的内容不会在每次文本字段失去焦点时重置
将此应用于您的代码:
final TextEditingController controller;
class LoginInput extends StatelessWidget {
final String hintText;
final IconData icon;
final String iconTag;
final TextInputType inputType;
final bool obscureText;
LoginInput(this.hintText, this.icon, this.iconTag, this.inputType, this.obscureText);
@override
Widget build(BuildContext context) {
return new Column(children: <Widget>[
new Container(
height: 56.0,
child: new Material(
borderRadius: BorderRadius.all(Radius.circular(5.0)),
elevation: 0.0,
color: Colors.white,
child: new Container(
child: new ListTile(
leading: new Hero(
tag: iconTag, child: new Icon(icon, color: Colors.black)),
title: new TextField(
keyboardType: inputType,
obscureText: obscureText,
textInputAction: TextInputAction.send,
controller: controller,
decoration: new InputDecoration(
border: InputBorder.none,
hintText: hintText,
),
style: new TextStyle(
color: Colors.black,
fontSize: 18.0,
fontFamily: 'Caecilia',
fontWeight: FontWeight.w500),
),
)))),
new Divider(height: 0.0, color: Theme.of(context).dividerColor),
]);
}
}
最终文本编辑控制器;
类LoginInput扩展了无状态小部件{
最终字符串hintText;
最终的Iconda图标;
最终字符串图标;
最终文本输入类型输入类型;
最终布尔模糊文本;
LoginInput(this.hintText、this.icon、this.iconTag、this.inputType、this.obscureText);
@凌驾
小部件构建(构建上下文){
返回新列(子项:[
新容器(
身高:56.0,
儿童:新材料(
borderRadius:borderRadius.all(半径.圆形(5.0)),
标高:0.0,
颜色:颜色,白色,
子容器:新容器(
孩子:新的ListTile(
主角:新英雄(
标记:iconTag,子:新图标(图标,颜色:Colors.black)),
标题:新文本字段(
键盘类型:输入类型,
蒙蔽文本:蒙蔽文本,
textInputAction:textInputAction.send,
控制器:控制器,
装饰:新的输入装饰(
边框:InputBorder.none,
hintText:hintText,
),
样式:新文本样式(
颜色:颜色,黑色,
字体大小:18.0,
fontFamily:“盲肠”,
fontWeight:fontWeight.w500),
),
)))),
新的分隔符(高度:0.0,颜色:Theme.of(context.dividerColor)),
]);
}
}
如果您现在正在运行一个statefulWidget
,并且某些东西可以重新呈现您的视图,例如:PageView
或您的逻辑。您应该使用textededitingcontroller
记住要处理它
在statefulWidget中
class _MainViewState extends State<_MainView> {
PageController _pageController;
TextEditingController _textController;
@override
void initState() {
_pageController = PageController(keepPage: true, initialPage: 2);
_textController = TextEditingController();
super.initState();
}
@override
void dispose() {
_pageController.dispose();
_textController.dispose();
super.dispose();
}
...
TextField(
controller: _textController, //Add controller to your TextField
onChanged: (v) {
//do something
},
...
),
}
class\u MainViewState扩展状态{
页面控制器_页面控制器;
TextEditingController\u textController;
@凌驾
void initState(){
_pageController=pageController(keepPage:true,initialPage:2);
_textController=TextEditingController();
super.initState();
}
@凌驾
无效处置(){
_pageController.dispose();
_textController.dispose();
super.dispose();
}
...
文本字段(
控制器:\ u textController,//将控制器添加到文本字段
一旦更改:(v){
//做点什么
},
...
),
}
从现在起,您可以从\textController触发TextField
的值。text
或onChanged
函数取决于您的需要。您可以显示您的代码吗?是的,我把它放在问题下方,我将名称字段
和出生字段
放在一列中。调出焦点时,两者都工作正常(保留值)<代码>文本输入操作
字段对我不可用,它不在“谢谢”中!我稍后会试试这个。
class _MainViewState extends State<_MainView> {
PageController _pageController;
TextEditingController _textController;
@override
void initState() {
_pageController = PageController(keepPage: true, initialPage: 2);
_textController = TextEditingController();
super.initState();
}
@override
void dispose() {
_pageController.dispose();
_textController.dispose();
super.dispose();
}
...
TextField(
controller: _textController, //Add controller to your TextField
onChanged: (v) {
//do something
},
...
),
}