Я новичок во Flutter и Dart, поэтому я представляю себя, пытаясь создать базовую систему регистрации студентов с именем, фамилией и студенческим билетом. Моя проблема заключается в том, что когда я пытаюсь отправить форму, я создаю объект студента, свойства onSaved: в каждом из полей затем добавляют данные к объектам, а затем данные об объектах будут распечатаны в консоль.
class _MyAppState extends State<MyApp> {
bool checkBoxValue = false;
String _firstName;
String _lastName;
int _id;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
void validateAndSave() {
final FormState form = _formKey.currentState;
if (form.validate()){
print("Form is valid");
Student student = new Student(_id, _firstName, _lastName);
print("First Name: ${student.firstName}");
print("Last Name: ${student.lastName}");
print("Student ID: ${student.id}");
} else {
print("Form is invalid");
}
}
@override
Widget build(BuildContext context){
return MaterialApp(
title: 'Student Registrar',
home: Scaffold(
appBar: AppBar(
title: Text('Student Registrar')
),
body: Padding(
padding: EdgeInsets.all(10),
child: Form(
key: _formKey,
child: Column(
children: <Widget>[
new Flexible(
child: TextFormField(
decoration: InputDecoration(
labelText: 'First Name'
),
onSaved: (value) => _firstName = value,
validator: (value) => value.isEmpty ? 'Student must have first name' : null
)
),
new Flexible(
child: TextFormField(
decoration: InputDecoration(
labelText: 'Last Name'
),
onSaved: (value) => _lastName = value,
validator: (value) => value.isEmpty ? 'Student must have last name' : null
)
),
new Flexible(
child: AbsorbPointer(
absorbing: checkBoxValue,
child: TextFormField(
decoration: InputDecoration(
labelText: 'ID',
),
onSaved: (value) => _id = int.parse(value),
validator: (value) => value.contains(new RegExp(r'[^0-9]')) ? 'Student ID can only be an integer' : null
),
)
),
new Flexible(
child: Row(
children: <Widget>[
Text('Generate ID'),
new Flexible(
child: Checkbox(
value: checkBoxValue,
onChanged: (bool value) {
setState(() {
checkBoxValue = value;
});
}
)
)
]
)
),
new Flexible(
child: ElevatedButton(
child: Text(
'Add Student'
),
onPressed: validateAndSave
)
)
]
),
)
)
)
);
}
}
Это мой студенческий класс:
class Student {
int id;
String firstName;
String lastName;
Student(id, firstName, lastName);
}
Это мой вывод: (я нажал кнопку «Отправить» 3 раза на случай, если это могло быть проблемой, когда validateAndSave() не работает синхронно после функций onSaved).
I/flutter ( 641): Form is valid
I/flutter ( 641): First Name: null
I/flutter ( 641): Last Name: null
I/flutter ( 641): Student ID: null
I/flutter ( 641): Form is valid
I/flutter ( 641): First Name: null
I/flutter ( 641): Last Name: null
I/flutter ( 641): Student ID: null
I/flutter ( 641): Form is valid
I/flutter ( 641): First Name: null
I/flutter ( 641): Last Name: null
До сих пор я пытался сделать переменные _firstName, _lastName и _id в _MyAppState общедоступными, просто удалив подчеркивание перед их именами, но это не внесло изменений.
class Student {
int id;
String firstName;
String lastName;
Student({this.id, this.firstName, this.lastName});
}
Вы должны использовать этот параметр
и ваша функция сохранения
void save() {
Student student = new Student(id: 1, firstName: "s", lastName: "b");
}