Комментарии 9
1) А почему не использовали скажем Ktor для получения данных? Зачем разнесли в expect/actual?
Почему мы избегаем библиотеки Reaktive (или корутин/Flow) в Swift?
2) Новая инфа) А разве не в этом был смысл Reaktive? Вы её используете только в рамках jvm/андроид таргетов?
Спасибо за вопросы!
- Здесь несколько причин:
- Прежде всего Ktor немного выходит за рамки статьи
- Ktor знаком меньшему количеству разработчиков, нежели HttpUrlConnection
- Хотелось лишний раз продемонстрировать возможности expect/actual
- Здесь речь именно про экспорт асинхронных фреймворков как API в Swift (или в Xcode). Из-за описанных ограничений их неудобно (и местами опасно) использовать. По-этому намного удобнее закрыть удобным и простым фасадом, а всю логику сделать деталями реализации общего модуля. Но использовать Reaktive для написания общего Kotlin кода — одно удовольствие. :-)
2) Тут конечно философский вопрос. В моей удобной вселенной — реактивщина и должна давать возможность проброса "примитивов"(Flow, Flowable,..) куда-то ещё, где их будешь использовать. Я понимаю, что сейчас это опасно скажем из-за native. Но почему менее удобно? В jvm/android ведь никого это особо не смущает когда rx идёт от сетевого уровня к UI..
Я с Вами полностью согласен, и в переведённом примере Rx (или это могли быть корутины+Flow) — во всех слоях, кроме прямо самого UI. И так получается, что UI можно сделать практически единственным, с чем придётся взаимодейстовать пользователям модуля. Это отлично ложится на имеющиеся ограничения Kotlin/Native. Да и просто, чем меньше пользователям модуля надо делать работы, тем лучше — на много проще вызвать метод onDestroy, чем заботится об утечках и отменах самому.
Как бы на основе текущего примера реализовали скажем: тап на котика — показ диалога и пусть с получением какого-либо результата с диалога.
?
Показ диалогов можно делать также через состояние, а можно доработать "фреймворк" и добавить туда подобие News в MVICore. Если через состояние, то порядок примерно следующий:
- По нажатию на котика производится Event.ItemClicked, который преобразуется в Intent.DoSomething
- Intent.DoSomething поступает в Store
- Store выставляет некий флаг State.isWaitingForData
- State преобразуется во ViewModel, где проставляется флаг ViewModel.isRequestDataDialogVisible
- При успешном закрытии диалога выдаётся Event.RequestDataDialogConfirmed(data)
- При отмене диалога выдаётся Event.RequestDataDialogCancelled
- Store получается соответствующие намерения, убирает флаг State.isWaitingForData и выполняет нужное действие
Если делать через News, то вместо фалага в состоянии Store будет выдавать одноразовый News.WaitingForData. Получив этот News представление показывает диалог.
Ага, спасибо. А Store был бы один на сам экран и диалог?
Что если диалог сложный и интерактивный? Тогда для него следовало бы сделать отдельный Store? Т.е. вопрос больше о том где граница когда фичу/компонент пора выделять?
Архитектурный шаблон MVI в Kotlin Multiplatform, часть 2