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
     },
     ...
  ),

}