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),