Причины возникновения утечек памяти и как их избежать 🤔
Когда мы работаем с Flutter, кажется, что сборщик мусора все сделает сам, но на практике утечки памяти случаются регулярно 📈. Экран закрыт, а какие-то объекты продолжают висеть в памяти, что приводит к тормозам и даже вылетам приложения на слабых устройствах 📊.
Откуда берутся утечки? 🤔
Чаще всего проблема в том, что объект создается, но не освобождается. Экран ушел, а контроллеры, подписки, таймеры или слушатели продолжают жить, держа ссылки на другие объекты и не отдавая память системе 📝.
Контроллеры и dispose: 📝
TextEditingController, ScrollController, AnimationController, FocusNode - все это нужно уничтожать в dispose(). Если этого не делать, каждый открытый экран будет оставлять после себя мусор 🚮. Правило простое: создал в initState - удали в dispose.
Подписки на Stream и слушатели: 📊
StreamSubscription, addListener у ChangeNotifier и ValueNotifier - это классические источники утечек. Если подписался, но не отписался, поток будет слать события в уже мертвый экран, удерживая его в памяти 📝. Решение: сохранять подписку и отменять ее в dispose.
BLoC и другие сущности с жизненным циклом: 📈
Если BLoC создается прямо внутри State, нужно не забыть вызвать close(). Удобнее использовать BlocProvider, который сам управляет жизненным циклом 📊. Главное правило: кто создал, тот и закрывает.
Таймеры: 🕒
Timer.periodic запускает повторяющиеся задачи. Если не отменить таймер при уходе с экрана, он будет продолжать тикать, вызывать setState и держать экран в памяти 📝. Всегда сохраняйте ссылку на таймер и вызывайте cancel() в dispose.
Сохраненный BuildContext: 📝
BuildContext нельзя хранить в сервисах, синглтонах или долгоживущих объектах. Он привязан к дереву виджетов, и хранение его надолго может привести к утечкам памяти 📊. Лучший способ - передавать контекст только в момент вызова, не сохраняя его.
Кэши без ограничений: 📈
Кэш - это тоже утечка, если он растет бесконтрольно. Изображения, модели, результаты запросов - все это копится в памяти, если вовремя не чистить 📝. Простое решение: ограничить размер кэша или очищать его при выходе пользователя.
Полную новость читайте здесь.
FlutterPulse — канал о мире Flutter!
#flutter #dart #FlutterPulse #FlutterPulseNews #hardworkerFlutter #mobiledevelopment #programming
Post #2813
308