android - 如何通过 ViewModel 从 Fragment 观察 Repository LiveData
问题描述
我很难弄清楚如何在请求的情况下连接我的Repository
和ViewModel
的实时数据@GET
并在片段中观察它们。
@POST
当请求类型是因为我可以Transformation.switchMap
在主体上使用并且每当主体更改时存储库的函数被调用并向响应实时数据发出值时,我没有这个问题,就像这样
val matchSetsDetail: LiveData<Resource<MatchDetailBean>> = Transformations.switchMap(matchIdLiveData) { matchId ->
val body = MatchSetRequest(matchId)
repository.getMatchSet(body)
}
但在@GET
请求的情况下,我有几个我的视图提供的查询参数
我在存储库类中有这个改造 API 调用,代码看起来像这样
class Repository {
fun checkInCheckOutUser(apiKey: String, userId: Int, status: String, latitude: Double, longitude: Double, checkedOn: Long): LiveData<Resource<BaseResponse>> = liveData {
emit(Resource.Loading())
try {
val response: Response<BaseResponse> = ApiClient.coachApi.checkInCheckOutUser(apiKey, userId, status, latitude, longitude, checkedOn)
if (response.isSuccessful && response.body() != null) {
if (response.body()!!.isValidKey && response.body()!!.success) {
emit(Resource.Success(response.body()!!))
} else {
emit(Resource.Failure(response.body()!!.message))
}
} else {
emit(Resource.Failure())
}
} catch (e: Exception) {
emit(Resource.Failure())
}
}
}
和ViewModel
class CheckInMapViewModel : ViewModel() {
val checkInResponse: LiveData<Resource<BaseResponse>> = MutableLiveData()
fun checkInCheckOut(apiKey: String, userId: Int, status: String, latitude: Double, longitude: Double, checkedOn: Long): LiveData<Resource<BaseResponse>> {
return repository.checkInCheckOutUser(apiKey,userId,status,latitude,longitude,checkedOn)
}
}
主要问题是我想以checkInResponse
与我在@POST
请求的情况下观察的方式相同的方式进行观察,但不知道如何传递观察存储库 LiveData,就像我在上面使用Transformations.switchMap
. 谁能帮我处理这个案子?
编辑 - 这是我要求的改装服务课程
interface CoachApi {
@POST(Urls.CHECK_IN_CHECK_OUT_URL)
suspend fun checkInCheckOutUser(
@Query("apiKey") apiKey: String,
@Query("userId") userId: Int,
@Query("status") status: String,
@Query("latitude") latitude: Double,
@Query("longitude") longitude: Double,
@Query("checkedOn") checkedOn: Long
): Response<SelfCheckResponse>
@POST(Urls.SELF_CHECK_STATUS)
suspend fun getCheckInStatus(
@Query("apiKey") apiKey: String,
@Query("userId") userId: Int
): Response<SelfCheckStatusResponse>
}
解决方案
Transformations.switchMap()
只是MediatorLiveData
利用。由于您的用例有点不同,您可以直接自己实现它。
class CheckInMapViewModel : ViewModel() {
private val _checkInResponse = MediatorLiveData<Resource<BaseResponse>>
val checkInResponse: LiveData<Resource<BaseResponse>> = _checkInResponse
fun checkInCheckOut(apiKey: String, userId: Int, status: String, latitude: Double, longitude: Double, checkedOn: Long) {
val data = repository.checkInCheckOutUser(apiKey,userId,status,latitude,longitude,checkedOn)
_checkInResponse.addSource(data) {
if (it is Resource.Success || it is Resource.Failure)
_checkInResponse.removeSource(data)
_checkInResponse.value = it
}
}
}
此代码假设data
只发出一个终端元素Resource.Success
或Resource.Failure
用它清理源。
推荐阅读
- java - 在 gradle 项目中使用 HttpUrlBuilder
- file - 编写Junit测试用例文件上传控制器
- html - 将两行垂直排列的 Button 组合在其中在 HTML 中
- c# - 带有数据模板的 WPF ListBox 样式
- python - 熊猫描述()没有显示
- python - python3.6创建venv时失败
- symfony - docker 容器中的 Symfony4 和 RabbitMQ
- java - try/catch 对 + if + switch 语句成立,break;在包含 switch 的 for 循环中包含 if 语句后需要,为什么?
- reactjs - undefined 不是一个对象。(评估“PropTypes.number”)
- php - 重定向后的Nodejs来一个带有错误URL的新请求