如何为文本字段提供初始值?


142

我想为文本字段提供一个初始值,并用一个空值重绘它以清除文本。用Flutter的API做到这一点的最佳方法是什么?

Answers:


104

(从邮件列表中。我没有给出这个答案。)

class _FooState extends State<Foo> {
  TextEditingController _controller;

  @override
  void initState() {
    super.initState();
    _controller = new TextEditingController(text: 'Initial value');
  }

  @override
  Widget build(BuildContext context) {
    return new Column(
      children: <Widget>[
        new TextField(
          // The TextField is first built, the controller has some initial text,
          // which the TextField shows. As the user edits, the text property of
          // the controller is updated.
          controller: _controller,
        ),
        new RaisedButton(
          onPressed: () {
            // You can also use the controller to manipuate what is shown in the
            // text field. For example, the clear() method removes all the text
            // from the text field.
            _controller.clear();
          },
          child: new Text('CLEAR'),
        ),
      ],
    );
  }
}

我猜提示服务器具有相同的目的。
dhuma1981 '18

3
只是想知道答案中提到的是哪个邮件列表?
stt106 '18 -10-29

2
以及如何将文本字段值附加/覆盖到初始值中?
stickededoverflow”,

2
另外,请确保将_controller放置在小部件的处置上。由Google推荐。它可以确保在不需要时释放资源。
阿姆里特·帕·辛格

89

您可以使用TextFormField代替TextField,然后使用initialValue属性。例如

TextFormField(initialValue: "I am smart")

2
由于某种原因,我无法将其与动态对象一起使用。最终需要控制器。
S1r-Lanzelot '19

6
这仅在未使用TextFormField指定控制器时有效。docs.flutter.io/flutter/material/TextFormField/...
亚历Fallenstedt

@AlexFallenstedt,当控制器可用时,不需要此属性
Sami Kanafani

我认为这是有风险的,因为在重建小部件树时,您的文本可以替换为初始值。
GökberkYağcı

46

您不必在小部件作用域中定义单独的变量,只需内联即可:

TextField(
  controller: TextEditingController()..text = 'Your initial value',
  onChanged: (text) => {},
)

“ TextEditingController().. text”中的双点代表什么?
李丽

3
@RayLi称为级联运算符。有关信息和示例,请在此处检查stackoverflow.com/questions/53136945/…–
vovahost

1
谢谢!。这是从对象列表动态创建窗口小部件的完美之选:)
davaus19年

这就是我想要的!非常感谢!
TaeJung Shim

1
@vovahost,很遗憾,它缺少处理部分。
克里斯·鲁特科夫斯基

28

如果您使用的是TextEditingController,则将文本设置为它,如下所示

TextEditingController _controller = new TextEditingController();


_controller.text = 'your initial text';

final your_text_name = TextFormField(
      autofocus: false,
      controller: _controller,
      decoration: InputDecoration(
        hintText: 'Hint Value',
      ),
    );

如果您不使用任何TextEditingController,则可以直接使用initialValue,如下所示

final last_name = TextFormField(
      autofocus: false,
      initialValue: 'your initial text',
      decoration: InputDecoration(
        hintText: 'Last Name',
      ),
    );

有关更多参考,请参见TextEditingController


我不确定是否按照text属性文档将初始值设置为属性是否是一个好主意TextEditingController.text:设置此属性将通知此TextEditingController的所有侦听器它们需要更新(它调用notifyListeners)。因此,仅应在帧之间设置此值,例如响应用户操作,而不是在构建,布局或绘制阶段。(api.flutter.dev/flutter/widgets/TextEditingController/text.html
基里尔卡尔马津

15

我在这里看到了许多方法。但是,我认为这比其他答案更有效或更简洁。

TextField(
   controller: TextEditingController(text: "Initial Text here"),
)

7

如果要TextInput按照@MRT在接受的答案的注释中的要求处理多个s,则可以创建一个采用初始值并返回TextEditingController如下所示的函数:

initialValue(val) {
  return TextEditingController(text: val);
}

然后,将此函数设置为的控制器,TextInput并在其中提供其初始值,如下所示:

controller: initialValue('Some initial value here....')

您可以对其他TextInputs 重复此操作。


3

内课

  final usernameController = TextEditingController(text: 'bhanuka');

文本域,

   child: new TextField(
        controller: usernameController,
    ...
)

3
TextEdittingController _controller = new TextEdittingController(text: "your Text");

要么

@override
  void initState() {
    super.initState();
    _Controller.text = "Your Text";
    }

3

可以使用来实现TextEditingController

要具有初始值,您可以添加

TextEditingController _controller = TextEditingController(text: 'initial value');

要么

如果您使用的TextFormFieldinitialValue那里,则有一个属性。这基本上initialValue是自动将其提供给控制器的。

TextEditingController _controller = TextEditingController();
TextFormField(
  controller: _controller,
  initialValue: 'initial value'
)

要清除文本,您可以使用 _controller.clear()方法。


-12

如果您尚未找到答案,也未找到其他答案的朋友,请查看该InputDecoration字段的hintText:

new TextField(
  decoration: new InputDecoration(
    hintText:"My Text String."
  ),
...

提示文本不是初始值。当用户键入内容时,它将消失。初始文本就像为用户预写一些内容。
Arman Ordookhani

这是提示文本,不是值初始化程序
MRT

2
没错,但这对那些来这里寻找提示文本但不知道该怎么称呼的人来说是个好习惯。
ThinkDigital '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.