Skip to content

Latest commit

 

History

History
76 lines (55 loc) · 2.32 KB

File metadata and controls

76 lines (55 loc) · 2.32 KB
sidebar_position 3

Compose и moko-mvvm

Библиотеки из экосистемы MOKO предоставляют готовые решения для совместной работы с Compose Multiplatform.

StateFlow и collectAsState

Данные из ViewModel (StateFlow) преобразуются в Compose-состояние через collectAsState():

@Composable
fun UserScreen(viewModel: UserViewModel) {
    val user by viewModel.user.collectAsState()

    Text("Hello, ${user.name}")
}

moko-mvvm с Compose

ViewModel из moko-mvvm не требует специальных адаптеров — достаточно collectAsState() для StateFlow и collectAsMutableState() для двустороннего биндинга:

val (code, onCodeChange) = viewModel.code.data.collectAsMutableState()

AuthCodeContent(
    code = code,
    onCodeChange = onCodeChange,
    codeError = viewModel.code.error.collectAsState().value?.localized()
)

BindEffect

Для привязки контроллеров к жизненному циклу Compose используйте BindEffect:

@Composable
fun Sample(viewModel: PermissionsViewModel) {
    BindEffect(viewModel.permissionsController)
    // ...
}

Поддерживается для:

  • PermissionsController из moko-permissions;
  • MediaPickerController из moko-media;
  • LocationTracker из moko-geo;

remember-фабрики

Для создания экземпляров контроллеров внутри @Composable используются фабрики:

@Composable
fun Sample() {
    val factory = rememberMediaPickerControllerFactory()
    val picker = remember(factory) { factory.createMediaPickerController() }

    BindMediaPickerEffect(picker)
}

Доступные фабрики:

  • rememberPermissionsControllerFactory() — из moko-permissions-compose;
  • rememberMediaPickerControllerFactory() — из moko-media-compose;
  • PermissionsControllerFactory — для кастомной конфигурации.

Дополнительная информация