ActivityResult API и Compose

672579447bc8d2453fff1621f9c3b230

Есть такие действия, которые как павило пишешь в коде один раз и потом долго к ним не возвращаешься. Вот и запрос разрешений, как мне кажется, именно из этой области.

Время идет, Google вносит изменения в свои контракты, и не всегда успеваешь поправить то, что задеприкейчено по горячим следам. Не стало исключением и получение результата из одной астивити в другую.

Если вы решите использовать метод onFctivityResult () вы увидите, что IDE подсветит вам данный метод и сообщит, что:

This declaration overrides deprecated member but not marked as deprecated itself. This deprecation won’t be inherited in future releases. Please add @Deprecated annotation or suppress. See https://youtrack.jetbrains.com/issue/KT-47902 for details

Если есть вопрос, то надо найти на него ответ.

Документация от Googl’а довольно подробно описывает как использовать новый ActivityResult API и как его тестировать. Но вопрос остается открытым для тех случаев, когда используется Jet Pack Compose. А может я плохо искала? В любом случае ответ я получила и он оказался очень симпатичным.

Мне надо было проверить наличие разрешения на чтение контактов и если таковое не выдано, запросить его.

@Composable
fun ContactsScreen() {
    val isPermissionGranted = remember { mutableStateOf(false) }
    val launcher =
        rememberLauncherForActivityResult(contract = ActivityResultContracts.RequestMultiplePermissions()) {
            it.entries.forEach { map ->
                Log.i("tag", "${map.key} -> ${map.value}")
                isPermissionGranted.value = map.value
            }
        }

    ....
    LaunchedEffect(key1 = null) {
        launcher.launch(arrayOf(android.Manifest.permission.READ_CONTACTS))
    }
}

Вот так красиво это получилось. Мнение о красоте субъективное, так что вы можете с ним не согласиться :)

© Habrahabr.ru