Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Jetpack Compose. Готов к продакшену?

Max
September 26, 2021

Jetpack Compose. Готов к продакшену?

Max

September 26, 2021
Tweet

More Decks by Max

Other Decks in Programming

Transcript

  1. Недостатки Android View • Разные языки для вёрстки (XML) и

    бизнес логики (Java/Kotlin) • View хранит параметры (set методы + атрибуты) • Зависимость от платформы • Высокая сложность создания собственных View • Синхронное API с вызовами только с главного/UI потока • Много кода в View (30к+ строк в Android 11)
  2. Custom View public View(Context context) public View(Context context, AttributeSet attrs)

    public View(Context context, AttributeSet attrs, int defStyleAttr) public View(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
  3. Концепции Jetpack Compose • Декларативный (описывается только результат) • Единый

    язык логики и UI (Kotlin) • Можно использовать фишки Kotlin • Не зависит от платформы • Асинхронное построение UI • Никакого наследования
  4. class Ref(var value: Int) @Composable fun LogCompositions(tag: String, msg: String)

    { if (BuildConfig.DEBUG) { val ref = remember { Ref(0) } SideEffect { ref.value++ } Log.d(tag, "Compositions: $msg ${ref.value}") } } LogCompositions("MyCompose.app", "MyComposable function")
  5. @Composable fun HelloScreen() { var name by rememberSaveable { mutableStateOf("")

    } HelloContent(name = name, onNameChange = { name = it }) } @Composable fun HelloContent(name: String, onNameChange: (String) -> Unit) { Column(modifier = Modifier.padding(16.dp)) { Text( text = "Hello, $name", modifier = Modifier.padding(bottom = 8.dp), style = MaterialTheme.typography.h5 ) OutlinedTextField( value = name, onValueChange = onNameChange, label = { Text("Name") } ) } }
  6. @Composable fun HelloContent( name: String, modifier: Modifier = Modifier, onNameChange:

    (String) -> Unit ) { Column(modifier = modifier.padding(16.dp)) { Text( text = "Hello, $name", modifier = Modifier.padding(bottom = 8.dp), style = MaterialTheme.typography.h5 ) OutlinedTextField( value = name, onValueChange = onNameChange, label = { Text("Name") } ) } }
  7. LazyColumn(modifier = Modifier.fillMaxSize()) { items( items = characters, key =

    { character -> character.id } ) { character -> CharacterListItem( character = character, onCharacterClicked = { onItemCLicked(character) } ) } }
  8. Производительность • Не нужно парсить XML • Оптимизация кода R8/ProGuard

    • Асинхронное и многопоточное построение UI
  9. Библиотеки Jetpack с поддержкой Compose • Navigation • Activity •

    Paging 3 • ViewModel • Hilt • Material • Wear (Preview) • Widgets (Preview)
  10. Недостатки • Привязка к версии Kotlin • Не все виджеты

    есть в Compose • Lazy списки уступают по производительности RecyclerView
  11. Преимущества • Один язык для всего • Не стоит заботиться

    о вложенности • Возможность оптимизировать UI код (R8/ProGuard) • Независимость от версии Android • Обратная совместимость
  12. Что дальше? • Material You • Поддержка больших экранов •

    Анимации в LazyList • Анимации элементов при переходе на другой экран • Ускорение предпросмотра в IDE • Android Wear • Android Widgets • Инструментарий для просмотра рекомпозиции