【问题标题】:disappear of the text written in the text field after pressing done按下完成后在文本字段中写入的文本消失
【发布时间】:2019-04-30 19:43:56
【问题描述】:

我在我的应用程序中使用文本字段来编写 cmets,当用户键入文本并按下按钮时,应将文本写入数据库。但是,我有一个问题,即当我编写文本然后按完成或从键盘返回时,文本消失然后没有要添加的评论。即使在按下完成或返回后,是否有任何想法将文本的值保存在文本字段中?

【问题讨论】:

  • 使用TextEditingController 并记住在构建方法以外的地方初始化它。

标签: flutter textfield


【解决方案1】:

不确定为什么您的输入会消失,但您可以使用 TextEditingController 并将该控制器传递给 TextField。 然后使用controller.text 访问TextField 的值。

这是一个小例子

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  String databaseText;
  TextEditingController controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: TextField(
            controller: controller,
            onEditingComplete: () {
              databaseText = controller.text;
              print(databaseText);
            },
          ),
        ),
      ),
    );
  }
}

【讨论】:

    【解决方案2】:
    String _text;
    final formKey = GlobalKey<FormState>();
    
    Form(
        key: formKey,
        child: Column(children: <Widget>[
          TextFormField(
            autocorrect: false,
            decoration: InputDecoration(labelText: "Text:"),
            onSaved: (str) => _text = str,
          )
        ]));
    

    然后只需将参数中的 _text 变量作为键值传递。

    【讨论】:

      【解决方案3】:

      尝试在 InputDecoration 中修改 contentPadding。例如:

      contentPadding: EdgeInsets.symmetric(horizontal: 2, vertical: 0)
      

      【讨论】:

        【解决方案4】:

        这个问题发生是因为 TextEditingController 在您添加文本后重建。对我来说,我使用静态控制器来解决这个问题。

          static TextEditingController textController = TextEditingController();
        

        我强烈推荐阅读this

        【讨论】:

          【解决方案5】:

          对应的 Flutter 错误报告为#29542: "Text getting cleared when using TextEditingController AND StreamBuilder"

          那里,用户bizz84 commented,问:

          所以它与StatefulWidget 一起工作的原因是即使在重建过程中也会保留状态,所以我可以用它来保存我的TextEditingControllers。

          这对吗?

          还有rrousselGit replied:

          正是:-)

          一般来说,不要在 StatelessWidget/InheritedWIdget 中创建除了原语之外的任何东西。对于其他一切,你需要一个状态

          所以,这似乎是官方的回答:如果您创建的不是原语,您将需要一个状态。

          【讨论】:

            猜你喜欢
            • 2022-09-27
            • 2019-07-25
            • 1970-01-01
            • 2020-12-04
            • 1970-01-01
            • 2020-06-21
            • 2014-08-20
            • 2017-02-08
            • 1970-01-01
            相关资源
            最近更新 更多