Я использую один и тот же виджет с сохранением состояния в 2 разных представлениях. Он использует список TextEditingController
, который я отправляю в качестве делегата через
, это список TextControllers:
var textfieldControllersEx = [
TextEditingController(),
TextEditingController(),
TextEditingController(),
TextEditingController(),
];
Извлеченный виджет используется дважды в 2 разных представлениях:
ExpiryDateTextField(
controllers: textfieldControllersEx,
onChangeF: (String value, int i) {
setState(() {
_addValuesToAr(value, i);
});
},
),
при каждом просмотре я вызываю удаление и удаление в функции ExpiryDateTextField
, а также распечатку, чтобы увидеть, удаляется ли это:
Он даже не вызывает удаление на либо страницы
@override
void dispose() {
Print.yellow('DISPOSED');
textfieldControllersEx[0].dispose();
textfieldControllersEx[1].dispose();
textfieldControllersEx[2].dispose();
textfieldControllersEx[3].dispose();
textfieldControllersEx[0].text = null;
textfieldControllersEx[1].text = null;
textfieldControllersEx[2].text = null;
textfieldControllersEx[3].text = null;
// TODO: implement dispose
super.dispose();
}
это функция:
var focusNodes = [
FocusNode(),
FocusNode(),
FocusNode(),
FocusNode(),
];
class ExpiryDateTextField extends StatefulWidget {
final List<TextEditingController> controllers;
final Function onChangeF;
ExpiryDateTextField({this.controllers, this.onChangeF});
@override
_ExpiryDateTextFieldState createState() => _ExpiryDateTextFieldState();
}
class _ExpiryDateTextFieldState extends State<ExpiryDateTextField> {
@override
void dispose() {
// TODO: implement dispose
super.dispose();
}
@override
Widget build(BuildContext context) {
bool onSwitchChanged(value, context, index) {
// print(index++);
if (index == 4) {
//if it is on the last text box, do nothing
} else {
if (widget.controllers[index].text.length > 0) {
index++;
FocusScope.of(context).requestFocus(focusNodes[index]);
widget.controllers[index].selection = TextSelection(
baseOffset: 0,
extentOffset: widget.controllers[index].text.length
);
// FocusScope.of(context).focus
}
}
return true;
}
return Row(
children: <Widget>[
Expanded(
flex: 1,
child: SingleDigitTextField(
onChangedF: (value) {
widget.onChangeF(value, 0);
print(this.toString(minLevel: DiagnosticLevel.debug));
onSwitchChanged(value, context, 0);
},
fNode: focusNodes[0],
cController: widget.controllers[0]
),
),
Expanded(
flex: 1,
child: SingleDigitTextField(
onChangedF: (value) {
widget.onChangeF(value, 1);
onSwitchChanged(value, context, 1);
},
fNode: focusNodes[1],
cController: widget.controllers[1]
),
),
Expanded(
flex: 1,
child: Text("/",
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.display2
),
),
Expanded(
flex: 1,
child: SingleDigitTextField(
onChangedF: (value) {
widget.onChangeF(value, 2);
onSwitchChanged(value, context, 2);
},
fNode: focusNodes[2],
cController: widget.controllers[2]
),
),
Expanded(
flex: 1,
child: SingleDigitTextField(
onChangedF: (value) {
widget.onChangeF(value, 3);
onSwitchChanged(value, context, 3);
},
fNode: focusNodes[3],
cController: widget.controllers[3]
),
),
],
);
}
}
это ошибка с указанием:
I / флаттер (24293): еще одно исключение Брошенный: зависимостьOnInheritedWidgetOfExactType <_ModalScopeStatus> () или зависимостьOnInheritedElement () был вызван до того, как _ViewState.initState () завершено.
Я видел этот пример, но он не работал, потому что, если значение было изменено, он избавляется от TextControllers немедленно:
@override
void didChangeDependencies() {
textfieldControllersEx[0].dispose();
textfieldControllersEx[1].dispose();
textfieldControllersEx[2].dispose();
textfieldControllersEx[3].dispose();
// TODO: implement didChangeDependencies
super.didChangeDependencies();
}
Вот как я могу перемещаться:
Navigator.of(context).pushNamed("/PlaidPage");
Помощь будет любезно оценена