[Перевод] Preview сложных элементов в Compose

e159c9d1e495a727fd104dcca57d0001.webp

Поскольку все больше разработчиков Android переходят на Jetpack Compose из-за его декларативного подхода к пользовательскому интерфейсу, ему необходимо быстро просматривать сложные макеты. Однако не так-то просто отображать изображения с URL-адреса в Preview Jetpack Compose, поскольку редактор дизайна Android Studio не поддерживает сетевые вызовы. В этой статье я рассмотрю некоторые стратегии по преодолению ограничений; уделив особое внимание реальным решениям для улучшения рабочего процесса разработки.

Проблемы с загрузкой изображений в Preview

Preview Jetpack Compose предназначены для просмотра вашего пользовательского интерфейса прямо внутри Android Studio, что помогает в быстрых итерациях. Однако эти предварительные просмотры не выполняют сетевые операции, поэтому отображение изображения с URL-адреса в Preview невозможно. Сетевые изображения являются неотъемлемой частью каждой демонстрации разработчика, сетевое изображение часто является важным аспектом пользовательского интерфейса их приложения. Без сети тестирование компонентов, требующих динамического контента, также является сложной задачей. Учитывая, что в Android Studio отсутствуют реализации сетевого стека, разработчикам приходится разрабатывать хаки, которые имитируют или заменяют загруженные по сети изображения, сохраняя при этом визуальную точность их предпросмотров.

«Покажите мне свой код»

Давайте рассмотрим простой код:

@Composable
fun ProfileImage(modifier: Modifier = Modifier) {
    Column(
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier.padding(32.dp)
    ) {
        AsyncImage(
            model = "https://www.meme-arsenal.com/memes/482d613fe35bccd06d4fdbe1a2a06cdd.jpg",
            contentDescription = null,
            contentScale =  ContentScale.FillHeight,
            modifier = Modifier
                .fillMaxWidth()
                .aspectRatio(16/9F)
        )
        Text(
            text = "Profile picture",
            style = MaterialTheme.typography.titleLarge
        )
    }
}

@Preview(showBackground = true)
@Composable
fun ProfileImagePreview() {
    EmptyImagePreviewTheme {
        ProfileImage()
    }
}

И, очевидно, мы увидим такой Preview:

1a44015bd78a6bbfc0a537a5c5c525de.webp

Давайте исправим это:

@Composable
fun ProfileImage(
    modifier: Modifier = Modifier
) {
    Column(
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = modifier.padding(32.dp)
    ) {
        val imageModifier = Modifier
            .fillMaxWidth()
            .aspectRatio(16/9F)
        if (LocalInspectionMode.current) {
             Image(
                painter = painterResource(R.drawable.natash),
                contentDescription = null,
                 modifier = imageModifier
            )
        } else {
            AsyncImage(
                model = "https://www.meme-arsenal.com/memes/482d613fe35bccd06d4fdbe1a2a06cdd.jpg",
                contentDescription = null,
                contentScale =  ContentScale.FillHeight,
                modifier = imageModifier,
            )
        }
        Text(
            text = "Profile picture",
            style = MaterialTheme.typography.titleLarge
        )
    }
}

И вот результат:

aa30a412ff631f3c53ccaa10aae4c5e7.webp

Объяснение

В Android Jetpack Compose LocalInspectionMode.current — это CompositionLocal, который предоставляет способ проверки того, находится ли текущий контекст Compose в режиме inspection mode, например, когда код отображается в Android Studio Preview.

Назначение LocalInspectionMode.current
— Позволяет разработчикам настраивать пользовательский интерфейс или поведение Composable специально для режима предварительного просмотра в Android Studio.
— Полезно для избежания определенной логики или элементов пользовательского интерфейса, которые не имеют смысла или функциональны в статическом контексте предварительного просмотра, например: сетевые запросы, загрузка данных в реальном времени, анимации или сложные изменения состояния

Заключение

Используя LocalInspectionMode.current, вы можете сделать ваш Preview более надежными и содержательными, не влияя на поведение во время выполнения вашего приложения.

© Habrahabr.ru