【问题标题】:Accessing rememberLauncherForActivityResult from Util / Jetpack Composee从 Util / Jetpack Compose 访问 rememberLauncherForActivityResult
【发布时间】:2021-09-06 14:13:01
【问题描述】:

我有一个可组合的照片,允许用户从他们的移动图库中提取照片。

我想从 Util 类/功能中获得此功能/服务,因为我有其他需要相同服务的可组合项,并且我不想继续复制/粘贴相同的代码。 这也允许我通过将 Mime 类型从 launch { } 更改来使用它来获取文档 但这对我来说看起来很棘手。如果我使用 @Composable 函数,我不能使用 .launch 另外,如果我将其作为具有 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 ...
}

只是建议...

【问题讨论】:

  • 哪部分rememberLauncherForActivityResult需要搬出去?
  • 是的,我需要在单独的文件中删除此服务,以便我可以使用 .launch{...} 从其他可组合访问它
  • 请添加一些您希望如何使用它的代码。
  • @PhilipDukhov 我编辑了这个问题...

标签: android kotlin android-jetpack-compose


【解决方案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
        )
    }
}

【讨论】:

  • 了不起的人...我还在学习 Kotlin 和 Android,我希望有一天我可以自己做这样的事情...祝你好运
猜你喜欢
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多