Утечка памяти при просмотре страниц Flutter

#flutter #flutter-desktop

#порхание #flutter-рабочий стол

Вопрос:

Я работаю над приложением Windows с flutter desktop, на данный момент все работает гладко и без проблем. Но я подозреваю, что я вызвал утечку памяти при использовании просмотра страниц!!

В принципе, у меня есть просмотры страниц с 6 страницами. Одна из этих страниц — это форма с большим количеством TextEditingController, и да, я вызываю dispose() для каждого TextEditingController, а также для всех блоков, которые я использую.

Теперь, когда пользователь отправляет данные, и я получаю ответ от API о том, что данные были успешно сохранены, я показываю диалоговое окно успеха:

 return showDialog<void>(
  context: context,
  barrierDismissible: false,
  builder: (BuildContext context) {
    return AlertDialog(
      title: Text('Succès'),
      content: Text(message),
      actions: [
        FlatButton(
          child: Text('Sortie'),
          textColor: Colors.white,
          color: kColorGreen,
          onPressed: () {
            Navigator.of(context).pop();
            pageController.jumpToPage(2);
            // Tried calling dispose here !!
            // dispose();
          },
        ),
      ],
    );
  },
);
 

onPressed: я переношу пользователя на другую страницу. И это работает, НО когда я возвращаюсь на страницу формы, все поля формы по-прежнему заполнены старыми данными, и метод dispose никогда не вызывается!!

Я попытался вызвать метод dispose самостоятельно перед переходом на другую страницу, но безуспешно!!

Итак, мой вопрос: как я могу избавиться от всего TextEditingController и блоков, присутствующих на странице формы, при переходе из нее?

Комментарии:

1. У меня была аналогичная проблема с просмотром страниц, причем каждая страница содержала ListView с различными типами входных данных в списках. Что я сделал, так это зарегистрировал каждый метод инициализации и удаления виджетов на каждой из страниц. В конце концов выяснилось, что эти виджеты инициализируются и удаляются непредсказуемо, особенно если вы вызываете диалоговое окно, а затем закрываете его с помощью навигатора. Наша система использует MobX, и мы заполняем поля в каждом из входных данных данными из наших хранилищ MobX. Наилучший подход — заполнить каждый виджет состоянием из вашего хранилища / блока при инициализации и принудительно обновлять с помощью setState, если это необходимо.