Flutter 如果至少填写了n个TextFormField,如何验证表单并在颤振中检索其值?
我在Flutter 如果至少填写了n个TextFormField,如何验证表单并在颤振中检索其值?,flutter,dart,Flutter,Dart,我在表单中有三个不同的文本表单字段,但只能同时填充其中两个。我想实现的是,当其中两个字段被填充时,另一个字段不应被启用。 他们应该随时了解其他领域的变化 它们下面是一个raised按钮,当满足此条件时应启用该按钮 此外,当按下所述按钮时,我需要对其值进行一些逻辑处理 这就是我现在拥有的: class LPFilterCalculator extends StatefulWidget { @override State<StatefulWidget> createState()
表单
中有三个不同的文本表单字段
,但只能同时填充其中两个。我想实现的是,当其中两个字段被填充时,另一个字段不应被启用。
他们应该随时了解其他领域的变化 它们下面是一个
raised按钮
,当满足此条件时应启用该按钮此外,当按下所述按钮时,我需要对其值进行一些逻辑处理 这就是我现在拥有的:
class LPFilterCalculator extends StatefulWidget {
@override
State<StatefulWidget> createState() => _LPFilterCalculatorState();
}
class _LPFilterCalculatorState extends State<LPFilterCalculator> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: PersistentAppBar("Low Pass Filter").build(context),
drawer: DrawerMenu(),
body: Column(
children: <Widget>[
LowPassInputForm(),
],
),
);
}
}
/// Inputform class for Calculators
class LowPassInputForm extends StatefulWidget {
@override
State<StatefulWidget> createState() => _LowPassInputFormState();
}
class _LowPassInputFormState extends State<LowPassInputForm> {
ValueNotifier<bool> pressed = ValueNotifier(false);
final _formKey = GlobalKey<FormState>();
final resistanceTextController = TextEditingController();
final capacitorTextController = TextEditingController();
final frequencyTextController = TextEditingController();
@override
Widget build(BuildContext context) {
print('state update');
return Form(
onChanged: () => {},
key: _formKey,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: <Widget>[
Column(
children: <Widget>[
TextFormField(
controller: resistanceTextController,
inputFormatters: <TextInputFormatter>[
WhitelistingTextInputFormatter.digitsOnly
],
keyboardType: TextInputType.number,
decoration:
const InputDecoration(hintText: 'Enter resistance value'),
),
TextFormField(
controller: capacitorTextController,
inputFormatters: <TextInputFormatter>[
WhitelistingTextInputFormatter.digitsOnly
],
keyboardType: TextInputType.number,
decoration:
const InputDecoration(hintText: 'Enter capacitor value'),
),
TextFormField(
controller: frequencyTextController,
inputFormatters: <TextInputFormatter>[
WhitelistingTextInputFormatter.digitsOnly
],
keyboardType: TextInputType.number,
decoration: const InputDecoration(
hintText: 'Enter desired cutoff frequency'),
),
RaisedButton(
elevation: 5.0,
onPressed: () {
calculateLowPass();
},
),
],
),
],
),
),
);
}
void calculateLowPass() {
var resistance = resistanceTextController.text;
var capacitor = capacitorTextController.text;
var frequency = frequencyTextController.text;
// do calculations
}
@override
void dispose() {
frequencyTextController.dispose();
super.dispose();
}
}
类LPFilterCalculator扩展StatefulWidget{
@凌驾
状态createState()=>LPFilterCalculatorState();
}
类LPFilterCalculatorState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:PersistentAppBar(“低通过滤器”).build(上下文),
抽屉:抽屉菜单(),
正文:专栏(
儿童:[
LowPassInputForm(),
],
),
);
}
}
///计算器的Inputform类
类LowPassInputForm扩展StatefulWidget{
@凌驾
State createState()=>\u LowPassInputFormState();
}
类_LowPassInputFormState扩展状态{
按下ValueNotifier=ValueNotifier(假);
final _formKey=GlobalKey();
最终电阻TextController=TextEditingController();
最终电容器ExtController=TextEditingController();
最终频率TextController=TextEditingController();
@凌驾
小部件构建(构建上下文){
打印(“状态更新”);
报税表(
一旦更改:()=>{},
键:_formKey,
孩子:填充(
填充:常数边集全部(8.0),
子:列(
儿童:[
纵队(
儿童:[
TextFormField(
控制器:resistanceTextController,
输入格式化程序:[
WhiteListingPutFormatter.digitsOnly
],
键盘类型:TextInputType.number,
装饰:
常量输入装饰(hintText:“输入电阻值”),
),
TextFormField(
控制器:电容器输出控制器,
输入格式化程序:[
WhiteListingPutFormatter.digitsOnly
],
键盘类型:TextInputType.number,
装饰:
常量输入装饰(hintText:“输入电容值”),
),
TextFormField(
控制器:frequencyTextController,
输入格式化程序:[
WhiteListingPutFormatter.digitsOnly
],
键盘类型:TextInputType.number,
装饰:常量输入装饰(
hintText:“输入所需截止频率”),
),
升起的按钮(
标高:5.0,
已按下:(){
calculateLowPass();
},
),
],
),
],
),
),
);
}
void calculateLowPass(){
var电阻=电阻TextController.text;
无功电容器=电容器ExtController.text;
var frequency=frequencyTextController.text;
//计算
}
@凌驾
无效处置(){
frequencyTextController.dispose();
super.dispose();
}
}
您应该注意,我并没有真正使用对象的某些属性和功能,因为我不确定在颤振中哪种方法是正确的或最好的
任何提示都将受到欢迎 您需要使用
TextFormField
上的enabled
属性,并检查其他两个字段是否为空。如果任何字段为空,则启用当前字段
您可以将数据保存在对象
模型中:
class Object {
// for the sake of this example the fields here are strings, but in practice it's better to change them to double
String resistance;
String capacitor;
String frequency;
Object({
this.resistance = '',
this.capacitor = '',
this.frequency = '',
});
}
通过添加对象
实例,您的更新状态如下所示:
class _LowPassInputFormState extends State<LowPassInputForm> {
final _formKey = GlobalKey<FormState>();
final resistanceTextController = TextEditingController();
final capacitorTextController = TextEditingController();
final frequencyTextController = TextEditingController();
Object data = Object();
@override
Widget build(BuildContext context) {
return Form(
onChanged: () => {},
key: _formKey,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: <Widget>[
Column(
children: <Widget>[
TextFormField(
enabled: data.capacitor.isEmpty || data.frequency.isEmpty,
onChanged: (val) => setState(() => data.resistance = val),
controller: resistanceTextController,
inputFormatters: <TextInputFormatter>[
WhitelistingTextInputFormatter.digitsOnly
],
keyboardType: TextInputType.number,
decoration:
const InputDecoration(hintText: 'Enter resistance value'),
),
TextFormField(
enabled: data.resistance.isEmpty || data.frequency.isEmpty,
onChanged: (val) => setState(() => data.capacitor = val),
controller: capacitorTextController,
inputFormatters: <TextInputFormatter>[
WhitelistingTextInputFormatter.digitsOnly
],
keyboardType: TextInputType.number,
decoration:
const InputDecoration(hintText: 'Enter capacitor value'),
),
TextFormField(
enabled: data.resistance.isEmpty || data.capacitor.isEmpty,
onChanged: (val) => setState(() => data.frequency = val),
controller: frequencyTextController,
inputFormatters: <TextInputFormatter>[
WhitelistingTextInputFormatter.digitsOnly
],
keyboardType: TextInputType.number,
decoration: const InputDecoration(
hintText: 'Enter desired cutoff frequency'),
),
RaisedButton(
elevation: 5.0,
onPressed: () {
calculateLowPass();
},
),
],
),
],
),
),
);
}
void calculateLowPass() {
// use data to do calculations
}
}
类_LowPassInputFormState扩展状态{
final _formKey=GlobalKey();
最终电阻TextController=TextEditingController();
最终电容器ExtController=TextEditingController();
最终频率TextController=TextEditingController();
对象数据=对象();
@凌驾
小部件构建(构建上下文){
报税表(
一旦更改:()=>{},
键:_formKey,
孩子:填充(
填充:常数边集全部(8.0),
子:列(
儿童:[
纵队(
儿童:[
TextFormField(
已启用:data.capactor.isEmpty | | data.frequency.isEmpty,
一旦更改:(val)=>setState(()=>data.resistance=val),
控制器:resistanceTextController,
输入格式化程序:[
WhiteListingPutFormatter.digitsOnly
],
键盘类型:TextInputType.number,
装饰:
常量输入装饰(hintText:“输入电阻值”),
),
TextFormField(
已启用:data.resistance.isEmpty | | data.frequency.isEmpty,
一旦更改:(val)=>setState(()=>data.capactor=val),
控制器:电容器输出控制器,
输入格式化程序:[
WhiteListingPutFormatter.digitsOnly
],
键盘类型:TextInputType.number,
装饰:
常量输入装饰(hintText:“输入电容值”),
),
TextFormField(
已启用:data.resistance.isEmpty | | data.capactor.isEmpty,
一旦更改:(val)=>setState(()=>data.frequency=val),