如何解决如何在下拉菜单中添加验证器 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 举报,一经查实,本站将立刻删除。