Razbezhkin
@Razbezhkin
программист, преподаватель

Утечка памяти во Flutter через историю навигации?

Здравствуйте.
Поясните, пожалуйста, правильно ли я понимаю ситуацию:
Во Flutter, когда мы переходим от одной страницы к другой при помощи навигации вот так:

onTap: () {
          Navigator.push(context, MaterialPageRoute(builder: (_) {
            return SomePage();
          }));
        }


то мы создаем новый объект, который записывается в историю и храниться там, пока мы эту историю не очистим или пока не вызовем Navigator.pop() до предыдущей страницы.

Если так, то не случиться ли рано или поздно утечка памяти?
Что если пользователь будет ходить только при помощи push между тремя страницами, а каждая страница будет создавать какое-то состояние и это состояние все время будет запоминаться в истории?

Я провел эксперимент: сделал в Stateful виджете-странице метод dispose(), но он не вызывался у меня ни разу, получается, объекты создаются и не удаляются (это, в принципе, правильно, есть же ссылки на объект из истории навигации).

Странно как то: если пользователь будет ходить по интернет-магазину по разным страницам товаров, а каждая страница будет тянуть из интернета данные о товаре и все это будет оставаться в памяти, то как бы ее скоро может не хватить.
Стоит этого опасаться или все же нужно как то иначе организовывать навигацию?
  • Вопрос задан
  • 451 просмотр
Пригласить эксперта
Ответы на вопрос 1
Lucian
@Lucian
https://t.me/BusinessAndFreelance
Если не важна история, можно использовать Navigator.pushReplacement для удаления предыдущей страницы, если нужна история переходов, то можно отдельно сохранять ее в список List<String> routeHistory = [] и потом выдергивать оттуда.

Насчет жора памяти, у ios и android работают сборщики мусора, вам просто так не дадут сожрать всю память устройства, GC начнет выгружать старый кэш и соответственно приложение начнет медленно работать, т.к. придется заново все подгружать.

Чтобы как-то ускорить процесс, можно использовать прогрев кэша для картинок, которые скоро будут использоваться:
ImageProvider imageProvider = AssetImage(imagePath);
scheduleMicrotask(() {
  precacheImage(imageProvider, context);
});

Реализация зависит от конкретного приложения и как пользователь его использует, оптимизировать заранее не стоит, иначе закопаетесь в задачах.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы