liangjingkanji / Net

Android 基于协程/OkHttp网络请求工具
http://liangjingkanji.github.io/Net/
MIT License
1.87k stars 211 forks source link

请教一下 #50

Closed dingxiansen1 closed 2 years ago

dingxiansen1 commented 2 years ago

Net如何配合Flow在viewmodel里请求数据个BRV加载一页使用呢?我自己试了试,但是感觉没用对,用起来不得劲

liangjingkanji commented 2 years ago

这里使用Flow出于什么需求?

liangjingkanji commented 2 years ago

你不会是打算写:

viewModel里面写个作用域请求数据, 然后无论错误成功都封装到一个自定义liveData里面, 然后赋值给viewModel里面的liveData. 然后在activity监听该liveData. 根据liveData的数据来判断网络请求成功与否?

然后你听说liveData被废弃改用Flow实现?

这套写法我称之为 脱裤子放屁写法

dingxiansen1 commented 2 years ago

不是,我想把BRV列表的数据请求放到viewmodel里返回 fun getData() : List?= Get<List?>("list") { param("page", page) }.await()里面请求,但是get方法有必须要放进协程里,这样返回数据就有点麻烦了,Flow到是次要的,Flow就是为了处理返回的数据而已,之前说错了不是flow,是Flow

liangjingkanji commented 2 years ago

Demo里面有ViewModel使用示例 另外scope作用域本身不建议放到ViewModel, 特别是一些UI层的作用域.

liangjingkanji commented 2 years ago

kotlin协程相当于一个统一的回调. 你企图封装一个回调, 然后直接return结果.....这本身就是无法实现的

dingxiansen1 commented 2 years ago

我看了下,viewmodel里的使用事例是通过livedata来实现的,这样一次性数据好处理,但是加载下一页是不方便addData(),而不使用viewmodel来请求处理数据,直接把get放到onRefresh {scope {}}里面这样就会照成很代码很臃肿。因为要处理返回的数据

liangjingkanji commented 2 years ago

处理返回数据是由viewModel内部处理的

page.onRefresh {
   scope {
     val user = Get<UserData>("userInfo").await()
     addData(user.toListData())
   }
}
dingxiansen1 commented 2 years ago

所以我想把请求数据放到viewmodel层,或者是Repository层,然后把处理好的数据在返回到onRefresh {scope {}}里面add

liangjingkanji commented 2 years ago

你在activity调用一个函数处理数据不就可以了吗?

liangjingkanji commented 2 years ago

或者协程封装

suspend fun fetchUserInfo() = coroutineScope { 
    val response = Get<UserData>("userInfo").await()
    response.toListData()
} 
dingxiansen1 commented 2 years ago

这样确实可以,但是这就是mvc模式了。代码太臃肿了比如说我请求小说数据,我拿到小说数据后要处理章节,段落等格式,如果把这些都放到activity,就会非常庞大臃肿

liangjingkanji commented 2 years ago

我说的是调用函数, 没让写业务逻辑.

所谓访问函数/构造函数就是为了这种情况存在的

liangjingkanji commented 2 years ago

不是viewModel在activity里面调用了一个函数, 就算是mvc了. 感觉很多人思维僵化

那你vm.getData()是不是就算mvc了? 那你说下什么情况不算?

dingxiansen1 commented 2 years ago

哦,懂了,多谢大佬指教

dingxiansen1 commented 2 years ago

或者协程封装

suspend fun fetchUserInfo() = coroutineScope { 
    val response = Get<UserData>("userInfo").await()
    response.toListData()
} 

可以在这里面把response处理好了在返回对吧。多谢,我是新手上路还有很多不懂的地方,打扰到大佬,不好意思。多谢大佬的不吝赐教,万分感激

liangjingkanji commented 2 years ago

demo有更新, 可以看看. 有问题肯定就有需求, 互相探讨问题而已