GetX — компактный набор инструментов для Flutter: реактивного управления состоянием, навигации и внедрения зависимостей. Для безопасного старта создайте контроллер, зарегистрируйте его через Binding, изменяйте состояние через Rx-поля и обновляйте интерфейс с помощью Obx. Затем добавьте именованные маршруты и проверьте жизненный цикл объектов.
Коротко о базовых принципах GetX
- Контроллер хранит состояние и прикладную логику экрана.
- Rx-значения уведомляют интерфейс об изменениях без ручного setState.
- Obx перерисовывает только участок, который использует наблюдаемое состояние.
- Bindings связывают экран с зависимостями и управляют их жизненным циклом.
- GetMaterialApp предоставляет навигацию, маршруты и доступ к GetX-контексту.
Архитектура GetX: контроллеры, сервисы и реактивность
GetX подходит для приложений, где нужно быстро разделить UI, состояние, навигацию и зависимости. Контроллеры удобны для экранов и сценариев, сервисы — для долгоживущих компонентов вроде авторизации или хранилища.
Не стоит применять GetX без ограничений в проекте, где уже принят другой контейнер зависимостей или строгая архитектурная система. Также не следует превращать один глобальный контроллер в хранилище всего приложения.
class CounterController extends GetxController {
final count = 0.obs;
void increment() {
count.value++;
}
}
Быстрое подключение: установка, конфигурация и структура проекта
Понадобятся установленный Flutter SDK, рабочий проект Flutter, редактор с поддержкой Dart и доступ к файлу pubspec.yaml. Версию пакета выбирайте по совместимости с текущим SDK и проверяйте изменения API перед обновлением.
- Добавьте зависимость командой flutter pub add get.
- Замените корневой виджет на GetMaterialApp.
- Разделите код по назначению: controllers, bindings, views, services.
- Запускайте flutter analyze после изменений в архитектуре.
import ‘package:flutter/material.dart’;
import ‘package:get/get.dart’;
void main() {
runApp(const GetMaterialApp(home: HomePage()));
}
Пример структуры проекта:
lib/
bindings/
controllers/
services/
views/
routes/
Управление состоянием: GetxController, Rx и паттерны использования
-
Создайте контроллер.
Храните в нём только состояние и операции, относящиеся к экрану или сценарию. Для асинхронной подготовки данных используйте onInit, а ресурсы освобождайте в onClose.
class ProfileController extends GetxController {
final name = ».obs;
final loading = false.obs;@override
void onInit() {
super.onInit();
loadProfile();
}Future<void> loadProfile() async {
loading.value = true;
name.value = ‘Профиль’;
loading.value = false;
}
} -
Зарегистрируйте зависимость.
Для экрана используйте Get.put или Binding. Если создание объекта можно отложить до первого обращения, применяйте Get.lazyPut.
class ProfileBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut<ProfileController>(
() => ProfileController(),
);
}
} -
Подключите реактивный участок UI.
Оберните в Obx только те виджеты, которым действительно нужно реагировать на изменение. Это уменьшает лишние перестроения и упрощает диагностику.
class ProfileView extends GetView<ProfileController> {
const ProfileView({super.key});@override
Widget build(BuildContext context) {
return Obx(() => Text(
controller.loading.value
? ‘Загрузка’
: controller.name.value,
));
}
} -
Изменяйте Rx-состояние через публичные методы.
Не раздавайте UI прямой доступ к сложной логике. Для списков и составных объектов используйте refresh() только тогда, когда изменение не прошло через присваивание Rx-значению.
class CartController extends GetxController {
final items = <String>[].obs;void addItem(String item) {
items.add(item);
}void clear() {
items.clear();
}
}
Быстрый режим
- Добавьте пакет командой flutter pub add get.
- Создайте GetxController с Rx-полями.
- Зарегистрируйте контроллер через Binding.
- Выведите состояние внутри Obx.
- Проверьте проект командами flutter analyze и flutter test.
Навигация и маршрутизация: Get.to, именованные роуты и middlewares
Для небольшого сценария достаточно перехода через Get.to. Для приложения с несколькими экранами лучше описать именованные маршруты и привязать к ним Bindings.
GetMaterialApp(
initialRoute: ‘/home’,
getPages: [
GetPage(
name: ‘/home’,
page: () => const HomeView(),
),
GetPage(
name: ‘/profile’,
page: () => const ProfileView(),
binding: ProfileBinding(),
),
],
);
Переход и возврат результата:
final result = await Get.toNamed(‘/profile’);
Get.back(result: ‘saved’);
Проверяйте результат по чек-листу:
- Корневой виджет — GetMaterialApp.
- Каждый именованный маршрут имеет уникальное имя.
- Binding подключён к тому маршруту, которому нужен контроллер.
- После возврата с экрана не остаются ненужные зависимости.
- Закрытые экраны не вызывают обновление уже уничтоженных объектов.
- Доступ к аргументам маршрута проверяется на отсутствие значения.
- Middleware не содержит секретов и не раскрывает чувствительные данные в логах.
Инъекция зависимостей: Bindings, lazyPut и lifecycle-стратегии
Bindings позволяют определить зависимости рядом с маршрутом. Выбирайте стратегию по времени жизни объекта: экранные контроллеры должны освобождаться после ухода со страницы, а сервисы приложения могут жить дольше.
class AppBinding extends Bindings {
@override
void dependencies() {
Get.put<AuthService>(AuthService(), permanent: true);
}
}
class HomeBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut<HomeController>(
() => HomeController(Get.find()),
);
}
}
Частые ошибки:
- Регистрация одного типа несколько раз без понимания, какой экземпляр будет найден.
- Использование permanent: true для каждого контроллера и накопление объектов в памяти.
- Вызов Get.find до выполнения соответствующего Binding.
- Помещение сетевого клиента или токенов в UI-класс вместо отдельного сервиса.
- Отсутствие обработки ошибок в асинхронных методах контроллера.
- Сохранение ссылок на контроллер после закрытия экрана.
- Использование глобального состояния там, где достаточно локального контроллера.
Производительность и безопасность: оптимизация реактивных обновлений
Оптимизируйте GetX через границы реактивности и аккуратное управление данными. Не помещайте в один Obx весь экран, если меняется только один текст или индикатор.
Подходы для разных сценариев
- Obx. Подходит для небольших точечных обновлений и простых Rx-значений.
- GetBuilder. Уместен для ручного обновления по событию, когда реактивность не нужна постоянно.
- Несколько контроллеров. Используйте для независимых областей экрана, чтобы изменение одной области не затрагивало остальные.
- Сервисный слой. Подходит для сетевых запросов, кэша и авторизации; UI не должен хранить секреты и разбирать ответы напрямую.
Практические меры безопасности:
- Не выводите токены, пароли и полные ответы API в логи.
- Проверяйте и нормализуйте данные, полученные из аргументов маршрута.
- Обрабатывайте ошибки сети без показа пользователю внутреннего стека исключения.
- Очищайте чувствительные данные при выходе из аккаунта.
Типичные ошибки и быстрые решения при работе с GetX
Почему Obx не реагирует на изменение?
Проверьте, что значение действительно является Rx и изменяется через .value либо методы Rx-коллекции. Сам Obx должен читать это значение во время построения.
Когда использовать GetBuilder вместо Obx?
Используйте GetBuilder для ручного обновления после вызова update(). Obx удобнее, когда интерфейс должен автоматически реагировать на изменения Rx-состояния.
Почему Get.find не находит контроллер?
Контроллер не был зарегистрирован или Binding не подключён к текущему маршруту. Проверьте порядок регистрации и тип, переданный в Get.find<T>().
Нужно ли делать каждый сервис permanent?
Нет. Постоянный жизненный цикл оправдан только для действительно общих компонентов приложения. Экранные зависимости лучше создавать лениво и освобождать после закрытия маршрута.
Как безопасно передавать аргументы маршрута?
Передавайте минимальный набор данных и проверяйте тип и наличие аргументов до использования. Для чувствительных данных применяйте защищённое хранилище, а не параметры URL или публичное состояние.
Почему после переходов растёт потребление памяти?
Проверьте зависимости с permanent: true, подписки, таймеры и контроллеры, которые не освобождаются в onClose. Разделите глобальные сервисы и экранные объекты.
































































Отзывов пока нет. Вы можете оставить первый.