Flutter根据小部件变量的setState设置TextFormField的值



当一个小部件变量在构建小部件后根据setstate操作而不是根据该textformfeild的初始值更改时,我如何从该小部件变量设置TextFormField的值
我知道我可以通过使用TextEditingController来更改它的值,但我有太多的TextFormField,并且通过使用传统的方式创建TextEditingController需要大量的代码,将它们添加到整个小部件中:
1-Createa TextEditingController
2-将TextEditingController连接到文本字段
3-创建一个函数来更新最新的值
4-听取控制器的更改
是否有任何方法可以构建此控制器并仅在TextFormField的代码中执行这些步骤?还是另一种方式?

将控制器放置在中

TextFormField(
controller: TextEditingController(text: daytask),....

然后像这个一样放置setstate() txt='';

setState(() { txt='' }

实现这一点的最佳方法是简单地制作一个小部件。对于这个,这是我将使用的代码

class StateTextField extends StatelessWidget {
final String text;
const StateTextField({Key key, this.text = ''}) : super(key: key);
@override
Widget build(BuildContext context) {
return TextField(
controller: TextEditingController(text: text),
);
}
}

这应该可以完成工作。如果你想通过控制器,你也可以通过它。要使用它,只需在构建方法中调用类即可。

类似于TextFormFieldTextEditingController的示例,可点击suffixIcon用于selectDateshowDatePicker(这是一个标准材料"lambda"对话框(,其中setState使用新日期更新初始设置日期(不是通过initialValue,而是通过controller参数(。

import 'package:flutter/material.dart';
class CreateOrderForm extends StatefulWidget {
const CreateOrderForm({Key? key}):super(key: key);
@override
CreateOrderFormState createState() => CreateOrderFormState();
}
class CreateOrderFormState extends State<CreateOrderForm>
{
final _formKey = GlobalKey<FormState>();
late DateTime selectedDate;

@override
void initState() {
super.initState();
selectedDate = DateTime.now();
print("initState selectedDate = ${selectedDate.toLocal()}");
}
@override
Widget build(BuildContext context) {
print("build prepare selectedDate: ${selectedDate.toLocal()}");
return Form(
key: _formKey,
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(8),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [             
TextFormField(
//initialValue: "${selectedDate.toLocal()}",
controller: TextEditingController(text: "${selectedDate.toLocal()}"),
decoration: InputDecoration(
icon: Icon(Icons.event),
border: OutlineInputBorder(),
labelText: "Assignment Date & Time",
suffixIcon: IconButton(
onPressed: () => _selectDate(context),
icon: Icon(Icons.event))
),
),             
const Padding(padding: EdgeInsets.only(top: 8)),
Align(
alignment: Alignment.bottomRight,
child: ElevatedButton(
onPressed: ((){}),
child: Text("Submit")),
)
],
),
),
)
);
}
_selectDate(BuildContext context) async{
await showDatePicker(
context: context,
initialDate: selectedDate,
firstDate: DateTime(1970),
lastDate: DateTime(9999)
).then((value){
if(value != null && value != selectedDate)
{
this.setState(() {
selectedDate = value;
print("New date ${selectedDate.toLocal()}");
});
}
});
}
}

这样做。

文本字段(controller:TextEditingController(文本:"10"(,样式:TextStyle(font大小:20,),
TextField(
controller: TextEditingController()..text = 'Your initial value',
onChanged: (text) => {},
)

最新更新