#android #kotlin #android-jetpack-compose
Вопрос:
У меня есть составная фотография, которая позволяет пользователю выбрать фотографию из своей мобильной галереи.
Я хочу иметь эту функцию/службу из класса/функции Util, потому что у меня есть другая составная часть, которая нуждается в той же службе, и я не хочу продолжать копировать/вставлять один и тот же код. также это позволяет мне использовать его для сбора документов, изменив тип Mime launch { }
, но для меня это выглядит сложно. если я использую функцию @Composable, я не смогу использовать .запустите также, если я сохраню его как класс со значением rememberLauncherForActivityResult
, которое необходимо для составления.
какая-нибудь помощь?
@OptIn(ExperimentalCoilApi::class)
@Composable
fun ContactPagePhoto() {
val imageUriState = remember {
mutableStateOf<Uri?>(null)
}
val pickingUp = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) {
imageUriState.value = it
}
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.layoutId("userPhoto")
.fillMaxHeight(0.4f)
.fillMaxWidth(1f)
) {
imageUriState.value?.let {
Image(
modifier = Modifier
.align(Alignment.TopCenter)
.fillMaxSize(1f),
contentDescription = "UserImage",
contentScale = ContentScale.Crop,
painter = rememberImagePainter(data = it)
)
}
}
TextButton(
onClick = { pickingUp.launch("image/*") },
modifier = Modifier.layoutId("changePhoto")
) {
Text(
text = "Change Photo",
color = Color.Black)
}
}
как я собираюсь его использовать…
внутри пакета `util` я хочу создать новый файл kotlin, в котором есть необходимая мне служба
Я могу использовать функцию @Composable, которая позволяет мне использовать rememberLauncherForActivityResult
или создавать класс и расширять его MainActivity
, чтобы получить доступ ComponentActivity()
и использовать registerForActivityResult
для получения Uri
Нравится
class PickUp(){
val launcher = registerForActivityResult...
}
или
@Composable
fun pickup():MutableState<Uri>{
rememberLauncherForActivityResult ...
}
просто предлагаю…
Комментарии:
1. Какую часть ожидаете
rememberLauncherForActivityResult
, что вам нужно съехать?2. да, мне нужно удалить эту службу в отдельном файле, чтобы я мог получить к ней доступ из других составных файлов . запуск{…}
3. Пожалуйста, добавьте немного кода, как вы собираетесь его использовать.
4. @PhilipDukhov я отредактировал вопрос…
Ответ №1:
Ты можешь сделать это вот так:
class GetContentActivityResult(
private val launcher: ManagedActivityResultLauncher<String, Uri>,
val uri: Uri?
) {
fun launch(mimeType: String) {
launcher.launch(mimeType)
}
}
@Composable
fun rememberGetContentActivityResult(): GetContentActivityResult {
var uri by rememberSaveable { mutableStateOf<Uri?>(null) }
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.GetContent(), onResult = {
uri = it
})
return remember(launcher, uri) {
GetContentActivityResult(launcher, uri)
}
}
Использование:
@Composable
fun ContactPagePhoto() {
val getContent = rememberGetContentActivityResult()
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.layoutId("userPhoto")
.fillMaxHeight(0.4f)
.fillMaxWidth(1f)
) {
getContent.uri?.let {
Image(
modifier = Modifier
.align(Alignment.TopCenter)
.fillMaxSize(1f),
contentDescription = "UserImage",
contentScale = ContentScale.Crop,
painter = rememberImagePainter(data = it)
)
}
}
TextButton(
onClick = { getContent.launch("image/*") },
modifier = Modifier.layoutId("changePhoto")
) {
Text(
text = "Change Photo",
color = Color.Black
)
}
}
Комментарии:
1. удивительный человек… я все еще изучаю Котлин и Android, и мне жаль, что однажды я не смогу делать такие вещи самостоятельно … удачи