ActivityResult API и Compose
Есть такие действия, которые как павило пишешь в коде один раз и потом долго к ним не возвращаешься. Вот и запрос разрешений, как мне кажется, именно из этой области.
Время идет, 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))
}
}
Вот так красиво это получилось. Мнение о красоте субъективное, так что вы можете с ним не согласиться :)