【发布时间】:2017-08-30 01:39:50
【问题描述】:
我想为文本字段提供一个初始值,然后用一个空值重新绘制它以清除文本。使用 Flutter 的 API 做到这一点的最佳方法是什么?
【问题讨论】:
我想为文本字段提供一个初始值,然后用一个空值重新绘制它以清除文本。使用 Flutter 的 API 做到这一点的最佳方法是什么?
【问题讨论】:
您可以使用TextFormField 代替TextField,并使用initialValue 属性。例如
TextFormField(initialValue: "I am smart")
【讨论】:
(来自邮件列表。我没有想出这个答案。)
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'),
),
],
);
}
}
【讨论】:
您不必在小部件范围内定义单独的变量,只需内联即可:
TextField(
controller: TextEditingController()..text = 'Your initial value',
onChanged: (text) => {},
)
【讨论】:
我在这里看到了很多这样做的方法。但是,我认为这比其他答案更有效或至少简洁。
TextField(
controller: TextEditingController(text: "Initial Text here"),
)
【讨论】:
如果您使用的是 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 属性的文档将初始值设置为text 属性是否是个好主意:设置此属性将通知此TextEditingController 的所有侦听器他们需要更新(它调用 notifyListeners)。出于这个原因,这个值应该只在帧之间设置,例如响应用户操作,而不是在构建、布局或绘制阶段。 (api.flutter.dev/flutter/widgets/TextEditingController/text.html)
这可以使用TextEditingController来实现。
你可以添加一个初始值
TextEditingController _controller = TextEditingController(text: 'initial value');
或
如果您使用的是TextFormField,则那里有一个initialValue 属性。它基本上自动将这个initialValue 提供给小部件。
TextFormField(
initialValue: 'initial value'
)
要清除文本,您可以使用
_controller.clear() 方法。
【讨论】:
controller 和initialValue 对于TextFormField 都为非空
如果您想按照@MRT 在已接受答案的评论中的要求处理多个TextInputs,您可以创建一个函数,该函数采用初始值并返回TextEditingController,如下所示:
initialValue(val) {
return TextEditingController(text: val);
}
然后,将此函数设置为TextInput 的控制器,并在此处提供其初始值,如下所示:
controller: initialValue('Some initial value here....')
您可以对其他 TextInputs 重复此操作。
【讨论】:
TextEdittingController _controller = new TextEdittingController(text: "your Text");
或
@override
void initState() {
super.initState();
_Controller.text = "Your Text";
}
【讨论】:
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...'),
),
);
}
}
【讨论】:
课内
final usernameController = TextEditingController(text: 'bhanuka');
文本字段,
child: new TextField(
controller: usernameController,
...
)
【讨论】:
简单有效的方法
将控制器分配给您的TextFormField 或TextField,在initState 中,您可以像这样将其初始化为初始值
_controller = TextEditingController(text: 'Your initial value');
【讨论】:
您可以执行上述所有操作,但是,如果您希望 API 在加载数据时显示您的数据,它会像个人资料页面一样显示。代码如下:
TextEditingController _nameController = TextEditingController(); // initialize the controller
// when API gets the data, do this:
_nameController.text = response.data.fullName; or _nameController.text = "Apoorv Pandey"
我希望它能清除一切。编码愉快!
【讨论】:
如果您使用 TextEditingController,请将其文本字段设置为所需的值
TextEditingController txtController = TextEditingController()..text = 'Your initial text value';
TextField( controller: txtController ..... )
如果您不使用 TextEditingContller,请直接使用 TextField 小部件中的 initialValue 字段:
TextFormField( initialValue: "Your initial text value" )
【讨论】:
由于没有一个答案提到它,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();
}
}
【讨论】: