안녕하세요!
더 좋은 방법이 있는지 모르겠어서 문의드립니다 ㅜ
제목 그대로,
Paging3 와 Navigation 을 함께 사용할 때, Fragment 전환시에도 페이징 데이터를 유지하는 방법의
best practice 가 궁금합니다.
Single Activity 에 Multi Fragment 구조로 되어 있고요.
Navigation 라이브러리를 사용하고 있습니다.
문제는 Navigation 은 fragment 전환시에 replace 를 하기에
항상 Fragment Create/Destroy 가 일어나는데요.
그러다보니 viewModel 의 scope 를 Fragmet 로 하면,
다시 페이지데이터가 있는 Fragment 진입시에 원격지 API 를 호출하는 이슈입니다.
이를 해결하기 위해 현재
Activity scope 로 ViewModel 을 사용하고 있습니다. (by activityViewModels())
이 방법이 올바른 방법인지 궁금합니다.
아래는 해당 ViewModel 일부 코드입니다
Fragment scope 로는 뭔 짓을 해도 안되더라고요.
cachedIn(viewModelScope) 도 결국엔 VIewModel 이 Fragment 와 lifecycle이 같은데,
이 Fragment 가 재생성 되어버리니.. ViewModel 의 데이터가 모두 초기화됩니다..
답변 기다리겠습니다.
감사합니다.
@HiltViewModel
class MatchesViewModel @Inject constructor(
private val matchUseCase: MatchUseCase
) : ViewModel() {
private val _matchesFlow = MutableStateFlow<PagingData<Match>>(PagingData.empty())
val matchesFlow = _matchesFlow.asStateFlow()
private val _matchOutputRemoteFlow = MutableSharedFlow<RemoteState<MatchOutput>>()
val matchOutputRemoteFlow = _matchOutputRemoteFlow.asSharedFlow()
private val _hiddenMatchNosFlow = MutableStateFlow<List<Long>>(emptyList())
val hiddenMatchNosFlow = _hiddenMatchNosFlow.asStateFlow()
init {
// 새로고침 시 중복 호출을 방지하기 위해 이 곳에서 수행
fetchMatches()
}
private fun fetchMatches() {
viewModelScope.launch {
matchUseCase.fetchMatches(pageSize = 4)
.cachedIn(viewModelScope)
.combine(_hiddenMatchNosFlow) { pagingData, hiddenMatchNos ->
hiddenMatchNos.fold(pagingData) { acc, matchNo ->
filterHiddenMatch(acc, matchNo)
}
}
.collectLatest { pagingData ->
_matchesFlow.update { pagingData }
}
}
}
}