我想为文本字段提供初始值,并使用空值重新绘制它以清除文本。使用 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
来实现。
要获得初始值,您可以添加
TextEditingController _controller = TextEditingController(text: 'initial value');
或
如果您使用
TextFormField
,则那里有 initialValue
属性。它基本上会自动向小部件提供此 initialValue
。
TextFormField(
initialValue: 'initial value'
)
要清除文本,您可以使用
_controller.clear()
方法。
如果您想按照@MRT在已接受答案的注释中的要求处理多个
TextInput
,您可以创建一个采用初始值并返回TextEditingController
的函数,如下所示:
initialValue(val) {
return TextEditingController(text: val);
}
然后,将此函数设置为
TextInput
的控制器,并在那里提供其初始值,如下所示:
controller: initialValue('Some initial value here....')
您可以对其他
TextInput
重复此操作。
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...'),
),
);
}
}
TextEdittingController _controller = new TextEdittingController(text: "your Text");
或
@override
void initState() {
super.initState();
_Controller.text = "Your Text";
}
课堂上,
final usernameController = TextEditingController(text: 'bhanuka');
文本字段,
child: new TextField(
controller: usernameController,
...
)
简单有效的方法
将控制器分配给您的
TextFormField
或TextField
,然后在initState
中您可以将其初始化为初始值,如下所示
_controller = TextEditingController(text: 'Your initial value');
由于没有一个答案提到它,因此
TextEditingController
应在使用后丢弃。如:
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();
}
}
如果您使用
TextEditingController
,只需在课堂上使用该线路即可。
TextEditingController txtController = TextEditingController(text: 'Initial value')
TextField(
controller: txtController,
);
如果您不使用
TextEditingController
,请使用initialValue
TextFormField(
initialValue: 'your initial text',
);
完整代码
class _TestScreen extends State<Test> {
TextEditingController _controller;
@override
void initState() {
super.initState();
_controller = new TextEditingController(text: 'Initial value');
}
@override
Widget build(BuildContext context) {
return new Column(
children: <Widget>[
TextFormField( // First method
initialValue: "Initial text"
),
TextField( // Second method
controller: _controller, // Controller has the initial value
),
],
);
}
}
如果您使用 TextEditingController,请将其文本字段设置为所需的值
TextEditingController txtController = TextEditingController()..text = 'Your initial text value';
TextField( controller: txtController ..... )
如果您不使用 TextEditingContller,请直接使用 TextField 小部件中的初始值字段:
TextFormField( initialValue: "Your initial text value" )
如果您使用文本表单字段并将数据从上一页传递到下一页文本表单字段,请使用此
class ProfilePage extends StatefulWidget {
late final String fname;
ProfilePage({required this.fname});
@override
State<ProfilePage> createState() => _ProfilePageState();
}
class _ProfilePageState extends State<ProfilePage> {
final _form = GlobalKey<FormState>();
late var FullNameController = TextEditingController(text: widget.fname);
}
至于上述答案都是正确的,但我想补充的一件事是如何自定义 TextFormField 默认文本的style。
TextEditingController textController = TextEditingController(text: '4');
TextFormField(
controller: textController,
// This style property will customize the default controller text
style: TextStyle(
color: Colors.white,
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
对于这种场景,我更愿意使用TextEditingController而不是initialValue,因为如果你想稍后更改它或修改它,那么textController将不断监听你的TextFormField输入更改。 这是我个人的观点,如有错误请指出。
您可以使用此代码示例:
TextFormField(
controller: nameController?..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"
我希望它能清除一切。快乐编码!
最好的方法是将
TextField
替换为 TextFormField
,因为我们可以使用属性 initialValue
并避免管理状态的复杂性。
使用
TextEditingController
并不是最佳选择,因为它需要重新创建 TextEditingController
的实例才能传递初始值。另外,如果您需要自定义更多内容并需要访问其他地方的文本控制器,您该如何处理?会很混乱
final TextEditingController _textFieldController = TextEditingController();
@override
void initState() {
_textFieldController.text = "Hello";
super.initState();
}