微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在下拉菜单中添加验证器 Influtter

如何解决如何在下拉菜单中添加验证器 Influtter

我是Flutter的新手,我在记录字段中使用下拉菜单,但我想如果用户没有填写下拉菜单并且用户单击保存按钮,它将显示“请填写下拉菜单下来”,但在代码中,我试图添加“验证器”,但它显示“未定义命名参数‘验证器’。”。谁能知道如何解决这个问题?请帮忙。谢谢

String selectExpense;

class RecordExpense extends StatefulWidget {
  @override
  _RecordExpenseState createState() => _RecordExpenseState();
}

class _RecordExpenseState extends State<RecordExpense> {
  //DatabaseReference _ref;
  final date = TextEditingController();
  final currency = TextEditingController();
  final category = TextEditingController();
  final amount = TextEditingController();
  final description = TextEditingController();
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final databaseReference = FirebaseFirestore.instance;
  GlobalKey<FormState> _formKey = GlobalKey<FormState>();

  String _email,_password;

  Future<String> getCurrentUID() async {
    Future.value(FirebaseAuth.instance.currentUser);
    //return uid;
  }

  @override

  String selectCurrency;

  final expenseSelected = TextEditingController();
  final currencySelected = TextEditingController();



  List <String> expensecategories = [
    "Food","Social Life","Transportation","Beauty","Household","Education","Health","Gift","Other"
  ];

  List <String> currencycategories = [
    "IDR","MYR","USD","CNY"
  ];


  DateTime _selectedDate;

  void initState(){
    //_ref = FirebaseDatabase.instance.reference().child('Transaction');
  }

