Android Compose常用用法

151 阅读1分钟

1.Compose权限申请

第一种写法(androidx.activity:activity-compose:1.7.0)

@Composable  
fun FileBrowserPage(navController: NavController, vm: FileBrowserViewModel = viewModel()) {

    LazyColumn {
        ...
    }

    // 授权回调
    val launcher = rememberLauncherForActivityResult(contract = ActivityResultContracts.RequestPermission()) {
        if (it) {
            // 已授权
        }
    }
    
    val mainScope = rememberCoroutineScope()
    LaunchedEffect(Unit) {
        mainScope3.launch {  
            vm.event.collect { event ->  
                when (event) {  
                    is FileBrowserEvent.RequestPermission -> {
                        // 申请权限
                        launcher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)  
                    }
                    is FileBrowserEvent.ExitPage -> {  
                        navController.popBackStack()  
                    }  
                }
            }  
        }
    }
}

第二种写法(com.google.accompanist:accompanist-permissions:0.24.7-alpha)

@Composable  
fun FileBrowserPage(navController: NavController, vm: FileBrowserViewModel = viewModel()) {

    LazyColumn {
        ...
    }
    
    // 申明权限
    val multiplePermissionState = rememberMultiplePermissionsState(  
        listOf(  
            android.Manifest.permission.READ_EXTERNAL_STORAGE,  
            android.Manifest.permission.WRITE_EXTERNAL_STORAGE,  
        )  
    )  
    
    // 判断是否授权
    if (multiplePermissionState.allPermissionsGranted) {  
        vm.emitIntent(FileBrowserIntent.GrantPermission)  
    }
    
    val mainScope = rememberCoroutineScope()
    LaunchedEffect(Unit) {
        mainScope.launch {  
            vm.event.collect { event ->  
                when (event) {  
                    is FileBrowserEvent.RequestPermission -> {
                        // 申请权限
                        multiplePermissionState.launchMultiplePermissionRequest() 
                    }
                    is FileBrowserEvent.ExitPage -> {  
                        navController.popBackStack()  
                    }  
                }
            }  
        }
    }
}

2.获取Context

val context = LocalContext.current

3.监听返回键

@Composable  
fun FileBrowserPage(navController: NavController, vm: FileBrowserViewModel = viewModel()) {
    LazyColumn {  
        ...
    }  

    BackHandler {  
        // 返回按钮点击
    }
}