如何清除颤振中的下拉按钮

时间:2021-07-07 11:05:33

标签: flutter android-studio drop-down-menu flutter-dropdownbutton

我是flutter的新手,我在flutter中为记录表单创建了一个下拉按钮字段。我的问题是,当我单击记录中的保存时,我现在如何使下拉列表清晰(回到第一个值或没有值),当我单击保存时,它没有重置下拉值(仍然有以前的值)记录)而且当我单击清除按钮时,如何使下拉菜单清晰?谢谢

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;
  String selectExpense;

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

  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 DropdownButtonFormField<String>(
                          value: selectCurrency,
                          hint: Text(getTranslated((context), "currency_hint"),),
                          //controller: currencySelected,
                          //labelText: getTranslated((context), "currency_hint"),
                          //enabled: true,
                          //itemsVisibleInDropdown: 4,
                          //items: currencycategories,
                      onChanged: (salutation) =>
                          setState(() => selectCurrency = salutation),
                      validator: (value) => value == null ? 'Please fill up the drop down' : null,
                      items:
                      ['IDR.', 'MYR', 'USD', 'CNY'].map<DropdownMenuItem<String>>((String value) {
                        return DropdownMenuItem<String>(
                          value: value,
                          child: Text(value),
                        );
                      }).toList(),
                          //flex: 2,
                    ),
                          //value: selectCurrency,
                          //required: false,
                        ),


                        new SizedBox(
                          width: 10.0,
                        ),
                        new Expanded(child:
                        TextFormField(
                          validator: (input) {
                            if (input.isEmpty) return 'Please fill up the text fields';
                          },
                          cursorColor: Colors.grey,
                          controller: amount,
                          decoration: InputDecoration(
                            labelText: getTranslated((context), "amount_text"),
                            labelStyle: TextStyle(
                                fontSize: 18.0, color: Colors.black),
                            hintText: getTranslated((context), "amount_text"),
                            enabledBorder: UnderlineInputBorder(

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

                      ],
                    ),
                    Container(
                      padding: EdgeInsets.only(top: 20.0),
                        child: DropdownButtonFormField <String>(
                          value: selectExpense,
                          hint: Text(getTranslated((context), "category_text"),),
                          //controller: currencySelected,
                          //labelText: getTranslated((context), "currency_hint"),
                          //enabled: true,
                          //itemsVisibleInDropdown: 4,
                          //items: currencycategories,
                          onChanged: (salutation) =>
                              setState(() => selectExpense = salutation),
                          validator: (value) => value == null ? 'Please fill up the drop down' : null,
                          items:
                          ['Food.', 'Social Life', 'Transportation', 'Beauty', 'Household', 'Education', 'Health', 'Gift', 'Other'].map<DropdownMenuItem<String>>((String value) {
                            return DropdownMenuItem<String>(
                              value: value,
                              child: Text(value),
                            );
                          }).toList(),
                          //flex: 2,
                        ),
                      ),
                    SizedBox(height: 20),
                    Container(
                      //padding: EdgeInsets.all(20),
                      child: TextFormField(
                        validator: (input) {
                          if (input.isEmpty) return 'Please fill up the text fields';
                        },
                        cursorColor: Colors.grey,
                        controller: description,
                        maxLines: 2,
                        decoration: InputDecoration(
                          labelText: getTranslated((context), "description_text"),
                          labelStyle: TextStyle(
                              fontSize: 18.0, color: Colors.black),
                          hintText: getTranslated((context), "description_expense"),
                          enabledBorder: UnderlineInputBorder(

                            borderSide: BorderSide(color: secondary),
                          ),
                          focusedBorder: UnderlineInputBorder(
                            borderSide: BorderSide(color: secondary),
                          ),
                        ),
                      ),
                    ),
                    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 = "";
                                      //selectCurrency = "";
                                      //selectExpense = "";

                                  /*
                                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();
                                },
                                child: Text(
                                    getTranslated((context), "clear_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)
                                    ),
                                  ),
                                ),
                              ),
                            )
                          ],
                        )
                    ),
                  ],
                ),
              ),
            ),
          )
        ),
      );
  }

  void clearButton(){
    date.clear();
    amount.clear();
    category.clear();
    description.clear();
    //selectCurrency.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;
}

1 个答案:

答案 0 :(得分:0)

当用户点击保存按钮时,将执行 onPressed 函数,在该函数内部使用 setstate 设置 selectCurrency = null;selectExpense = null;。这将使下拉按钮显示提示而不是旧记录