Dispose не вызывается при удалении виджетов из окна - Flutter - PullRequest
1 голос
/ 30 марта 2020

Я использую один и тот же виджет с сохранением состояния в 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");

Помощь будет любезно оценена

...