如果我移动到另一个片段然后我导航回具有视图模型的片段然后视图模型 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(...)