onSaved не сохраняет мои значения в основном классе, откуда я вызываю этот класс
Я хочу сгенерировать пользовательскую форму в соответствии с возвращаемыми данными API и связать данные в форме, а затем она должна быть подтверждена при вызове validate в флаттере
Я создал настраиваемое текстовое поле для создания поля формы
из основного класса. Я использую listview с циклом for для генерации списка, а затем моя форма будет проверять
class CustomTextField extends StatefulWidget {
CustomTextField(
{@required this.focusNode,
@required this.nextFocusNode,
@required this.textEditingController,
@required this.validator,
@required this.labelText,
@required this.dataText});
final FocusNode focusNode;
final FocusNode nextFocusNode;
final TextEditingController textEditingController;
final FormFieldValidator<String> validator;
final String labelText;
String dataText;
@override
_CustomTextFieldState createState() => new _CustomTextFieldState();
}
class _CustomTextFieldState extends State<CustomTextField> {
@override
Widget build(BuildContext context) {
return Container(
height: 65,
child: new TextFormField(
style: Utility.textFormFieldStyle(context),
keyboardType: TextInputType.text,
textInputAction: widget.nextFocusNode == null
? TextInputAction.done
: TextInputAction.next,
focusNode: widget.focusNode,
onFieldSubmitted: (v) {
FocusScope.of(context).requestFocus(widget.nextFocusNode);
},
decoration: InputDecoration(
labelText: widget.labelText,
contentPadding: Utility.edgeInsetsGeometry()),
controller: widget.textEditingController,
validator: widget.validator,
onSaved: (String val) {
widget.dataText = val;
// not saving my value in my main class
print("costom text view ${widget.dataText}");
}));
}
}
/// main class ----- belo code is run from a stateful class ----------------------///
List<FocusNode> listFocusNode;
List<String> listDataText;
List<TextEditingController> listTextEditingController;
List<Widget> listFormField;
@override
void initState() {
super.initState();
listFocusNode = <FocusNode>[];
listTextEditingController = <TextEditingController>[];
listFormField = <Widget>[];
listDataText = <String>[];
for (int i = 0; i < 5; i++) {
listFocusNode.add(FocusNode());
}
for (int i = 0; i < 5; i++) {
listDataText.add("old");
}
for (int i = 0; i < 5; i++) {
listTextEditingController.add(TextEditingController());
}
for (int i = 0; i < 5; i++) {
listFormField.add(CustomTextField(
dataText: listDataText[i],
focusNode: listFocusNode[i],
labelText: "field$i",
textEditingController: listTextEditingController[i],
nextFocusNode: i == 4 ? null : listFocusNode[i + 1],
// validator: validateNull,
validator: validateName,
));
}
}
_validateForm() {
if (_key.currentState.validate()) {
// No any error in validation
_key.currentState.save();
print("Name ${listDataText.toString()}");
// when i print this data in log its printing old data only but onSaved should save value to the proper location in array list
Navigator.of(context).pop();
} else {
setState(() {
_validate = true;
});
}
}