问题描述
我的 viewmodel
中有此函数,我想通过 get 请求检索位置列表。
但是当我从片段中调用函数 fetchAllLocations
时,该函数返回 null。但在 onResponse
方法中,列表位置不为空。我不知道为什么位置在 onResponse
方法之外为空。
fun fetchAllLocations(): List<Location>?
{
val call = apiInterface?.fetchAllLocation()
var locations: List<Location>? = null
call?.enqueue(object : Callback<List<Location>> {
override fun onResponse(call: Call<List<Location>>,response: Response<List<Location>>) {
locations = response.body()
}
override fun onFailure(call: Call<List<Location>>,t: Throwable) {
}
})
return locations
}
}
解决方法
在您的视图模型中添加此实时数据
val locationLiveData by lazy { MutableLiveData<<List<Location>>() }
fun fetchAllLocations(){
val call = apiInterface?.fetchAllLocation()
call?.enqueue(object : Callback<List<Location>> {
override fun onResponse(call: Call<List<Location>>,response: Response<List<Location>>) {
locations = response.body()
locationLiveData.postValue(locations)
}
override fun onFailure(call: Call<List<Location>>,t: Throwable) {}
})
}
}
从您的片段类中观察此实时数据。
viewModel.locationLiveData.observe(viewLifecycleOwner,Observer {
//here you will get list
})
参考项目:https://github.com/droiddevgeeks/MovieSearch (Java) https://github.com/droiddevgeeks/TrendingRepo(科特林)
,Retrofit run async processes ,所以你实际上返回了你的列表的初始值 null ,所以你需要使用 LiveData ,它是 Android Jetpack 的一部分,它使用类 Observer 类来观察数据的变化,您可以在您的案例中注册一个观察者并观察其值的变化,当发生这种情况时,您可以实际使用该数据。 更多信息可以查看官方docs