我如何提供一个初始值的文本字段?

我想为文本字段提供一个初始值,并重新绘制一个空值以清除文本。用Flutter的api实现这一点的最佳方法是什么?

257155 次浏览

(来自邮件列表。这个答案不是我想出来的。)

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

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

TextFormField(initialValue: "I am smart")

如果你想处理多个TextEditingController,就像@MRT在被接受答案的注释中要求的那样,你可以创建一个函数,接受一个初始值并像这样返回TextEditingController:

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

然后,将这个函数设置为TextInput的控制器,并在那里提供它的初始值,如下所示:

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

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

如果你正在使用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

内部类,

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

文本框,

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

你不需要在小部件范围内定义一个单独的变量,只需内联即可:

TextField(
controller: TextEditingController()..text = 'Your initial value',
onChanged: (text) => {},
)
TextEdittingController _controller = new TextEdittingController(text: "your Text");

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

这可以使用TextEditingController来实现。

要有一个初始值,你可以加上

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

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

TextFormField(
initialValue: 'initial value'
)

清除您可以使用的文本 _controller.clear()方法。< / p >

我在这里见过很多方法。然而,我认为这比其他答案更有效或至少更简洁。

TextField(
controller: TextEditingController(text: "Initial Text here"),
)
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...'),
),
);
}
}

你可以做以上所有的事情,但如果你想让API在加载时显示你的数据,它会像配置文件页面一样显示。下面是代码:

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

我希望这能澄清一切。编码快乐!

简单高效的方法

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

_controller = TextEditingController(text: 'Your initial value');
  1. 当你在使用TextEditingController

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

TextEditingController txtController = TextEditingController()..text = 'Your initial text value';
TextField( controller: txtController ..... )
  1. 当你没有使用TextEditingController

如果你没有使用texteditingcontroller,直接从TextField小部件使用initialValue字段:

TextFormField( initialValue: "Your initial text value" )

由于没有一个答案提到它,TextEditingController 使用后是否应处理掉. c。如:

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();
}
}

至于上述答案都是正确的,但有一件事是缺失的,我想添加到它是如何自定义TextFormField的默认文本的风格

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输入的变化。

.这是我的个人观点,如果我错了请告诉我

如果使用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>[
TextField(       // First method
initialValue: "Initial text"
),
TextField(       // Second method
controller: _controller, // Controller has the initial 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);
  

}