본문 바로가기
2023년 이전/Android

Navigation을 사용항 경우 fragmentReulst

by JeongUPark 2021. 12. 5.
반응형

Navgiation을 사용할 경우에는 fragmentReult 가 동작하지 않는다. 그럴 경우에는 다음 방법으로 처리하면 된다.

상황은 이렇다.

  1. FragmentA에서 어떤 리스트를 보여주고 있다.
  2. 그리고 그 리스트에서 한 아이템을 클릭하면 그 아이템에 대한 상세 설명을 보여주는 FragmentB를 보여준다.
  3. FragmentB에서 그 아이템을 삭제한다는 액션을 선택하고 FragmentB가 닫히고 FragmentA가 나타난다.
  4. FragmentA로 돌아왔을 때 삭제한 항목없이 리스트가 보여진다.

데이터는 Viewmodel을 사용하면된고, reuslt하는 방법은 다음과 같다.

FragmentA

findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<Type>("key")?.observe(viewLifecycleOwner) {result ->
    // Do something with the result.
}

FragmentB

findNavController().previousBackStackEntry?.savedStateHandle?.set("key", result)

FragmentB가 닫힐 때 위의 코드를 호출하면된다.

그런데 위 코드가 쫌 길기 떄문에 Kotlin을 사용한다면. extion 함수로 다음과 같이 사용하면 더 간결한 코드를 쓸 수 있다.

fun Fragment.getNavigationResult(key: String = "result") =
    findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<Any>(key)

fun Fragment.setNavigationResult(result: Any, key: String = "result") {
    findNavController().previousBackStackEntry?.savedStateHandle?.set(key, result)
}
반응형