瀏覽代碼

@fun: data

bai 3 年之前
父節點
當前提交
4df0d9464a

+ 9 - 6
app/src/main/java/com/ys/bdtp/adm/mvvm/model/Data.kt

@@ -34,12 +34,15 @@ sealed interface State {
     object Failure : State
 }
 
-inline fun <ResultType, RequestType> data(
-    crossinline fromDb: () -> Flow<ResultType>,
-    noinline fromNt: suspend () -> Model<RequestType>,
-    crossinline success: suspend (RequestType) -> Unit,
-    crossinline failure: (Fail) -> Unit = {},
-    crossinline needNt: (ResultType) -> Boolean = { true }
+/**
+ * 数据请求框架
+ */
+fun <ResultType, RequestType> data(
+    fromDb: () -> Flow<ResultType>,
+    fromNt: suspend () -> Model<RequestType>,
+    needNt: (ResultType) -> Boolean = { true },
+    failure: (Fail) -> Unit = {},
+    success: suspend (RequestType) -> Unit,
 ): Flow<Data<ResultType>> = flow {
     emit(Data.loading())
     val data = fromDb().firstOrNull()

+ 29 - 3
app/src/main/java/com/ys/bdtp/adm/mvvm/model/Http.kt

@@ -4,12 +4,12 @@ package com.ys.bdtp.adm.mvvm.model
 /**
  * 网络请求
  *
- * @param block 请求方法
+ * @param request 请求方法
  * @return [Response] 请求结果封装
  */
-suspend fun <T> request(block: suspend () -> Model<T>): Response<T> {
+suspend fun <T> request(request: suspend () -> Model<T>): Response<T> {
     return try {
-        val model = block()
+        val model = request()
         if (model.result == "success") {
             Response.create(model.data)
         } else {
@@ -18,4 +18,30 @@ suspend fun <T> request(block: suspend () -> Model<T>): Response<T> {
     } catch (t: Throwable) {
         Response.create(Fail("catch", t.message ?: "request catch and nothing"))
     }
+}
+
+/**
+ * 网络请求
+ *
+ * @param request 请求数据
+ * @param success 请求成功
+ * @param failure 请求失败
+ *
+ */
+suspend fun <T> request(
+    request: suspend () -> Model<T>,
+    success: suspend (T) -> Unit,
+    failure: (Fail) -> Unit,
+) {
+    runCatching {
+        request()
+    }.onSuccess {
+        if (it.result == "success") {
+            success(it.data)
+        } else {
+            failure(Fail(it.result, it.message ?: "request ok, but no data"))
+        }
+    }.onFailure {
+        failure(Fail("catch", it.message ?: "request catch and nothing"))
+    }
 }

+ 1 - 1
app/src/main/java/com/ys/bdtp/adm/mvvm/model/nt/Api.kt

@@ -32,7 +32,7 @@ interface Api {
      * 获取字典数据
      */
     @POST("adm-server/adm/dict")
-    suspend fun getDict(@Body map: Map<String, String>): Model<Dict>
+    suspend fun getDict(@Body body: Map<String, String>): Model<Dict>
 
     /**
      * 获取配置信息

+ 9 - 9
app/src/main/java/com/ys/bdtp/adm/mvvm/ui/screen/offline/OfflineSide2.kt

@@ -39,17 +39,17 @@ fun OfflineSide2() {
         Button(
             modifier = Modifier.size(220.dp, 42.dp),
             onClick = {
-                scope.launch {
-                    vm.getDict(
-                        map = requestBody(),
-                        s = {
+                //scope.launch {
+                vm.getDict(
+                    body = requestBody(),
+                    success = {
 
-                        },
-                        f = {
+                    },
+                    failure = {
 
-                        }
-                    )
-                }
+                    }
+                )
+                //}
             },
             colors = ButtonDefaults.buttonColors(
                 contentColor = whiteColor,

+ 22 - 7
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/offline/OfflineRepository.kt

@@ -1,6 +1,9 @@
 package com.ys.bdtp.adm.mvvm.vm.offline
 
-import com.ys.bdtp.adm.mvvm.model.*
+import com.ys.bdtp.adm.mvvm.model.Fail
+import com.ys.bdtp.adm.mvvm.model.Model
+import com.ys.bdtp.adm.mvvm.model.Response
+import com.ys.bdtp.adm.mvvm.model.request
 import com.ys.bdtp.adm.mvvm.model.db.AdmDatabase
 import com.ys.bdtp.adm.mvvm.model.nt.Api
 import com.ys.bdtp.adm.mvvm.model.vo.Config
@@ -15,19 +18,31 @@ import kotlinx.coroutines.withContext
  */
 class OfflineRepository(
     private val api: Api,
-    private val db: AdmDatabase
+    private val db: AdmDatabase,
 ) {
+
     /**
      * 获取字典数据
      */
-    suspend fun getDict(map: Map<String, String>): Response<Dict> {
-        return withContext(Dispatchers.IO) {
-            request {
-                api.getDict(map)
-            }
+    suspend fun getDict(
+        body: Map<String, String>,
+        success: suspend (Dict) -> Unit,
+        failure: (Fail) -> Unit,
+    ) {
+        withContext(Dispatchers.IO) {
+            request(
+                request = { api.getDict(body) },
+                success = { dict ->
+                    success(dict)
+                },
+                failure = { fail ->
+                    failure(fail)
+                }
+            )
         }
     }
 
+
     /**
      * 获取配置数据
      */

+ 6 - 9
app/src/main/java/com/ys/bdtp/adm/mvvm/vm/offline/OfflineViewModel.kt

@@ -68,16 +68,13 @@ class OfflineViewModel(private val repo: OfflineRepository) : ViewModel() {
     /**
      * 获取字典
      */
-    fun getDict(map: Map<String, String>, s: (Dict) -> Unit, f: (Fail) -> Unit) {
+    fun getDict(body: Map<String, String>, success: (Dict) -> Unit, failure: (Fail) -> Unit) {
         viewModelScope.launch {
-            when (val response = repo.getDict(map)) {
-                is SuccessResponse -> {
-                    s(response.data)
-                }
-                is FailureResponse -> {
-                    f(response.fail)
-                }
-            }
+            repo.getDict(
+                body = body,
+                success = { success(it) },
+                failure = { failure(it) }
+            )
         }
     }
 }