Как стать автором
Обновить
29
0
Глеб Гутник @glider_skobb

Ведущий Kotlin-разработчик в МТС

Отправить сообщение

Печально каждый раз видеть, как люди путают Kotlin Multiplatform, который уже давно Stable, и Compose Multiplatform, который Stable для Android и Desktop, Beta для iOS и Alpha для Web. В этой статье вообще про Compose Multiplatform пара предложений (видимо, автор оригинального материала не вполне в курсе последних апдейтов и релизов), а между тем фреймворк уже сейчас вполне может соперничать с Flutter. По пути своего развития он будет собирать все те же проблемы, что и Flutter: производительность, поддержка собственного канваса на iOS, баги платформенных реализаций под капотом, и т. д.

Но гибкость Compose Compiler и Compose в целом как инструмента реактивного декларативного UI рвет на части все. Будем дальше наблюдать за этой эпической битвой)

Полностью согласен с названием статьи, но содержание разочаровало. Гораздо полезнее для новичков было бы понять, почему лучше стартовать с языка со строгой типизацией и иммутабельностью, типа Go, Kotlin или Swift

Интересно, как обрабатывать состояния таких View Model в Swift UI. Если я правильно понимаю, интерфейс от них реактивно обновляться не будет? Было бы здорово, если бы Google выпустили официальный аналог https://github.com/rickclephas/KMM-ViewModel или предложили свое решение, если ksp-генерация это некрасиво.

Только ксамарин устарел и его поддержку дропнули, а KMP цветет и пахнет)))

Для использования CMP не обязателен Mac. Только если вы собираетесь разрабатывать под iOS. А судя по отсутствию мака, это не ваш случай)

В этой ситуации вам все ещё будет доступны Android, desktop и web (js или wasm) таргеты.

Даже если бы я матерился через слово (что часто не далеко от истины), это не отменяет факт того, что я окончил филологический факультет МГУ имени М.В. Ломоносова... Зря потратил время на него время, правда. А так да, я сейчас больше программист до мозга костей, тут вы абсолютно правы)

По поводу данных - чистейшей воды имхо, поэтому давайте не будем ломать копья и мы.

Не очень кратко все-таки, но надеюсь разрешил некоторые недоумения)

Постараюсь кратко, по сути, ответить, хотя сразу оговорюсь, что к команде Compose Multiplatform в Jb не имею никакого отношения и мои ответы могут не быть solid truth.

1) В compose.MaterialIconsExtended есть самые разные иконки практически на любой вкус. Используйте не только Default, но и Filled/Outlined (я для работы особенно часто пользуюсь Outlined). Кроме того, вы можете подгрузить изображение из ресурсов, с новым API ресурсов в версии 1.4.0 они наконец-то выкатили нормальную поддержку общих ресурсов. Можно грузить XML, PNG, JPG/JPEG, понятное дело, с SVG проблемы.

2) Влияние порядка вызова методов и расширений интерфейса Modifier действительно влияет на отображение, но это поведение не отличается от Android Jetpack Compose, поэтому смело читайте их документацию. Самый разительный пример - в отличие от CSS, в котором margin и padding разные вещи, для Modifier есть только padding. Но если padding применить до background, он будет работать как внешний отступ, а если после - как внутренний. Почему ребята в гугле решили так сделать - мне лично не понятно. Наверное, чтобы можно было наслаивать много padding и background в одном Modifier... Да, и так тоже можно.

То, что на скриншоте: weight - это функция-расширение интерфейса Modifier, которая реализована внутри интерфейса RowScope и ColumnScope. Вне этих интерфейсов она не существует для компилятора. Поэтому weight нужно объявлять в скоупе Row или Column. Как вариант - вы можете сделать Composable-функцию расширением к ColumnScope или RowScope, например

@Composable
fun ColumnScope.DrawView2(viewName: String) {
  Box(Modifier.weight(1f)) { // будет работать
    ...
  }
}

3) Что касается форматирования кода - в Intellij Idea и Android Studio не нужно возиться с установкой Black Formatter (обожаю его для питона, просто лучший имхо) или чем-то таким. После внесения любых изменений в файл нажмите Ctrl+L и он автоматически отформатируется в соответствии с лушчими практиками. В IDE есть еще настройки форматирования, которые можно кастомизировать. Например, в нашей компании принято включать trailing comma. Не вспомню, где настройки конкретно сейчас, но гуглится легко.