  Widget build(BuildContext context) {
    //FirebaseFirestore firestore = FirebaseFirestore.instance;
    //CollectionReference collect= firestore.collection("TransactionExpense");


    final FirebaseAuth _auth = FirebaseAuth.instance;
    final User user =_auth.currentUser;
    final uid = user.uid;


    String dates;
    String amounts;
    String selectExpenses;
    String descriptions;
    return new Form(
      child: SingleChildScrollView(
        child: Padding(
          padding: EdgeInsets.all(20.0),child: Container(
            child: Form(
              key: _formKey,child: Column(
                  mainAxisAlignment: MainAxisAlignment.start,children: <Widget>[
                    Container(
                      child: TextFormField(
                        validator: (input) {
                          if (input.isEmpty) return 'Please fill up the text fields';
                        },cursorColor: Colors.grey,controller: date,onTap: () {
                          _selectDate(context);
                        },decoration: Inputdecoration(
                          labelText: getTranslated((context),"date_text"),labelStyle: TextStyle(
                              fontSize: 18.0,color: Colors.black),hintText: getTranslated((context),"date_hint"),enabledBorder: UnderlineInputBorder(

                            borderSide: BorderSide(color: secondary),),focusedBorder: UnderlineInputBorder(
                            borderSide: BorderSide(color: secondary),SizedBox(height: 20),Row(
                      children: <Widget> [
                        new Expanded(child: new DropDownField(
                          controller: currencySelected,labelText: getTranslated((context),"currency_hint"),enabled: true,itemsVisibleInDropdown: 4,items: currencycategories,onValueChanged: (dynamic value) {
                            selectCurrency = value;
                          },value: selectCurrency,required: false,flex: 2,new SizedBox(
                          width: 10.0,new Expanded(child:
                        TextFormField(
                          validator: (input) {
                            if (input.isEmpty) return 'Please fill up the text fields';
                          },controller: amount,decoration: Inputdecoration(
                            labelText: getTranslated((context),"amount_text"),labelStyle: TextStyle(
                                fontSize: 18.0,enabledBorder: UnderlineInputBorder(

                              borderSide: BorderSide(color: secondary),focusedBorder: UnderlineInputBorder(
                              borderSide: BorderSide(color: secondary),keyboardType: TextInputType.number,)

                      ],Container(
                      padding: EdgeInsets.only(top: 20.0),child: Container(
                        decoration: Boxdecoration(
                          border: Border.all(color: secondary),borderRadius: BorderRadius.circular(15.0),child: DropDownField(
                          controller: expenseSelected,"category_hint"),"category_text"),items: expensecategories,onValueChanged: (dynamic value) {
                            selectExpense = value;
                          },value: selectExpense,Container(
                      //padding: EdgeInsets.all(20),child: TextFormField(
                        validator: (input) {
                          if (input.isEmpty) return 'Please fill up the text fields';
                        },controller: description,maxLines: 2,"description_text"),"description_expense"),Container(
                        padding: EdgeInsets.only(
                            top: 25.0,left: 20.0,right: 20.0),child: Row(
                          mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
                            Expanded(
                              child: ElevatedButton(

                                onpressed: () async {
                                  if(!_formKey.currentState.validate()){
                                    return;
                                  }
                                  _formKey.currentState.save();
                                  await FirebaseFirestore.instance.collection('users').doc(userID).collection('TransactionExpense').add({
                                        'date': date.text,'currency': selectCurrency,'amount': amount.text,'category': selectExpense,'description': description.text,});
                                      date.text = "";
                                      amount.text = "";
                                      description.text = "";


                                  /*
                                UserCredential _user =
                                    await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email,password: _password);
                                String _uid = _user.user.uid;

                                 */

                                  //await FirebaseFirestore.instance.collection('TransactionExpense').doc(_uid).set({

/*
                            final FirebaseAuth _auth = FirebaseAuth
                                .instance;
                            final User user = _auth.currentUser;
                            final uid = user.uid;

                            await DatabaseService().updateData(
                                uid,date.text,amount.text,selectExpense,description.text);
                            Navigator.pop(context);
                            */
                                },child: Text(
                                    getTranslated((context),"save_button").toupperCase(),style: TextStyle(
                                  fontSize: 14,)),style: ButtonStyle(
                                  padding: MaterialStateProperty.all<
                                      EdgeInsets>(EdgeInsets.all(15)),foregroundColor: MaterialStateProperty
                                      .all<Color>(Colors.white),backgroundColor: MaterialStateProperty
                                      .all<Color>(Colors.pink),shape: MaterialStateProperty.all<
                                      RoundedRectangleBorder>(
                                    RoundedRectangleBorder(
                                        borderRadius: BorderRadius.circular(
                                            15.0),side: BorderSide(color: secondary)
                                    ),SizedBox(width: 20,height: 10),Expanded(
                              child: ElevatedButton(
                                onpressed: () {
                                  clearButton();
                                },"clear_button").toupperCase(),style: TextStyle(
                                    fontSize: 14
                                )),)
                          ],)
                    ),],)
        ),);
  }

  void clearButton(){
    date.clear();
    amount.clear();
    category.clear();
    description.clear();
  }
  _selectDate(BuildContext context) async {
    DateTime newSelectedDate = await showDatePicker(
        context: context,initialDate: _selectedDate != null ? _selectedDate : DateTime.Now(),firstDate: DateTime(2000),lastDate: DateTime(2040),builder: (BuildContext context,Widget child) {
          return Theme(
            data: ThemeData.dark().copyWith(
              colorScheme: ColorScheme.dark(
                primary: secondary,onPrimary: Colors.black,surface: primary,onSurface: Colors.white,dialogBackgroundColor: Colors.black,child: child,);
        });

    if (newSelectedDate != null) {
      _selectedDate = newSelectedDate;
      date
        ..text = DateFormat.yMMMd().format(_selectedDate)
        ..selection = TextSelection.fromPosition(TextPosition(
            offset: date.text.length,affinity: TextAffinity.upstream));
    }
  }
}
class AlwaysdisabledFocusNode extends FocusNode {
  @override
  bool get hasFocus => false;
}

解决方法

validator 参数仅在 FormField 类上可用,这些类在 Flutter sdk 中以 FormForm Field 结尾。

要使其正常工作,您应该将 DropDownButton 替换为 DropDownButtonFormField 小部件以访问验证器。

查看docs了解更多信息

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。