我在一个容器中有两个TextField。第一个定义为TextInputType.text
,第二个定义为TextInputType.number
。每当我改变焦点(第一<>第二或第二<>第一)时,失去焦点的TextField
也会失去其价值。
奇怪的是,如果我将两个文本字段都定义为TextInputType.text
,则两个textField都可以工作;如果将其中一个设置为TextInputType.text
以外的任何值,则它们都将失去聚焦时的键入值。
非常烦人。我不知道为什么会这样。
这是Flutter的错误,还是我做错了什么?
这是小部件代码:
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 LoginInput nameField = new LoginInput("Full name", Icons.face, "leading_icon_name", new TextEditingController(), TextInputType.text,false);
final LoginInput birthField = new LoginInput("Birth date", Icons.date_range, "leading_icon_birth", new TextEditingController(), TextInputType.number, false);
答案 0 :(得分:1)
如果您移动
final TextEditingController controller;
在该类之外,每次TextField失去焦点时,不会重置TextField的内容。
将其应用于您的代码:
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),
]);
}
}
答案 1 :(得分:1)
如果您现在正在使用statefulWidget
运行,并且某些内容可以重新呈现您的视图,例如:PageView
或您的逻辑。您应该使用TextEditingController
记住要处理它。
在您的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
},
...
),
}
从现在开始,您可以根据需要从TextField
或_textController.text
函数中触发onChanged
的值。
答案 2 :(得分:0)
我刚刚遇到了同样的问题,解决方案是将我的Widget从Stateless
转换为Stateful
。
最后的评论in this thread可能有助于解决您的问题。