Сочту за комплимент)

Не юзал его ни секунды, пока писал

Спустя три года работы только поймали такое. У устройств проприетарная прошивка на матлабе/c++ для релейных защит. Постоянно выходят новые версии прошивки, новые устройства вводятся в эксплуатацию. Видимо, из-за этого произошла нестыковка

Ну да, получается, что самое лучшее, что можно здесь сделать - это закешировать shaderBuilder:

actual fun Modifier.shaderEffect(shaderOption: ShaderOptions): Modifier = composed {
    val time by produceState(0f) {
        while (true) {
            withInfiniteAnimationFrameMillis {
                value = it / 1000f
            }
        }
    }
    val effect = remember(shaderOption) { RuntimeEffect.makeForShader(shaderOption.toShaderCode()) }
    val compositeShaderBuilder = remember(effect) { RuntimeShaderBuilder(effect) }
    Modifier.drawWithCache {
        compositeShaderBuilder.uniform(
            name = "iResolution",
            value1 = size.width,
            value2 = size.height
        )
        compositeShaderBuilder.uniform(
            "iTime",
            time
        )
        val shaderBrush = ShaderBrush(compositeShaderBuilder.makeShader())
        onDrawBehind {
            withTransform({ scale(scaleX = 1f, scaleY = -1f) }) {
                drawRect(shaderBrush)
            }
        }
    }
}

Тогда хотя бы выделения памяти под него не будет.

Это на примере десктопа, на андроиде будет чуть отличаться

Когда люди пробуют рисовать такое без кэширования, fps дропается до 5 или ниже:

https://slack-chats.kotlinlang.org/t/10007219/has-anyone-tried-using-runtime-shaders-on-a-jetpack-compose-

Если вы про expect и actual - они доступны только при наличии KCP kotlin("multiplatform"). Любой желающий может добавить в свой проект на котлине новые ключевые слова, если напишет собственный плагин компиляции.

Jetpack Compose - фреймворк для разработки под Андроид от Google. Вскоре после его релиза Jetbrains выпустили на его основе Compose Multiplatform - фреймворк, позволяющий запускать интерфейсы Jetpack Compose дополнительно в десктопных приложениях, iOS и в браузере. Управление состоянием, StateFlow, рендерер Skia те же. Подпробнее можно почитать тут: https://github.com/JetBrains/compose-multiplatform и в моей статье: https://habr.com/ru/companies/timeweb/articles/734818/

Да, работает хорошо, запускал как в эмуляторе, так и на физическом устройстве.

Да, вполне себе можно. Не могу сейчас найти конкретный пример, но с похожими технологиями: https://www.youtube.com/watch?v=BxBw16OCQME

Была бы дискретная видеокарта...

У меня встроенная AMD Renoir, живём с тем, что есть

Да, я отправляю билды приложений с такой виртуалки на айфон, все работает)

Для этого в OpenCore-Boot.sh надо добавить строку:

-device usb-host,bus=ehci.0,vendorid=0x05ac,productid=0x12a8,guest-reset=false,id=iphone

Не погружался в подробности этих параметров, но vendorid это айдишник Apple, productid это айдишник для iPhone. Есть пара нюансов: после вставки шнура в порт USB нужно нажать Trust на телефоне до запуска виртуалки и второе - у меня не получалось использовать одновременно использовать проводную мышь и держать подключенный айфон. Видимо, если в другие USB-порты подключено что-то еще, оно перебивает шину. Но я не спец

Подробнее можно почтитать здесь: https://github.com/arindas/mac-on-linux-with-qemu/issues/25

В Kotlin Multiplatform есть специальный инструмент, cinterop. Самому не приходилось пользоваться, но наверное штука стоящая: https://kotlinlang.org/docs/native-c-interop.html#object-pinning

Из более традиционного, конечно, есть jni еще

Из таких тулзов слышал только про плагины в Figma, которые могут перевести дизайн в код на Jetpack Compose, этот код можно напрямую копипастить и вставлять в Compose Multiplatform

Что касается лоукода - спасибо за идею, стоит на досуге написать )))

1

Информация

В рейтинге
Не участвует
Дата рождения
Зарегистрирован
Активность