How to use rememberLauncherForActivityResult() in mvvm jetpack compose

Viewed 903

I have simple location permission and trying remove all the logic code to viewModel i don't know where it will fit in mvvm pattern and how please help me.

class MainActivity : ComponentActivity() {

    @ExperimentalFoundationApi
    @ExperimentalMaterialApi
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ExperimentTheme {
                Surface(color = MaterialTheme.colors.background) {
                    val viewModel: MapViewModel = viewModel()
                    val requestPermission = rememberLauncherForActivityResult(
                        ActivityResultContracts.RequestPermission()
                    ) { isGranted ->
                        if (!isGranted) Log.d("appDebug", "location permission granted")
                        // Else go next
                    }

                    Button(onClick = {
                        if (!viewModel.hasLocationPermission())
                            requestPermission.launch(Manifest.permission.ACCESS_FINE_LOCATION)
                    }) {
                        Text(text = "Click")
                    }
                }
            }
        }
    }
}

viewModel here just checking permission:

class MapViewModel(application: Application) : AndroidViewModel(application) {

    private val context = application

    fun hasLocationPermission() = ActivityCompat.checkSelfPermission(
        context,
        Manifest.permission.ACCESS_FINE_LOCATION
    ) == PackageManager.PERMISSION_GRANTED


}
1 Answers

AFAIK, it's better implement context related code in activity to make your viewmodel context free.

val requestPermission = permissionGrant {
    // On Permission granted here
}
val context = LocalContext.current
Button(onClick = {
    val hasPermission = ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
    if (!hasPermission)
        requestPermission.launch(Manifest.permission.ACCESS_FINE_LOCATION)
}) {
    Text(text = "Click")
}


@Composable
fun permissionGrant(onGrant: () -> Unit): ManagedActivityResultLauncher<String, Boolean> {
    return rememberLauncherForActivityResult(
        ActivityResultContracts.RequestPermission()
    ) {
        if (it)
            onGrant()
    }
}
Related