【问题标题】:How do I supply an initial value to a text field?如何为文本字段提供初始值?
【发布时间】:2017-08-30 01:39:50
【问题描述】:

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

【问题讨论】:

    标签: flutter dart textfield


    【解决方案1】:

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

    TextFormField(initialValue: "I am smart")
    

    【讨论】:

    • 由于某种原因,我不能将它与动态对象一起使用。最终需要控制器。
    • 这仅在未使用 TextFormField 指定控制器时有效。 docs.flutter.io/flutter/material/TextFormField/…
    • @AlexFallenstedt 当控制器可用时不需要这个属性
    • 我认为这是有风险的,因为在重建小部件树时,您的文本可以替换为初始值。
    【解决方案2】:

    (来自邮件列表。我没有想出这个答案。)

    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'),
            ),
          ],
        );
      }
    }
    

    【讨论】:

    • 我猜提示服务器的目的相同。
    • 只是想知道您在答案中引用了哪个邮件列表?
    • 我们如何将文本字段值附加/覆盖到初始值中?
    • 另外,请务必在小部件的处置上处置 _controller。这是谷歌推荐的。它确保在不需要时释放资源。
    【解决方案3】:

    您不必在小部件范围内定义单独的变量,只需内联即可:

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

    【讨论】:

    • “TextEditingController()..text”中的双点是什么意思?
    • @RayLi 叫做级联算子。有关信息和示例,请点击此处stackoverflow.com/questions/53136945/…
    • 谢谢!。这非常适合从对象列表动态创建小部件:)
    • 这就是我要找的!!非常感谢!
    • @vovahost 很遗憾,它缺少 dispose 部分。
    【解决方案4】:

    我在这里看到了很多这样做的方法。但是,我认为这比其他答案更有效或至少简洁。

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

    【讨论】:

    • 最简单的答案
    • 简短而简单。我喜欢这个答案。谢谢
    • 控制器应该被处理掉!
    • 迈克尔控制器在视图卸载时自动释放
    【解决方案5】:

    如果您使用的是 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

    【讨论】:

    • 我不确定根据TextEditingController.text 属性的文档将初始值设置为text 属性是否是个好主意:设置此属性将通知此TextEditingController 的所有侦听器他们需要更新(它调用 notifyListeners)。出于这个原因,这个值应该只在帧之间设置,例如响应用户操作,而不是在构建、布局或绘制阶段。 (api.flutter.dev/flutter/widgets/TextEditingController/text.html)
    【解决方案6】:

    这可以使用TextEditingController来实现。

    你可以添加一个初始值

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

    如果您使用的是TextFormField,则那里有一个initialValue 属性。它基本上自动将这个initialValue 提供给小部件。

    TextFormField(
      initialValue: 'initial value'
    )
    

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

    【讨论】:

    • 你不能让controllerinitialValue 对于TextFormField 都为非空
    【解决方案7】:

    如果您想按照@MRT 在已接受答案的评论中的要求处理多个TextInputs,您可以创建一个函数,该函数采用初始值并返回TextEditingController,如下所示:

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

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

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

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

    【讨论】:

      【解决方案8】:
      TextEdittingController _controller = new TextEdittingController(text: "your Text");
      

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

      【讨论】:

        【解决方案9】:
        class _YourClassState extends State<YourClass> {
          TextEditingController _controller = TextEditingController();
        
          @override
          void initState() {
            super.initState();
            _controller.text = 'Your message';
          }
        
          @override
          Widget build(BuildContext context) {
            return Container(
              color: Colors.white,
              child: TextFormField(
                controller: _controller,
                decoration: InputDecoration(labelText: 'Send message...'),
              ),
            );
          }
        }
        

        【讨论】:

          【解决方案10】:

          课内

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

          文本字段,

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

          【讨论】:

            【解决方案11】:

            简单有效的方法

            将控制器分配给您的TextFormFieldTextField,在initState 中,您可以像这样将其初始化为初始值

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

            【讨论】:

              【解决方案12】:

              您可以执行上述所有操作,但是,如果您希望 API 在加载数据时显示您的数据,它会像个人资料页面一样显示。代码如下:

              TextEditingController _nameController = TextEditingController(); // initialize the controller
               // when API gets the data, do this:
               _nameController.text = response.data.fullName; or _nameController.text = "Apoorv Pandey"
              

              我希望它能清除一切。编码愉快!

              【讨论】:

              • 这对我有用,但我们可以使用焦点节点还是使用 _initValue 来做到这一点?
              • 我无法理解您的问题,抱歉您能详细说明一下吗?
              • 是的,就像我在名称表单文本字段中使用焦点节点和 _initvalue={ name: ''} 一样,我希望通过从服务器获取名称来预填充我的 _initvalue['name'] ,因此在使用后控制器 我知道了名字,但我想问我们可以不用控制器吗?
              • 根据我的经验,如果没有控制器,您将无法做到这一点,但您可以使用字符串类型的变量并在文本表单字段的装饰内传递标签文本,它将被预填充,当用户点击它会升起来,会是空的
              • 好的,谢谢早些时候我尝试使用 initialValue 并没有成功,但我暂时会使用控制器
              【解决方案13】:
              1. 当您使用 TextEditingController

              如果您使用 TextEditingController,请将其文本字段设置为所需的值

              TextEditingController txtController = TextEditingController()..text = 'Your initial text value'; 
              TextField( controller: txtController ..... ) 
              
              1. 当您不使用 TextEditingController

              如果您不使用 TextEditingContller,请直接使用 TextField 小部件中的 initialValue 字段:

              TextFormField( initialValue: "Your initial text value" )
              

              【讨论】:

                【解决方案14】:

                由于没有一个答案提到它,TextEditingControllershould be disposed off after use。如:

                class MyWidget extends StatefulWidget {
                  const MyWidget({Key? key}) : super(key: key);
                
                  @override
                  MyWidgetState createState() => MyWidgetState();
                }
                
                class MyWidgetState extends State<MyWidget> {
                  final myController = TextEditingController(text: "Initial value");
                
                  @override
                  Widget build(BuildContext context) {
                    return TextField(
                      controller: myController,
                    );
                  }
                
                  @override
                  void dispose() {
                    // dispose it here
                    myController.dispose();
                    super.dispose();
                  }
                }
                

                【讨论】:

                  猜你喜欢
                  • 2019-01-31
                  • 2021-01-08
                  • 2019-09-08
                  • 2023-03-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-05-01
                  • 1970-01-01
                  • 2017-05-25
                  相关资源
                  最近更新 更多