Ю
В качестве критики мне скинули вот это: https://youtu.be/AV_4aVOKl-g?t=11211 (там есть тайм тег про GetX).
Я же смотрю на это немного по-другому.
Да, это микро-фреймворк. За 7 лет опыта разработки для Android я пришёл к тому, что создал для себя некое подобние микро-фреймворка для Android, но это лишь солянка из различных библиотек, каким-то образом собранных под одной крышей. Get делает то же самое для Flutter вместо меня.
Например, в Android для навигации я использую Cicerone, который прячу за интерфейсом Router’а. Выглядит это приблизительно вот так:
class MyViewModel(
…,
router: MyRouter,
): ViewModel {
…
fun onCreateOrderClicked() {
router.goToCreateOrder()
}
}
interface MyRouter {
fun goToCreateOrder()
}
class DefaultMyRouter(
private val ciceroneRouter: CiceroneRouter,
private val screenFactory: ScreenFactory,
): MyRouter {
override fun goToCreateOrder() {
ciceroneRouter.navigateTo(screenFactory.createOrder())
}
}
Как видно, всё это работает через DI. И по факту у меня где-то в памяти есть объект Cicerone, в который то ставится, то убирается Navigator. В данном случае для Flutter + GetX это можно адаптировать таким образом:
class MyController {
MyController(this._router);
final MyRouter _router;
void onCreateOrderClicked() {
_router.goToCreateOrder();
}
}
abstract class MyRouter {
void goToCreateOrder();
}
class DefaultMyRouter implements MyRouter {
void goToCreateOrder() {
Get.toNamed(Routes.CREATE_ORDER);
}
}
Всё то же самое, только мне не надо городить кучу кода для сохранения Navigator’а, Get это делает за меня.
По DI. Для Android я использую Koin, мне он кажется намного приятнее Dagger’а, хоть и имеет свои недостатки. Многие (в том числе Jake Wharthon) говорят что Koin – это не DI, а Service Locator. Тут я не соглашусь) Почему – потому что Service Locator можно использовать для DI по определению, я на Habr’е даже статью написал: http://habr.com/ru/post/488072
Так вот, использование Get в качестве DI-решения почти не отличается от Koin:
// Koin:
val MyModule() = module {
viewModel { MyViewModel(router = get()) }
factory { DefaultMyRouter(ciceroneRouter = get(), screenFactory = get()) } bind MyRouter::class
}
// Get:
class MyBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut<MyRouter>(
() => DefaultMyRouter(),
);
Get.lazyPut<MyController>(
() => MyController(Get.find<MyRouter>()),
);
}
}
А почему критикуют Get’s State Management мне вообще непонятно)