appCompat 최신 버전에서 onActivityResult
가 deprecate 되어
Compose 에서 rememberLauncherForActivityResult()
라는 메소드를 사용하게 되었다.
Compose 에서 rememberLauncherForActivityResult()
Kotlin 에서 registerForActivityResult()
Composable과 Activity에서 각각 다른 메소드를 쓸 뿐, 역할은 같다.
MainActivity 에서 SigninActivity 의 intent 값을 가져와 resultCode가 "OK" 일 때 로직을 실행하는 예시이다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
CloudhospitalTheme {
MainContent(authorizationViewModel) {
signIn()
}
}
}
}
fun signIn() {
signInResult.launch(Intent(this, SigninActivity::class.java))
}
private val signInResult = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == RESULT_OK) {
result.data.let { data ->
if (data != null) {
// TODO
}
}
}
}
@Composable
fun MyPage(
signIn: () -> Unit
) {
Button(onClick = { signIn() }) {
Text("Login")
}
}
SigninActivity를 MainActivity가 아닌 상속된 Composable에서 launch 하기 위해 작성된 코드이다.
MyPage Composable에서 버튼 클릭시 signInActivity를 launch 한다.
authenticationViewModel.signedIn.observe(this, { signedIn ->
if (signedIn == true){
val returnIntent = Intent()
returnIntent.putExtra("signInResult", signedIn)
setResult(Activity.RESULT_OK, returnIntent)
finish()
}
})
컴포저블 내에서 요청을 시작하려고 하면 그 시점에 ActivityResultLauncher가 아직 초기화되지 않았기 때문에 런타임 오류가 발생합니다. 구성 이후 실행을 트리거해야 하는 경우 LaunchedEffect 블록 또는 DisposableEffect 블록에서 launch() 메서드를 호출해야 합니다.