Налаштування архітектури GetX для Flutter-додатків
GetX — «все в одному» пакет для Flutter: управління станом, навігація, DI, інтернаціоналізація. Його головний аргумент — мінімум коду для отримання робочого результату. Get.to(ProfileScreen()) замість Navigator.of(context).push(...), controller.name.obs замість ValueNotifier. Для команд, яким потрібно швидко запустити продукт, GetX привабливий.
Основні паттерни GetX
class ProfileController extends GetxController {
final UserRepository _repository;
ProfileController(this._repository);
final profile = Rxn<UserProfile>();
final isLoading = false.obs;
final error = RxnString();
@override
void onInit() {
super.onInit();
loadProfile(Get.arguments as String);
}
Future<void> loadProfile(String userId) async {
isLoading.value = true;
error.value = null;
try {
profile.value = await _repository.getProfile(userId);
} catch (e) {
error.value = e.toString();
} finally {
isLoading.value = false;
}
}
}
У віджеті Obx(() => ...) підписується тільки на використовані .obs-змінні:
Obx(() => controller.isLoading.value
? const CircularProgressIndicator()
: ProfileView(profile: controller.profile.value!),
)
Реєстрація залежностей через Get.lazyPut(() => ProfileController(Get.find())).
GetX та його компромиси
GetX зручний при старті, але створює проблеми при масштабуванні. Навігація через Get.to() без контексту обходить Navigator 2.0 — deep links і web-роутинг налаштовуються складніше. Глобальний Get.find<T>() — це Service Locator, який скриває залежності й затруднює тестування. .obs-поля працюють тільки всередину Obx — якщо забути обернути віджет, реактивності нема й помилки компіляції теж нема.
Для проектів із планованим ростом рекомендуємо використовувати GetX тільки для навігації та DI, а управління станом будувати через GetxController з явними методами, не зловживаючи глобальним станом.
Структура з GetX Bindings
class ProfileBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => UserRepositoryImpl());
Get.lazyPut(() => ProfileController(Get.find()));
}
}
GetPage(
name: Routes.profile,
page: () => const ProfileScreen(),
binding: ProfileBinding(),
)
Binding гарантує, що контроллер створюється при вході на екран й знищується при виході. Це виправляє утечу пам'яті, яку легко отримати з Get.put() без явного управління життєвим циклом.
Що налаштовуємо
GetMaterialApp з роутами та Bindings. Структура: controllers/, views/, bindings/, repositories/. Налаштування DI через Bindings для кожного роуту. Зразковий контроллер з тестами (через GetX + mockito).
Терміни
Налаштування GetX-архітектури: 1–2 дні. Рефакторинг з виставленням правильних Bindings та усуненням утечок: 3–5 днів. Вартість — по аналізу.







