변경한 것이라곤 LiveData에서 FLow로 변경한것 밖에 없는데,
제가 아직 Flow에 대해서 잘 몰라서 그런것인지 잘못알고있는게 있어서 그런지..
화면을 이동했다가 다시오면 해당 데이터가 그대로 존재합니다.
화면간 이동은 Navigation으로 합니다.
예를들어 상세화면에서 List에 데이터를 눌러 추가하고 완료버튼을 눌러 다른 화면으로 갔다가
다시 상세화면으로 오면 List가 처음부터 시작하는게 아니라 이전 List에 추가로 데이터가 들어갑니다.
즉 화면을 이동했다가 오면 List size가 처음부터 시작되는게 아니라 이전 List의 사이즈부터 시작합니다.
바꾼건 Live data에서 FLow밖에 없는데 왜이런걸까요..
DetailFragment
class WriteDetailFragment : Fragment() {
...
private val viewModel: WriteDetailViewModel by viewModels {
WriteDetailViewModelFactory(
(requireActivity().application as WorkoutApplication).writeDetailRepo
)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentWriteDetailBinding.inflate(inflater, container, false)
...
binding.apply {
// 세트 추가
addSet.setOnClickListener {
viewModel.addSet()
}
}
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
viewModel.items.collect { list ->
adapter.submitList(list)
}
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
ViewModel
class WriteDetailViewModel(
private val repository: WriteDetailRepository
): ViewModel() {
private var _items: MutableStateFlow<List<WorkoutSetInfo>> = MutableStateFlow(repository.getList())
val items = _items.asStateFlow()
fun changeUnit(unit: WorkoutUnit) {
repository.changeUnit(unit)
_items.value = repository.getList()
}
fun addSet() {
viewModelScope.launch(Dispatchers.IO) {
repository.add()
_items.value = repository.getList()
}
}
}
Repository
class WriteDetailRepository(val dao: WorkoutDao) {
private var setInfoList = arrayListOf(WorkoutSetInfo(set = 1)) // 세트 1개는 고정
private var updatedList = listOf<WorkoutSetInfo>()
get() = setInfoList.toList()
fun changeUnit(unit: WorkoutUnit) {
updatedList = setInfoList.map { setInfo ->
setInfo.copy(unit = unit)
}
}
fun add() {
val item = WorkoutSetInfo(set = setInfoList.size + 1)
setInfoList.add(item)
updatedList = setInfoList.toList()
}
fun getList() : List<WorkoutSetInfo> = updatedList
}
Application
class WorkoutApplication : Application() {
val database by lazy { WorkoutDatabase.getDatabase(this) }
val workoutListRepo by lazy { WorkoutListRepository(database.workoutDao()) }
val writeDetailRepo by lazy { WriteDetailRepository(database.workoutDao())
}