0

如果我移动到另一个片段然后我导航回具有视图模型的片段然后视图模型 livedata 为空但我不知道为什么。如果我知道正确,我不需要手动调用savedStateHandle.set来保存数据,因为savedStateHandle无论如何都会这样做。我将Place对象存储在 livedata 中,并且此类扩展了 Parcelable。

视图模型:

类 OverviewViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {

     companion object {
          private const val SAVED_All_PLACES_LIVEDATA_KEY = "savedAllPlacesLiveDataKey"
     }

     private val repository: PlacesRepository = PlacesRepository(this)

     private var allPlacesList: MutableList<Place> = mutableListOf()
     var allPlacesLiveData: MutableLiveData<MutableList<Place>> = savedStateHandle.getLiveData<MutableList<Place>>(SAVED_All_PLACES_LIVEDATA_KEY)

     fun getAllPlacesFromRepository(...)
          repository.getAllPlaces(...) //when successfully gets the data then call the viewmodel's addAllPlacesLiveData function
     }

     fun addAllPlacesLiveData(sites: List<Site>) {
          allPlacesList.clear()
          val places = mutableListOf<Place>()
          for(i in 0..9) {
               val site = sites[i]
               val distance = site.distance / 1000
               val place = Place(site.name, site.formatAddress, distance)
               places.add(place)
          }
          places.sortBy {
               it.distance
          }
          allPlacesList.addAll(places)
          allPlacesLiveData.value = allPlacesList
     
     }
}

地方:

@Parcelize
data class Place(
    var name: String = "",
    var address: String = "",
    var distance: Double = 0.0
) : Parcelable

我订阅 livedata 的更改,然后调用 getAll:

overviewViewModel.allPlacesLiveData.observe(viewLifecycleOwner) { places ->
            recyclerViewAdapter.submitList(places.toMutableList()) }


overviewViewModel.getAllPlacesFromRepository(...)
4

1 回答 1

1

您能否展示如何在 Fragment 中初始化 VM?

确保你发送savedState这样的:

private val viewModel: YourViewModel by viewModels {
        SavedStateViewModelFactory(requireActivity().application, this)
    }
于 2020-12-11T22:34:31.790 回答