【发布时间】:2019-04-30 19:43:56
【问题描述】:
我在我的应用程序中使用文本字段来编写 cmets,当用户键入文本并按下按钮时,应将文本写入数据库。但是,我有一个问题,即当我编写文本然后按完成或从键盘返回时,文本消失然后没有要添加的评论。即使在按下完成或返回后,是否有任何想法将文本的值保存在文本字段中?
【问题讨论】:
-
使用
TextEditingController并记住在构建方法以外的地方初始化它。
我在我的应用程序中使用文本字段来编写 cmets,当用户键入文本并按下按钮时,应将文本写入数据库。但是,我有一个问题,即当我编写文本然后按完成或从键盘返回时,文本消失然后没有要添加的评论。即使在按下完成或返回后,是否有任何想法将文本的值保存在文本字段中?
【问题讨论】:
TextEditingController 并记住在构建方法以外的地方初始化它。
不确定为什么您的输入会消失,但您可以使用 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);
},
),
),
),
);
}
}
【讨论】:
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 变量作为键值传递。
【讨论】:
尝试在 InputDecoration 中修改 contentPadding。例如:
contentPadding: EdgeInsets.symmetric(horizontal: 2, vertical: 0)
【讨论】:
这个问题发生是因为 TextEditingController 在您添加文本后重建。对我来说,我使用静态控制器来解决这个问题。
static TextEditingController textController = TextEditingController();
我强烈推荐阅读this
【讨论】:
对应的 Flutter 错误报告为#29542: "Text getting cleared when using TextEditingController AND StreamBuilder"。
那里,用户bizz84 commented,问:
所以它与
StatefulWidget一起工作的原因是即使在重建过程中也会保留状态,所以我可以用它来保存我的TextEditingControllers。这对吗?
正是:-)
一般来说,不要在 StatelessWidget/InheritedWIdget 中创建除了原语之外的任何东西。对于其他一切,你需要一个状态
所以,这似乎是官方的回答:如果您创建的不是原语,您将需要一个状态。
【讨论】: