Еще немного о виджете поиска на Compose
Посидев с дизайнером, посмотрев виджет поиска, я решил переделать основу для компонента. В текущем решении на базе OutlinedTextField не хватало гибкости. Например, нельзя задать отступы от текста до иконки.
Самое быстрое и правильное решение - использовать для основы BasicTextField.
У BasicTextField есть composable decorationBox который позволяет сделать любой сложности вьюшку вместе с полем ввода. Например, в нашем случае мы вложили поле ввода в Row и поместили по краям от текста иконки на нужном расстоянии (для читабельности код немного сократил):
decorationBox = { innerTextField ->
Row(
...
) {
Icon(
...
)
Spacer(modifier = Modifier.padding(start = 4.dp))
Box(contentAlignment = Alignment.CenterStart) {
if (showHint.value) {
Text(
text = hintText,
...
)
}
innerTextField() // наше поле ввода
}
if (text.value.text.isNotEmpty()) {
Icon(
...
)
}
}
}
В остальном, у нас особо ничего не поменялось по сравнению с предыдущей реализацией.
Единственное, это немного иначе реализована работа с фокусом и изменением цвета рамки. При получении фокуса мы меняем рамку у Row, который является контейнером для нашего поля innerTextField и всех вложенных вью:
Row(
modifier = Modifier.border(
if (isFocused) 2.dp else 1.dp,
animatedBorderColor,
shape = RoundedCornerShape(cornerRadius)
)
.defaultMinSize(minHeight = 40.dp)
.clipToBounds()
)
Полную версию закинул на GitHub: https://github.com/Djangist/ComposeSearchView/blob/main/SearchView.kt
Пользуйтесь.
Посидев с дизайнером, посмотрев виджет поиска, я решил переделать основу для компонента. В текущем решении на базе OutlinedTextField не хватало гибкости. Например, нельзя задать отступы от текста до иконки.
Самое быстрое и правильное решение - использовать для основы BasicTextField.
У BasicTextField есть composable decorationBox который позволяет сделать любой сложности вьюшку вместе с полем ввода. Например, в нашем случае мы вложили поле ввода в Row и поместили по краям от текста иконки на нужном расстоянии (для читабельности код немного сократил):
decorationBox = { innerTextField ->
Row(
...
) {
Icon(
...
)
Spacer(modifier = Modifier.padding(start = 4.dp))
Box(contentAlignment = Alignment.CenterStart) {
if (showHint.value) {
Text(
text = hintText,
...
)
}
innerTextField() // наше поле ввода
}
if (text.value.text.isNotEmpty()) {
Icon(
...
)
}
}
}
В остальном, у нас особо ничего не поменялось по сравнению с предыдущей реализацией.
Единственное, это немного иначе реализована работа с фокусом и изменением цвета рамки. При получении фокуса мы меняем рамку у Row, который является контейнером для нашего поля innerTextField и всех вложенных вью:
Row(
modifier = Modifier.border(
if (isFocused) 2.dp else 1.dp,
animatedBorderColor,
shape = RoundedCornerShape(cornerRadius)
)
.defaultMinSize(minHeight = 40.dp)
.clipToBounds()
)
Полную версию закинул на GitHub: https://github.com/Djangist/ComposeSearchView/blob/main/SearchView.kt
Пользуйтесь.
GitHub
ComposeSearchView/SearchView.kt at main · Djangist/ComposeSearchView
Compose Search widget based on BasicTextField. Contribute to Djangist/ComposeSearchView development by creating an account on GitHub.
👍1
Как-то рассказывал вам про Charles Proxy и тогда были восторженные отзывы об этом инструменте!
Но... однажды услышав про ProxyMan от коллеги, решил попробовать его в деле. Уже месяца 3 или 4 сижу на этом прекрасном проксике. И скажу вам: если у вас Mac - лучшего тулза для отладки приложения я еще не видел.
Почему вообще перешел на ProxyMan?
В основном, из-за не самого удобного интерфейса настройки локальных моков API в Charles (плюс там нужно постоянно с файлами возиться), а у нас в банке это довольно нужная и востребованная фича на которую не хочется тратить кучу времени. В ProxyMan поменять какой-то ответ можно буквально за пару кликов через контекстное меню мышкой и это круто! Экономит кучу времени.
Во-вторых, более интуитивный интерфейс и больше возможностей.
Например, буквально вчера решил посмотреть есть ли эмуляция медленной сети и потери пакетов.
И как вы думаете?
Да, есть. Опять же, экономия времени. Легко и просто проверил shimmer-анимацию или какие-то состояния ошибок.
И вы же понимаете главный прикол, да? Не нужно перезапускать приложение в эмуляторе или на девайсе! Меняешь ответы, состояния и тестируешь приложеньку.
И наверное, не самый последний аргумент - у ProxyMan есть бесплатная версия. У нее, естественно, есть ограничения, но пока каких-то проблем с ними для мобильщика не встретил. Да, ограничение в 4 домена, но этого хватает.
Отдельно хочу отметить удобный форматтер для Json и подсветка. Читать длинные ответы API оч удобно.
И конечно, прекрасная документация, которая не ради галочки.
Вообщем, маковадам рекомендую 👉 https://proxyman.io
Жаль, что не реклама 🙂
Но... однажды услышав про ProxyMan от коллеги, решил попробовать его в деле. Уже месяца 3 или 4 сижу на этом прекрасном проксике. И скажу вам: если у вас Mac - лучшего тулза для отладки приложения я еще не видел.
Почему вообще перешел на ProxyMan?
В основном, из-за не самого удобного интерфейса настройки локальных моков API в Charles (плюс там нужно постоянно с файлами возиться), а у нас в банке это довольно нужная и востребованная фича на которую не хочется тратить кучу времени. В ProxyMan поменять какой-то ответ можно буквально за пару кликов через контекстное меню мышкой и это круто! Экономит кучу времени.
Во-вторых, более интуитивный интерфейс и больше возможностей.
Например, буквально вчера решил посмотреть есть ли эмуляция медленной сети и потери пакетов.
И как вы думаете?
Да, есть. Опять же, экономия времени. Легко и просто проверил shimmer-анимацию или какие-то состояния ошибок.
И вы же понимаете главный прикол, да? Не нужно перезапускать приложение в эмуляторе или на девайсе! Меняешь ответы, состояния и тестируешь приложеньку.
И наверное, не самый последний аргумент - у ProxyMan есть бесплатная версия. У нее, естественно, есть ограничения, но пока каких-то проблем с ними для мобильщика не встретил. Да, ограничение в 4 домена, но этого хватает.
Отдельно хочу отметить удобный форматтер для Json и подсветка. Читать длинные ответы API оч удобно.
И конечно, прекрасная документация, которая не ради галочки.
Вообщем, маковадам рекомендую 👉 https://proxyman.io
Жаль, что не реклама 🙂
👍2
Что новенького в рассылках #7
Подсобиралось интересных постов и библиотек в рассылках.
Давайте смотреть.
Хороший пост про Preferences Data Store
и там же про Proto Data Store - Data Store, который использует Protocol Buffers
Анимация в Compose. 4 примера с кодом.
Compose постоянно дорабатывается, поэтому важно следить за обновлением API. В том числе и по Animations API, часть которого недавно была все еще в статусе Experimental.
Пост о том, как начать создавать дизайн-систему на базе Compose. Стоит ли рассказать, что такое дизайн-система?
Действительно интересный пост про оптимизацию запуска и работы приложения с помощью Baseline Profiles
Наглядный пример в стиле Rx про методы merge, zip, combine для Flow
Пост про автоматизацию создания скриншотов UI на базе Compose. Как вариант использования: написать UI-тесты и делать скриншоты разных состояний экрана. Потом отдать этот набор скринов QA Team или самостоятельно просматривать и искать косячки.
Вводная по KMM на наглядном примере с советами как шарить код между платформами
Пример связки Compose и библиотеки Molecule от CashApp в которую контрибьютит Jake Wharton
Подборка ссылок для изучения KMM
Советы по оптимизации производительности кода
Библиотеки
О-как! Официальная либа с поддержкой Maps SDK для Compose
Codegen-plugin для GraphQL
Либа для загрузки изображений. Поддерживает Glide, Coil и Fresco. Мы себе уже подтянули.
По-моему, и раньше была в нашей подборке, но мало ли. Либа-сахарок для ViewModels Lifecycle-properties
Мультиплатформенный 2d-движок для создания игр. Поддержка Android в работе, iOS - позже.
Библиотека для создания adaptive and responsive UI на базе Jetpack WindowManager
Подсобиралось интересных постов и библиотек в рассылках.
Давайте смотреть.
Хороший пост про Preferences Data Store
и там же про Proto Data Store - Data Store, который использует Protocol Buffers
Анимация в Compose. 4 примера с кодом.
Compose постоянно дорабатывается, поэтому важно следить за обновлением API. В том числе и по Animations API, часть которого недавно была все еще в статусе Experimental.
Пост о том, как начать создавать дизайн-систему на базе Compose. Стоит ли рассказать, что такое дизайн-система?
Действительно интересный пост про оптимизацию запуска и работы приложения с помощью Baseline Profiles
Наглядный пример в стиле Rx про методы merge, zip, combine для Flow
Пост про автоматизацию создания скриншотов UI на базе Compose. Как вариант использования: написать UI-тесты и делать скриншоты разных состояний экрана. Потом отдать этот набор скринов QA Team или самостоятельно просматривать и искать косячки.
Вводная по KMM на наглядном примере с советами как шарить код между платформами
Пример связки Compose и библиотеки Molecule от CashApp в которую контрибьютит Jake Wharton
Подборка ссылок для изучения KMM
Советы по оптимизации производительности кода
Библиотеки
О-как! Официальная либа с поддержкой Maps SDK для Compose
Codegen-plugin для GraphQL
Либа для загрузки изображений. Поддерживает Glide, Coil и Fresco. Мы себе уже подтянули.
По-моему, и раньше была в нашей подборке, но мало ли. Либа-сахарок для ViewModels Lifecycle-properties
Мультиплатформенный 2d-движок для создания игр. Поддержка Android в работе, iOS - позже.
Библиотека для создания adaptive and responsive UI на базе Jetpack WindowManager
Medium
All about Preferences DataStore
In this post, we will take a look at Preferences DataStore, one of two DataStore implementations. We will go over how to create it, read…
👍2🔥1
В последнее время все чаще приходят вакансии из банков. Уже ровно год, как я работаю в частном банке (не Тинькофф) и если хочется почитать об этом опыте и как тут все устроено - знаете что делать.
Интересно?
(голосование продлится до завтрашнего вечера)
Интересно?
(голосование продлится до завтрашнего вечера)
Final Results
100%
Да
0%
Нет
Начал набрасывать текст про работу в банке. Пока сумбурно, водянисто - выходит дольше, чем думал. В итоге поделю-ка весь опыт на 4 поста с разными темами: общее впечатление, процессы, люди и код.
А пока для затравки оставлю здесь ответ на самый интересующий многих вопрос: норм ли платят?
Да, норм. Я уже несколько лет работаю как ИП на патенте и даже в таком случае ЗП выходит достойная. Выше чем на начальных порах в том же Яндексе, но в стартапе до этого выходило побольше за счет ЗП в USD. И даже учитывая огромную инфляцию на продуктовую корзину (в том числе и в нашем Мухосранске) - грех жаловаться.
Всем продуктивной недели!
А пока для затравки оставлю здесь ответ на самый интересующий многих вопрос: норм ли платят?
Да, норм. Я уже несколько лет работаю как ИП на патенте и даже в таком случае ЗП выходит достойная. Выше чем на начальных порах в том же Яндексе, но в стартапе до этого выходило побольше за счет ЗП в USD. И даже учитывая огромную инфляцию на продуктовую корзину (в том числе и в нашем Мухосранске) - грех жаловаться.
Всем продуктивной недели!
👍3
Общее впечатление от работы в банке
Этим постом хочется передать суть работы в банковской сфере, а вы решите сами - надо ли оно вам или нет.
Запасайтесь кофейком, чаем или чем-то покрепче.
Первый пост из серии готов.
Этим постом хочется передать суть работы в банковской сфере, а вы решите сами - надо ли оно вам или нет.
Запасайтесь кофейком, чаем или чем-то покрепче.
Первый пост из серии готов.
Telegraph
Общее впечатление от работы в банке
Частный банк прежде всего живет на задолженностях своих клиентов, на свои активы и ему важно выпускать все больше функционала, связанного именно с этим: чтобы было удобно взять кредит, удобный классный карточный продукт с рассрочкой или перевести долг из…
👍7
Уже несколько дней сложно себя заставить ни то что работать, вообще что-либо делать.
Сегодня буду пытаться все же что-то полезное сделать по работе, а фоном вместо новостей и прочего шлака поставил 37 часовой курс по Flutter для начинающих
Надеюсь, у вас все хорошо.
Берегите себя!
Сегодня буду пытаться все же что-то полезное сделать по работе, а фоном вместо новостей и прочего шлака поставил 37 часовой курс по Flutter для начинающих
Надеюсь, у вас все хорошо.
Берегите себя!
YouTube
Flutter Course for Beginners – 37-hour Cross Platform App Development Tutorial
Learn how to use Flutter in this complete course for beginners. Flutter is an open-source UI software development kit used to create cross-platform applications for iOS, Android, Windows, Mac, and more.
💻 GitHub repo: https://github.com/vandadnp/mynotes…
💻 GitHub repo: https://github.com/vandadnp/mynotes…
👍3
Любопытный факт, о котором, я, например, не знал.
Во многих учебниках по программированию моего времени переменные в циклах обычно обозначаются как i. Знаете почему?
Дело в том, что более 60 лет назад в первоначальной версии языка Fortran (на синтаксис которого оказала большое влияние алгебра) переменные, имена которых начинались на буквы от I до N, были целочисленными.
В современных языках, понятное дело, лучше переменные циклов называть более осмысленно.
Во многих учебниках по программированию моего времени переменные в циклах обычно обозначаются как i. Знаете почему?
Дело в том, что более 60 лет назад в первоначальной версии языка Fortran (на синтаксис которого оказала большое влияние алгебра) переменные, имена которых начинались на буквы от I до N, были целочисленными.
В современных языках, понятное дело, лучше переменные циклов называть более осмысленно.
👍3
Заметили тренд на коррекцию рублевых зарплат?
Некоторые компании, конечно, и раньше могли себе позволить платить столько архитекторам, но и в Mobile на рядовые позиции коррекция намечается.
И, как обычно, индексация не коснется тех, кто работает по текущим договоренностям. Нужно будет идти и клянчить повышение (либо заключать новый договор).
p.s. потихоньку приходим в себя. Начал набрасывать вторую часть статьи про работу в банке. Поговорим в этот раз о процессах.
Некоторые компании, конечно, и раньше могли себе позволить платить столько архитекторам, но и в Mobile на рядовые позиции коррекция намечается.
И, как обычно, индексация не коснется тех, кто работает по текущим договоренностям. Нужно будет идти и клянчить повышение (либо заключать новый договор).
p.s. потихоньку приходим в себя. Начал набрасывать вторую часть статьи про работу в банке. Поговорим в этот раз о процессах.
👍1
Работа в банке. Часть 2. Процессы.
Запасаемся по традиции кофейком или чем покрепче и продолжаем разговор про работу в банке.
В этот раз про процессы.
Запасаемся по традиции кофейком или чем покрепче и продолжаем разговор про работу в банке.
В этот раз про процессы.
Telegraph
Работа в банке. Часть 2. Процессы.
Все начинается с планирования. Первые этапы планирования начинаются еще в конце года, где верхнеуровнево накидываются планы на следующий год. Далее, каждый квартал проходит более детальное планирование. На этом планировании мы как ни странно планируем, пытаемся…
👍5
Работа в банке. Часть 3. Люди.
Продолжаем про работу в банке. В этот раз максимально позитивный пост получился, да и кофе скорее всего вам не понадобится.
Люди - наше все?
Продолжаем про работу в банке. В этот раз максимально позитивный пост получился, да и кофе скорее всего вам не понадобится.
Люди - наше все?
Telegraph
Работа в банке. Часть 3. Люди.
DroidDevNotes Да, эта будет самая позитивная часть нашего цикла. Люди в банке (по крайней мере в нашем) отзывчивые, всегда готовы созвониться и помочь. Вопросов в этом плане вообще нет. Есть только несколько но: Много кто уволился. Особенно топы, что настораживает.…
👍3
Работа в банке. Часть 4. Код.
Ну что, соскучились?
Пока еще производительность хромает. Как в работе, так и вообще везде. Медленно, медленно приходим в себя, но все еще больше с акцентом на просмотр новостей 😞
Но я таки набросал последний пост про работу в банке.
Запасайтесь по классике любимым напитком, букв много.
Всем хороших выходных!
Ну что, соскучились?
Пока еще производительность хромает. Как в работе, так и вообще везде. Медленно, медленно приходим в себя, но все еще больше с акцентом на просмотр новостей 😞
Но я таки набросал последний пост про работу в банке.
Запасайтесь по классике любимым напитком, букв много.
Всем хороших выходных!
Telegraph
Работа в банке. Часть 4. Код.
Вот мы и подобрались к финишу. Теперь самое интересное - код. И самое неоднозначное. Архитектура. У нас многомодульный проект. Модулей порядка 30-40 (список не помещается на экране iMac 5к). Модули связаны между собой через некие медиаторы (по сути аналог…
👍3
Попробовал удобный и быстрый способ протестировать диплинки в Android-приложении.
Просто запускаем команду:
Красота!
Просто запускаем команду:
adb shell am start -a android.intent.action.VIEW -d "deep_link_url" app_package_name
И приложение запускается с нужным диплинком. Красота!
👍1🔥1
Любопытный баг нашелся в Compose:
https://issuetracker.google.com/issues/192433071
Суть: при нажатии на Back сперва сбрасывается фокус поля вместо перехода на предыдущий в стеке экран. Приходится дополнительно тапать на Back.
Статус у бага вроде бы уже fixed, но пока не ясно до конца в какой версии исправят. На текущей стабильной версии Compose 1.1.0 вроде бы еще проявляется.
Вариантов исправить несколько, но если не сильно заморачиваться, то просто к полю ввода добавляем такой вот костыль-модификатор:
p.s. Давненько я что-то ничего не постил… в общем как вы там поживаете в ваших Грузиях / Армениях ? 🙂
https://issuetracker.google.com/issues/192433071
Суть: при нажатии на Back сперва сбрасывается фокус поля вместо перехода на предыдущий в стеке экран. Приходится дополнительно тапать на Back.
Статус у бага вроде бы уже fixed, но пока не ясно до конца в какой версии исправят. На текущей стабильной версии Compose 1.1.0 вроде бы еще проявляется.
Вариантов исправить несколько, но если не сильно заморачиваться, то просто к полю ввода добавляем такой вот костыль-модификатор:
modifier = Modifier
.onKeyEvent {
if (it.key == Key.Back) {
// presenter.onBackPressed() or something like
true
} else {
false
}
}
Ждем включения фикса в основную версию.p.s. Давненько я что-то ничего не постил… в общем как вы там поживаете в ваших Грузиях / Армениях ? 🙂
👍4
Я снова с вами!
Решил продолжить таки писать небольшие заметки в канал хотя бы потому что недавно делая диплинки, очень кстати под рукой оказался пост из тележки.
Кстати, теперь у постов будут теги для быстрого поиска.
Что новенького?
1️⃣ В банке сменилось руководство (теперь российское), но изменений в плане работы пока особых нет. Работаем как и раньше. Ограничений на работу из-за рубежа тоже нет, в отличии от Альфы, Сбера и еще парочки банков. Вот коллегам из Открытия (по слухам) тяжелее всего. Хотя, ВТБ многих заберет к себе, если покупка осуществится.
2️⃣ Потихоньку наша махина переходит на рельсы MVI + Compose. MVI пока самописный, благо не так чтобы сложно его реализовать в базовом виде. По Compose вроде дела идут неплохо: переносим свои компоненты на него, что-то выкидываем, ибо хватает стандартной поддержки, но все упирается как всегда во время.
3️⃣ Активнее начали заниматься написанием тестов и скоро их количество в конкретном функционале будет проверяться на CI. Сделаем минимально допустимое покрытие перед мержем ветки в dev.
4️⃣ В Сентябре переболел ковидом, но в легкой форме, поэтому полет нормальный.
А как у вас дела?
Решил продолжить таки писать небольшие заметки в канал хотя бы потому что недавно делая диплинки, очень кстати под рукой оказался пост из тележки.
Кстати, теперь у постов будут теги для быстрого поиска.
Что новенького?
1️⃣ В банке сменилось руководство (теперь российское), но изменений в плане работы пока особых нет. Работаем как и раньше. Ограничений на работу из-за рубежа тоже нет, в отличии от Альфы, Сбера и еще парочки банков. Вот коллегам из Открытия (по слухам) тяжелее всего. Хотя, ВТБ многих заберет к себе, если покупка осуществится.
2️⃣ Потихоньку наша махина переходит на рельсы MVI + Compose. MVI пока самописный, благо не так чтобы сложно его реализовать в базовом виде. По Compose вроде дела идут неплохо: переносим свои компоненты на него, что-то выкидываем, ибо хватает стандартной поддержки, но все упирается как всегда во время.
3️⃣ Активнее начали заниматься написанием тестов и скоро их количество в конкретном функционале будет проверяться на CI. Сделаем минимально допустимое покрытие перед мержем ветки в dev.
4️⃣ В Сентябре переболел ковидом, но в легкой форме, поэтому полет нормальный.
А как у вас дела?
👍4
В xml-разметке когда привязываете элемент к top и bottom других элементов, используя ConstraintLayout, по-умолчанию нужный кусок макета займет не всю область между двумя другими и нужно проставить ему height = 0dp. Частый кейс!
В Compose если поставить у этого элемента в модификаторе height = 0.dp это не сработает.
Оказывается, подобная опция есть в методе constrainAs и нужно выбрав либо ширину, либо высоту указать опцию fillToConstraints:
#Compose #ConstraintLayout
В Compose если поставить у этого элемента в модификаторе height = 0.dp это не сработает.
Оказывается, подобная опция есть в методе constrainAs и нужно выбрав либо ширину, либо высоту указать опцию fillToConstraints:
Modifier
.constrainAs(content) {
bottom.linkTo(termsAndConditions.top)
top.linkTo(topBar.bottom, margin = 32.dp)
...
height = Dimension.fillToConstraints }
Теперь элемент растянется по всей высоте.#Compose #ConstraintLayout
👍1
Любопытное, хотя уже и немного старенькое видео о том, как устроен Compose Runtime: https://www.youtube.com/watch?v=6BRlI5zfCCk
Самое интересное с 13 минуты.
Самое интересное с 13 минуты.
YouTube
KotlinConf 2019: The Compose Runtime, Demystified by Leland Richardson
Recording brought to you by American Express. https://americanexpress.io/kotlin-jobs
Jetpack Compose is an ambitious multi-team effort to reimagine Android's UI Toolkit more than 10 years after the Android Platform launched with the original UI Toolkit.
…
Jetpack Compose is an ambitious multi-team effort to reimagine Android's UI Toolkit more than 10 years after the Android Platform launched with the original UI Toolkit.
…
👍3
Кто бы мог подумать, что в 2023 я буду прикручивать к Android-приложению снова веб-сокеты? Еще когда только технология появилась все в мобильном мире считали как должное, что нужно обязательно их попробовать затянуть в проект. Потом все как хапанули с ними, особенно, в кейсах, когда нужно работать с сокетом из нескольких мест в приложении и держать коннект в фоне, который так и хотел где-то закрыться или память покушать. Видимо mobile-мир, как и человечество развивается по кругу (ну или просто архитекторы у нас вызывают вопросы?). Теперь ждем снова, когда будем хапать кое-чего на лопате.
Благо, если не нужна очень гибкая его настройка, можно воспользоваться либой, которая подключена почти в любом проекте - OkHttp:
Минус реализации в OkHttp в том, что вы не можете гибко контролировать коннект. Есть только открытие сокета, закрытие и отправка / получение сообщения. Хотя может и есть, я пока не встретил сходу, при том что в исходник тоже заглянул.
Как думаете зачем в банке могли потребоваться веб-сокеты в 2023?
Нет, не для чата 🙂
#WebSocket
Благо, если не нужна очень гибкая его настройка, можно воспользоваться либой, которая подключена почти в любом проекте - OkHttp:
webSocket = builder.newWebSocket(
Request.Builder().url(url).build(),
webSocketListener
)
и дальше работать с объектом WebSocket.Минус реализации в OkHttp в том, что вы не можете гибко контролировать коннект. Есть только открытие сокета, закрытие и отправка / получение сообщения. Хотя может и есть, я пока не встретил сходу, при том что в исходник тоже заглянул.
Как думаете зачем в банке могли потребоваться веб-сокеты в 2023?
Нет, не для чата 🙂
#WebSocket
👍4
Небольшой нюанс многомодульности в Android Studio Electric Eel
Как вы уже знаете, у нас в проекте очень много модулей (больше 100 наверное уже), поэтому иногда возникают забавные кейсы.
Вот один из них.
Суть: коллега закончил перенос конфигов в build.gradle для всех модулей на KTS и слил это в dev.
Но при мерже в ветку с новым модулем, который был только локально в этой самой ветке произошла аказия: студия САМА добавила вот такие строки в КАЖДЫЙ build.gradle:
Мораль простая: подливайте почаще изменения в свою ветку, правда, вряд ли в данном случае это бы вас сильно спасло, но по крайней мере можно заложить время на определенные правки, дабы они не были сюрпризом перед созданием PR.
#Многомодульность
Как вы уже знаете, у нас в проекте очень много модулей (больше 100 наверное уже), поэтому иногда возникают забавные кейсы.
Вот один из них.
Суть: коллега закончил перенос конфигов в build.gradle для всех модулей на KTS и слил это в dev.
Но при мерже в ветку с новым модулем, который был только локально в этой самой ветке произошла аказия: студия САМА добавила вот такие строки в КАЖДЫЙ build.gradle:
apply plugin: 'org.jetbrains.kotlin.android'
implementation("androidx.core:core-ktx:+")
implementation("androidx.core:core-ktx:+")
Неприятно.Мораль простая: подливайте почаще изменения в свою ветку, правда, вряд ли в данном случае это бы вас сильно спасло, но по крайней мере можно заложить время на определенные правки, дабы они не были сюрпризом перед созданием PR.
#Многомодульность
👍2🤔1
При переходе с MVP на MVI очень спасает мини-библиотека kotlinx.coroutines.rx2.
Проект старый, весь код работающий с API в основном возвращает Rx-сущности. А методы Middleware в котором как раз мы и дергаем этот API, возвращает flow.
Поток данных внутри flow-билдера должен быть синхронным, что как раз и позволяет сделать эта маленькая библиотечка, добавляющая метод-расширение await() к SingleSource/CompletableSource/MaybeSource и тд. Внутри расширения используется блок suspendCancellableCoroutine, который оборачивает каллбеки Rx, возвращая результат.
В итоге, код будет выглядеть примерно так:
#MVI #Coroutines #Rx
Проект старый, весь код работающий с API в основном возвращает Rx-сущности. А методы Middleware в котором как раз мы и дергаем этот API, возвращает flow.
Поток данных внутри flow-билдера должен быть синхронным, что как раз и позволяет сделать эта маленькая библиотечка, добавляющая метод-расширение await() к SingleSource/CompletableSource/MaybeSource и тд. Внутри расширения используется блок suspendCancellableCoroutine, который оборачивает каллбеки Rx, возвращая результат.
В итоге, код будет выглядеть примерно так:
val response = interactor.apiRequest().await()
Крайне рекомендую, если у вас все еще смешанное использование Coroutines/Rx. #MVI #Coroutines #Rx
👍4🤔1