ActivityResult

aram·2022년 7월 7일
0

1. 개요

appCompat 최신 버전에서 onActivityResult 가 deprecate 되어
Compose 에서 rememberLauncherForActivityResult() 라는 메소드를 사용하게 되었다.

2. 사용법

Compose 에서 rememberLauncherForActivityResult()
Kotlin 에서 registerForActivityResult()
Composable과 Activity에서 각각 다른 메소드를 쓸 뿐, 역할은 같다.
MainActivity 에서 SigninActivity 의 intent 값을 가져와 resultCode가 "OK" 일 때 로직을 실행하는 예시이다.

MainActivity.kt

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
                }
            }
        }
    }

Mypage()

@Composable
fun MyPage(
    signIn: () -> Unit
) {
    Button(onClick = { signIn() }) {
        Text("Login")
    }
}

SigninActivity를 MainActivity가 아닌 상속된 Composable에서 launch 하기 위해 작성된 코드이다.
MyPage Composable에서 버튼 클릭시 signInActivity를 launch 한다.

SigninActivity.kt

 authenticationViewModel.signedIn.observe(this, { signedIn ->
            if (signedIn == true){
                val returnIntent = Intent()
                returnIntent.putExtra("signInResult", signedIn)
                setResult(Activity.RESULT_OK, returnIntent)

                finish()
            }
        })

3. 주의 사항

컴포저블 내에서 요청을 시작하려고 하면 그 시점에 ActivityResultLauncher가 아직 초기화되지 않았기 때문에 런타임 오류가 발생합니다. 구성 이후 실행을 트리거해야 하는 경우 LaunchedEffect 블록 또는 DisposableEffect 블록에서 launch() 메서드를 호출해야 합니다.

0개의 댓글