flutter TextFormField向后输入值[抖动]

qpgpyjmq  于 2022-12-05  发布在  Flutter
关注(0)|答案(6)|浏览(196)

如下面的GIF所示,我正在使用的TextFormField正在反向输入值。我已经将TextDirection属性设置为ltr,但它没有改变任何东西。其他TextFormFields似乎没有这个问题。输入的文本正在使用Navigator.pop发送回另一个屏幕,并且它是以相同的反向人工发送的。
Weird TextFormField
导致问题的textFormField的代码:

TextFormField(
// validator: (String value) {
// return value.isEmpty ? "task must have a name" : null;
// },
    textDirection: TextDirection.ltr,
    maxLength: 100,
    controller: newcontroller, // Just an ordinary TextController
    onChanged: (value) {
        setState(() {
            newcontroller.text = value;
        });
    },
    decoration: InputDecoration(
        errorText: _validate  // Just a boolean value set to false by default
                   ? 'Value Can\'t Be Empty' : null,
        labelText: "name of task"
    ),
    style: TextStyle(height: 1.2, fontSize: 20, color: Colors.black87)
)
r55awzrz

r55awzrz1#

当调用onChanged时,您不必在newcontroller.text中设置文本。在您的TextFormField中输入的文本在默认情况下被分配给newcontroller
您得到这个错误是因为对于这段代码,

因此,请尝试删除以下代码

setState(() {
            newcontroller.text = value;
        });
ldxq2e6h

ldxq2e6h2#

您可以在**Navigator.pop(context,您要传递任何内容)**中发送任何内容

TextFormField(
//                        validator: (String value) {
//                          return value.isEmpty ? "task must have a name" : null;
//                        },
                textAlign: TextAlign.end,
                maxLength: 100,
                controller: newcontroller, // Just an ordinary TextController
                onChanged: (value) {
                  print(value);
                },

                decoration: InputDecoration(
                    errorText:
                        _validate // Just a boolean value set to false by default
                            ? 'Value Can\'t Be Empty'
                            : null,
                    labelText: "name of task"),
                style:
                    TextStyle(height: 1.2, fontSize: 20, color: Colors.black87),
              ),
              MaterialButton(
                onPressed: () {
                  Navigator.pop(context, newcontroller.text);
                },
                child: Text("GO BACK!"),
              ),
myss37ts

myss37ts3#

更改替换为编辑完成

onEditingComplete: (value) {
            newController.text = value;
            FocusScope.of(context).unfocus(); //use this to dismiss the screen keyboard
        }
7xzttuei

7xzttuei4#

只要移除onChanged函数就可以了,没有必要。

wb1gzix0

wb1gzix05#

onChanged: (val) {
              if (val.isNotEmpty) {
                setState(() {
        // remember to not add your controller value in onchanged 
                  _messageController.text = val;
                  isShowSendButton = true;
                });
              } else {
                setState(() {
        // remember to not add your controller value in onchanged 
                  _messageController.text = val;
                  isShowSendButton = false;
                });
              }
bis0qfac

bis0qfac6#

不幸的是,onEditingComplete并不总是触发(例如,在焦点更改时),因此,如果您正在编辑文本变量,您仍然可以使用onChanged作为更新更改的最可靠方式,但不应使用onChanged value参数,也不应使用setState(这会导致反转文本)。

TextEditingController tec = TextEditingController(text: myText);
        return TextField(
          controller: tec,
          onChanged: (value) {
            myText = tec.text;
          },
        );

相关问题