hegaojian / JetpackMvvm

:chicken::basketball:一个Jetpack结合MVVM的快速开发框架,基于MVVM模式集成谷歌官方推荐的JetPack组件库:LiveData、ViewModel、Lifecycle、Navigation组件 使用Kotlin语言,添加大量拓展函数,简化代码 加入Retrofit网络请求,协程,帮你简化各种操作,让你快速开发项目
https://github.com/hegaojian/JetpackMvvm
Apache License 2.0
3.15k stars 614 forks source link

ResultState包装对象后,只能在observe拿到数据吗? #29

Closed ppg408331701 closed 4 years ago

ppg408331701 commented 4 years ago

比如我在viewmodel中定义了titleData,我会多次调用getProjectTitleData这个接口 var titleData: MutableLiveData<ResultState<ArrayList<ClassifyResponse>>> = MutableLiveData()

此时在getProjectTitleData()中我想先判断拿到 titleData中的ArrayList做一些操作,再决定是否继续调用网络请求。

但是目前被ResultState包装对象后,就拿不到resultState.data这个字段了。这个ResultState应该怎么写才能暴露出类似getData()这样的方法?

我看谷歌的文档 https://developer.android.google.cn/jetpack/docs/guide#addendum 似乎也是这样,感觉很不方便啊

ppg408331701 commented 4 years ago

titleData只是举个例子,这个需求就是某个列表页的数据会缓存一段时间,我希望能判断缓存是否过期,不过期直接返回上一次的数据,否则请求网络

hegaojian commented 4 years ago

可以看下文档,框架提供了2种请求方式 ,1种是直接回调在activity/fragment,就是你刚刚说的那种,还有1种是在当前viewmodel直接拿到结果做你想要的操作 示例:

class xxxViewModel : BaseViewModel() {
  fun login(username: String, password: String){
     request({HttpRequestManger.instance.login(username,password)},{
             //请求成功 已自动处理了 请求结果是否正常
             it.username.logd()
         },{
             //请求失败 网络异常,或者请求结果码错误都会回调在这里
             it.errorMsg.logd()
         },true,"正在登录中...")
}
ppg408331701 commented 4 years ago

我有点希望实现的是这个效果

 var titleData: MutableLiveData<ResultState<ArrayList<ClassifyResponse>>> = MutableLiveData()

    fun getProjectTitleData() {
        if (titleData.data.size>0){
            titleData.value = ResultState.onAppSuccess(titleData.value);
        }else{
            request({ HttpRequestManger.apiService.getProjecTitle() }, titleData)
        }
    }
hegaojian commented 4 years ago

可以看下文档,框架提供了2种请求方式 ,1种是直接回调在activity/fragment,就是你刚刚说的那种,还有1种是在当前viewmodel直接拿到结果做你想要的操作 示例:

class xxxViewModel : BaseViewModel() {
  fun login(username: String, password: String){
     request({HttpRequestManger.instance.login(username,password)},{
             //请求成功 已自动处理了 请求结果是否正常
             it.username.logd()
         },{
             //请求失败 网络异常,或者请求结果码错误都会回调在这里
             it.errorMsg.logd()
         },true,"正在登录中...")
}
ppg408331701 commented 4 years ago

ok。我再研究一下。谢谢啦

ppg408331701 commented 4 years ago
 fun getProjectTitleData() {
        when (titleData.value) {
            is ResultState.Success -> {
                LogUtils.e("Success")
                titleData.value = titleData.value;
            }
            else -> {
                LogUtils.e("un--Success")
                request({ HttpRequestManger.apiService.getProjecTitle() }, titleData)
            }
        }
    }

我研究出来了,我目前这是这样做,如果之前titleData成功请求过一次,就一直用第一次的数据,

这样场景主要是弹出来类的列表dialog,比如弹出收货地址之类的