Наткнулся на днях на очередной швейцарский нож в виде микро-фреймворка для разработки Flutter-приложений - Nylo. Он включает в себя State Manager, навигацию, работу с сетью, локализацию, собственный небольшой пакет виджетов и аутентификацию «прям из коробки»… 👀
Мягко выражаясь, я малость прифигел от увиденного в коде… ну серьезно… GetX на фоне этого треша смотрится просто сыном маминой подруги или бабушкиным пирожком, которого хочется потискать за его пухленькие щечки 😄
Прямо в документации поощряется черная магия, которая позволяет обновлять состояния виджета из черти знает какой части приложения (точнее, как заявлено, из любой) и все это под соусом глобального хранилища состояний со строковыми идентификаторами:
// Sending an action to the widget
stateAction('hello_world_in_widget', state: MyWidget.state);
// Another example with data
stateAction('show_high_score', state: HighScore.state, data: {
"high_score": 100,
});
// stateAction handler
@override
get stateActions => {
"hello_world_in_widget": () {
print('Hello world');
},
"reset_data": (data) async {
// Example with data
_textController.clear();
_myData = null;
setState(() {});
},
};
Это же черная дыра типобезопасности, всякие приколюхи с ошибками в рантайме и ад для любого, кто захочет удариться в рефакторинг проекта… и все это благодаря опечатки всего лишь в одном символе 🥲
Что же касается самого подхода, в котором виджет можно обновить «из любого места» через глобальный вызов updateState - его придумал слуга дьявола!!! В неумелых руках он быстро превратится в аналог event-bus, где невозможно будет понять кто инициировал событие, сложно восстановить причинно-следственную цепочку при сложном флот пользователя, да и отладка из себя будет представлять то еще «удовольствие» 🤔
Дополнительной вишенкой на торте выступают примеры в документации, поощряющие создание «толстого UI», в котором такие операции, как инициализация, загрузка, хранение, реакции на события накуканены на слой presentation. Да, это удобно для новичков вкатывающихся в сам Flutter, но такое размытие границ слоев, если мы говорим про долгоживущие приложения, приведет только к большему геморрою на этапе поддержки и добавления новых фич🫠
Ну и как вишенка на торте - это фреймворк! А значит он требует от вас соблюдений его архитектурных правил, навязывая мнение своего создателя и удачи тем, кто реализовав приложение с помощью этого очередного швейцарского ножа, решил мигрировать на стандартные решения с BLoC, Provider и т.д. Таким людям явно не помешает перед началом этого процесса разжиться тефлоновой накидкой для кресла 🤣
p.s. А как вы относитесь к таким фреймворк-комбайнам?))



Дискуссия