Лучший способ получить контекст в кликабельном модификаторе

#android #android-jetpack-compose #android-context

Вопрос:

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

Чтобы решить эту проблему, я использую подход, описанный ниже:

 @Composable
fun ClickableText() {
    val context = LocalContext.current
    Text("Click me!", Modifier.clickable { functionX(context) })
}
 

Мой вопрос в том, есть ли что-то неправильное в таком подходе? Кажется, это работает, но хранение локальной ссылки на localContext.current кажется немного банальным. Если контекст когда-либо изменится за время между составом пользовательского интерфейса и вызовом метода onClick, я бы предположил, что это может вызвать некоторые проблемы. Есть ли лучший способ получить контекст в несоставляемой функции обратного вызова?

Ответ №1:

Нет, это совершенно правильный способ использования LocalContext.current . Он не может меняться между перекомпозицией и onClick .

Context создается перед составным представлением: обычно это ваша деятельность, и если вы используете Hilt, это может быть оболочка контекста , но она создается один раз раньше setContent , поэтому, если она изменится, вся иерархия представления компоновки будет перестроена.

Вы не должны хранить его вне представления, как в моделях представлений, но захватывать его внутри композиционного материала совершенно нормально.

Комментарии:

1. в этом есть большой смысл, спасибо!