dart 我只想在flutter应用程序中调用一个窗体进行添加和编辑操作

nx7onnlm  于 2023-01-18  发布在  Flutter
关注(0)|答案(1)|浏览(87)

下面是添加新文档的表单。我想重用并调用相同的表单进行编辑文档操作。对于这两个操作,一个或两个字段可以更改,但我想在“添加”和“编辑”按钮的onPressed()事件上调用相同的表单。我如何实现它?我需要为它设置标志吗?它的场景是什么?

Form buildColumn() {
    return Form(
      key: formKey,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          SizedBox(
            height: 5,
          ),
          // SizedBox(
          //   height: MediaQuery.of(context).size.height * 0.06,
          //   width: MediaQuery.of(context).size.width * 8,
          // child:
          Align(
            alignment: Alignment.topLeft,
            child: SizedBox(
              width: MediaQuery.of(context).size.width * 0.95,
              height: MediaQuery.of(context).size.height * 0.06,
              // height: MediaQuery.of(context).size.height * 0.5,
              child: TextFormField(
                // minLines: 1,
                // maxLines: 5,

                // textCapitalization: TextCapitalization.words,

                // //autovalidateMode: AutovalidateMode.onUserInteraction,
                inputFormatters: [
                  //  LengthLimitingTextInputFormatter(100),
                  FilteringTextInputFormatter.allow(
                      RegExp("[ ',-/ a-z A-Z á-ú Á-Ú 0-9]")),
                ],

                controller: docTitleController,
                style: TextStyle(fontSize: 12),
                // keyboardType: TextInputType.multiline,
                decoration: const InputDecoration(
                    errorStyle: const TextStyle(fontSize: 0.05),
                    border: OutlineInputBorder(
                        borderRadius: BorderRadius.all(
                      Radius.circular(30),
                    )),
                    hintStyle: TextStyle(fontSize: 12),
                    labelStyle: TextStyle(
                      fontSize: 12,
                    ),
                    labelText: 'Document Title',
                    hintText: 'Document title required'),

                // validator: ,
                validator:
                    MultiValidator([RequiredValidator(errorText: 'Required*')]),
              ),
            ),
          ),

          SizedBox(
            height: 20,
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Align(
                alignment: Alignment.topLeft,
                child: SizedBox(
                  height: MediaQuery.of(context).size.height * 0.06,
                  width: MediaQuery.of(context).size.width * 0.4,
                  child: TextFormField(
                    style: TextStyle(
                      fontSize: 12,
                    ),
                    // minLines: 1,
                    // maxLines: 2,
                    inputFormatters: [
                      FilteringTextInputFormatter.digitsOnly,
                      LengthLimitingTextInputFormatter(14)
                    ],
                    // //autovalidateMode: AutovalidateMode.onUserInteraction,
                    controller: tokenNoController,
                    keyboardType: TextInputType.number,
                    decoration: const InputDecoration(
                        errorStyle: const TextStyle(fontSize: 0.05),
                        counterText: "",
                        border: OutlineInputBorder(
                          borderRadius: BorderRadius.all(Radius.circular(30)),
                        ),
                        focusColor: Color.fromARGB(255, 3, 87,
                            156), //Color.fromARGB(255, 253, 153, 33),
                        hintStyle: TextStyle(fontSize: 12),
                        labelStyle: TextStyle(
                          fontSize: 12,
                        ),
                        labelText: 'Token No',
                        hintText: 'Token no required'),
                    validator: (value) {
                      if (value == null || value.isEmpty) {
                        return 'Please enter token No';
                      } else if (value.length < 14) {
                        return 'Please enter 14 digits number';
                      }
                      return null;
                    },
                  ),
                ),
              ),
              SizedBox(
                width: MediaQuery.of(context).size.width * 0.01,
              ),
              Align(
                alignment: Alignment.topLeft,
                child: SizedBox(
                  height: MediaQuery.of(context).size.height * 0.06,
                  width: MediaQuery.of(context).size.width * 0.4,
                  child: TextFormField(
                    style: TextStyle(fontSize: 12),
                    // minLines: 1,
                    // maxLines: 2,
                    //autovalidateMode: AutovalidateMode.onUserInteraction,
                    inputFormatters: [
                      FilteringTextInputFormatter.digitsOnly,
                      LengthLimitingTextInputFormatter(2)
                    ],
                    controller: durationController,
                    keyboardType: TextInputType.number,
                    decoration: const InputDecoration(
                        errorStyle: const TextStyle(fontSize: 0.05),
                        border: OutlineInputBorder(
                            borderRadius:
                                BorderRadius.all(Radius.circular(30))),
                        hintStyle: TextStyle(fontSize: 12),
                        labelStyle: TextStyle(
                          fontSize: 12,
                        ),
                        labelText: 'Duration(M)',
                        hintText: 'Duration required'),
                    validator: MultiValidator(
                      [RequiredValidator(errorText: 'Required*')],
                    ),
                  ),
                ),
              ),
            ],
          ),
          SizedBox(
            height: 20,
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Align(
                alignment: Alignment.topLeft,
                child: SizedBox(
                  height: MediaQuery.of(context).size.height * 0.06,
                  width: MediaQuery.of(context).size.width * 0.4,
                  child: TextFormField(
                    style: TextStyle(fontSize: 12),
                    //  //autovalidateMode: AutovalidateMode.onUserInteraction,
                    //FilteringTextInputFormatter.allow(RegExp("[- 0-9]")),
                    inputFormatters: [
                      FilteringTextInputFormatter.allow(RegExp("[- 0-9]")),
                      LengthLimitingTextInputFormatter(10)
                    ],
                    controller: startDateController,
                    keyboardType: TextInputType.datetime,
                    decoration: const InputDecoration(
                      errorStyle: const TextStyle(fontSize: 0.05),
                      prefixIcon: Icon(Icons.calendar_month),
                      border: OutlineInputBorder(
                          borderRadius: BorderRadius.all(Radius.circular(30))),
                      hintStyle: TextStyle(fontSize: 12),
                      labelStyle: TextStyle(
                        fontSize: 12,
                      ),
                      labelText: 'Start Date',
                      hintText: 'yyyy-MM-dd',
                    ),
                    onTap: () async {
                      DateTime? pickedDate = await showDatePicker(
                        context: context,
                        initialDate: DateTime.now(),
                        firstDate: DateTime(
                            1991), //DateTime.now() - not to allow to choose before today.
                        lastDate: DateTime(2101),
                        // onConfirm:widget.onChanged,
                      ).then((pickedDate) {
                        if (pickedDate != null) {
                          // print(
                          // pickedDate); //pickedDate output format => 2021-03-10 00:00:00.000
                          String formattedDate =
                              DateFormat('yyyy-MM-dd').format(pickedDate);

                          print(formattedDate);

                          setState(() {
                            startDateController.text = formattedDate;
                            //set output date to TextField value.
                          });
                          print(startDateController.text);
                        } else {
                          print("Date is not selected");
                        }
                      });
                      final int dur = int.parse(durationController.text);
                      var stDate = DateTime.parse(startDateController.text);

                      var jiffy = Jiffy(stDate).add(
                        months: dur,
                        days: -1,
                        // days: 1095,
                      );
                      DateTime d = jiffy.dateTime;
                      String s = jiffy.format('yyyy-MM-dd');
                      setState(() {
                        endDateController.text = s.toString();
                      });
                    },

                    validator: MultiValidator(
                        [RequiredValidator(errorText: 'Required*')]),
                  ),
                ),
              ),
              SizedBox(
                width: MediaQuery.of(context).size.width * 0.02,
              ),
              Align(
                alignment: Alignment.topLeft,
                child: SizedBox(
                  height: MediaQuery.of(context).size.height * 0.06,
                  width: MediaQuery.of(context).size.width * 0.4,
                  child: TextFormField(
                    style: TextStyle(fontSize: 12),
                    // maxLength: 8,
                    // //autovalidateMode: AutovalidateMode.onUserInteraction,
                    autofocus: false,
                    controller: endDateController,
                    inputFormatters: [
                      FilteringTextInputFormatter.allow(RegExp("[- 0-9]")),
                      LengthLimitingTextInputFormatter(10)
                    ],
                    keyboardType: TextInputType.datetime,
                    decoration: const InputDecoration(
                        errorStyle: const TextStyle(fontSize: 0.05),
                        // prefixIcon: Icon(Icons.calendar_month),
                        counterText: "",
                        hoverColor: Color.fromARGB(255, 3, 87,
                            156), //Color.fromARGB(255, 253, 153, 33),
                        border: OutlineInputBorder(
                            borderRadius: BorderRadius.all(Radius.circular(30)),
                            borderSide: BorderSide(
                                color: Color.fromARGB(255, 3, 87,
                                    156) //Color.fromARGB(255, 253, 153, 33)
                                )),
                        hintStyle: TextStyle(fontSize: 12),
                        labelStyle: TextStyle(
                          fontSize: 12,
                        ),
                        labelText: 'End Date',
                        hintText: ' yyyy-MM-dd'),
                    onTap: () async {},

                    //   validator: MultiValidator(
                    //       [RequiredValidator(errorText: 'Required*')]),
                  ),
                ),
              ),
            ],
          ),
  
 Row(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: [
              Container(
                  height: 30,
                  width: 150,
                  child: ElevatedButton(
                    onPressed: () {
                     formKey.currentState!.validate();
                     int.parse(docIdController.text).toInt();
                      final String docTitle = docTitleController.text;
                      final int tokenNo =
                          int.parse(tokenNoController.text).toInt();
                   
                      final String duration = durationController.text;
                   
                     
                      final String startDate = startDateController.text;
                      final String endDate = endDateController.text;
                    

                      Navigator.of(context).push(MaterialPageRoute(
                          builder: (BuildContext context) => DocumentPage(
                                this.userName,
                              )));

                      setState(() {
                        _futureDocument = createDocument(
                          docTitle,
                          tokenNo,
                      
                          duration,
                          startDate,
                          endDate,
                         
                        );
                      });
                      // }
                      //}
                    },
                    child: const Text("Save"),
                    style: ButtonStyle(
                        backgroundColor: MaterialStateProperty.all(
                          Color.fromARGB(255, 253, 153, 33),
                          //Color.fromARGB(255, 253, 153, 33)
                        ),
                        shape:
                            MaterialStateProperty.all<RoundedRectangleBorder>(
                          RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(18.0),
                            //side: BorderSide(color: Colors.red)
                          ),
                        )),
                  )),

              // SizedBox(
              //   height: 20,
              // ),
              Container(
                  height: 30,
                  width: 150,
                  child: ElevatedButton(
                    onPressed: () {
                    formKey.currentState!.validate();
                      docTitleController.clear();
                      tokenNoController.clear();

                      
                      durationController.clear();
                      
                      startDateController.clear();
                      endDateController.clear();
                     
                    },
                    child: const Text("Clear"),
                    style: ButtonStyle(
                        backgroundColor: MaterialStateProperty.all(
                          Color.fromARGB(255, 253, 153, 33),
                        ),
                        shape:
                            MaterialStateProperty.all<RoundedRectangleBorder>(
                          RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(18.0),
                            //side: BorderSide(color: Colors.red)
                          ),
                        )),
                  ))
            ],
          ),
        ],
      ),
    );
    //])
    //);
  }

  FutureBuilder<Document> buildFutureBuilder() {
    return FutureBuilder<Document>(
      future: _futureDocument,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return Text(snapshot.data!.docTitle);
        } else if (snapshot.hasError) {
          return Text('${snapshot.error}');
        }

        return const CircularProgressIndicator();
      },
    );
  }
}
yfwxisqw

yfwxisqw1#

Form buildColumn ([bool update]) {
   // send optional bool with build column, in case of null take it as false
}

使用条件更改按钮文本

const Text((update ?? false) ? "Update" : "Save")

按钮点击时

onPressed: () {
if(update ?? false){
     // Update Function
  } else {
     // Create/save function
  }
}

相关问题