Доступ к результату rememberLauncherForActivityResult из Util / Jetpack Composee

#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, и мне жаль, что однажды я не смогу делать такие вещи самостоятельно … удачи