Почему изображение не отображается в Android Studio, когда целочисленная переменная, содержащая рисуемый объект, передается функции painterResource?

У меня есть требование отображать разные изображения на основе определенных взаимодействий с пользователем. Итак, я сохраняю идентификатор ресурса для рисования в целочисленной переменной. Однако, когда я передаю эту переменную в функцию painterResource изображения, изображение не отображается.

Код выглядит так:

val img = R.drawable.img1
val img2 = R.drawable.img2

// imageToDisplay is assigned based on certain conditions.
var imageToDisplay = img

Image(painter = painterResource(imageToDisplay), contentDescription = null)

Почему вы используете var imageToDisplay = img? Каково точное условие, которое вы используете? Что за ресурс R.drawable.img1?

Gabriele Mariotti 04.12.2022 15:45

Я думаю, что если вы собираетесь использовать painterResource, ресурс должен быть векторным или аналогичным XML, в противном случае вам, вероятно, придется использовать imageResource

Richard Onslow Roper 04.12.2022 16:10

@GabrieleMariotti, чтобы я мог переназначить значение на основе определенных взаимодействий с пользователем. Как указал z.y, мне действительно следует использовать здесь переменную Mutable State. И img1 является векторным рисунком.

Varad G 06.12.2022 01:40

@RichardOnslowRoper, да, это векторный рисунок.

Varad G 06.12.2022 01:41
3
4
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предоставленный вами код работает «как есть», используя доступные чертежи в моем конце, если вы не включите более подробную информацию, тогда мы можем только догадываться, но когда вы сказали

У меня есть требование отображать разные изображения на основе определенных взаимодействий с пользователем. …

и

… imageToDisplay назначается на основе определенных условий.

и

… когда я передаю эту переменную в функцию painterResource изображения, изображение не отображается.

Мое лучшее предположение заключается в том, что компонуемые эти коды не перекомпоновываются или не обновляются по какой-то причине, когда вы выполняете какое-то условное действие.

Опять же, мы можем только догадываться, так что вы можете попробовать это или просто использовать это как ссылку.

@Composable
fun DynamicImageComposable() {

    val img = R.drawable.img
    val img2 = R.drawable.img

    // don't use ordinary variable, convert it to a mutable State instead
    var imageToDisplay by remember {
        mutableStateOf(img) // just use any drawable you want as the initial value
    }

    // when you change this to img2, this composable is expected to re-compose
    imageToDisplay = img

    Image(painter = painterResource(imageToDisplay), contentDescription = null)
}

Логика немного бесполезна, но она пытается указать на использование изменяемого состояния для повторной компоновки компонуемого.

Я перенес тот же код в новый проект, и изображение отобразилось нормально. Я думаю, что это должно быть какая-то проблема с конфигурацией предыдущего проекта. И да, в этом случае мне действительно следует использовать MutableState. Спасибо!

Varad G 06.12.2022 01:35

Вы не могли бы просто сказать: «Инициализируйте переменную держателя изображения как держатель состояния MutableState<T> в паре с remember, поскольку мы находимся в рамках Composable».

Richard Onslow Roper 06.12.2022 02:31

Другие вопросы по теме