瀏覽代碼

[feat]键盘插件,增加MVVM基类

hezihao 7 月之前
父節點
當前提交
330e5bf5a3

+ 20 - 0
plugins/keyboard_android/android/build.gradle

@@ -85,6 +85,26 @@ android {
         // 让Service支持Jetpack Lifecycle组件
         implementation "androidx.lifecycle:lifecycle-service:2.6.1"
 
+        // Retrofit
+        implementation('com.squareup.retrofit2:retrofit:2.9.0')
+        implementation('com.squareup.retrofit2:converter-gson:2.9.0')
+        implementation('com.squareup.okhttp3:logging-interceptor:3.4.1')
+
+        // 协程
+        implementation('org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0')
+        implementation('org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1')
+
+        // 使用拓展库
+        implementation("androidx.lifecycle:lifecycle-extensions:2.2.0")
+        // ViewModel拓展函数
+        implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7")
+        // 提供lifecycleScope支持
+        implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7")
+
+        // LiveData拓展函数
+        implementation("androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7")
+        implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.7")
+
         // Lottie动画
         implementation "com.airbnb.android:lottie:6.6.6"
 

+ 5 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/enums/ServerErrorCode.kt

@@ -5,6 +5,11 @@ package com.atmob.keyboard_android.enums
  */
 enum class ServerErrorCode(val code: Int) {
     /**
+     * 请求成功
+     */
+    SUCCESS(0),
+
+    /**
      * 需要VIP
      */
     NEED_VIP(1008),

+ 51 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/http/RetrofitManager.kt

@@ -0,0 +1,51 @@
+package com.atmob.keyboard_android.http
+
+import com.atmob.keyboard_android.util.LogUtil
+import okhttp3.Interceptor
+import okhttp3.OkHttpClient
+import okhttp3.logging.HttpLoggingInterceptor
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import java.util.concurrent.TimeUnit
+
+/**
+ * Retrofit网络请求的管理类
+ */
+object RetrofitManager {
+    private fun getOKHttpClient(timeout: Long): OkHttpClient {
+        // 日志打印拦截器
+        val logInterceptor = HttpLoggingInterceptor {
+            LogUtil.d("HttpLoggingInterceptor $it")
+        }.setLevel(HttpLoggingInterceptor.Level.BODY)
+
+        val interceptors: MutableList<Interceptor> = ArrayList()
+
+        // 添加自定义拦截器
+
+        val builder = OkHttpClient().newBuilder()
+            .callTimeout(timeout, TimeUnit.SECONDS)
+            .connectTimeout(timeout, TimeUnit.SECONDS)
+            .readTimeout(timeout, TimeUnit.SECONDS)
+            .writeTimeout(timeout, TimeUnit.SECONDS)
+            .retryOnConnectionFailure(true)
+            .followRedirects(false)
+            .addInterceptor(logInterceptor)
+
+        // 添加拦截器
+        builder.interceptors().addAll(interceptors)
+
+        return builder.build()
+    }
+
+    private fun getRetrofit(timeout: Long): Retrofit {
+        return Retrofit.Builder()
+            .client(getOKHttpClient(timeout))
+            .baseUrl("apiUrl")
+            .addConverterFactory(GsonConverterFactory.create())
+            .build()
+    }
+
+    fun <T> getService(service: Class<T>, timeout: Long = 10): T {
+        return getRetrofit(timeout).create(service)
+    }
+}

+ 36 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/model/base/BaseResp.kt

@@ -0,0 +1,36 @@
+package com.atmob.keyboard_android.model.base
+
+import androidx.annotation.Keep
+import java.io.Serializable
+
+/**
+ * 响应基类
+ */
+@Keep
+data class BaseResp<T>(
+    /**
+     * 响应码
+     */
+    val code: Int,
+    /**
+     * 消息
+     */
+    val message: String,
+    /**
+     * 数据
+     */
+    val data: T?
+) : Serializable {
+    companion object {
+        /**
+         * 错误响应
+         */
+        fun <T> errorResp(): BaseResp<T> {
+            return BaseResp<T>(
+                -1,
+                "请求失败,请稍后重试",
+                null
+            )
+        }
+    }
+}

+ 43 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/mvvm/base/BaseRepository.kt

@@ -0,0 +1,43 @@
+package com.atmob.keyboard_android.mvvm.base
+
+import com.atmob.keyboard_android.enums.ServerErrorCode
+import com.atmob.keyboard_android.model.base.BaseResp
+import retrofit2.HttpException
+import java.net.ConnectException
+import java.net.UnknownHostException
+
+/**
+ * Repository仓库基类
+ */
+open class BaseRepository {
+    /**
+     * 处理状态
+     */
+    fun <T> BaseResp<T>.handleState(): BaseResp<T> {
+        try {
+            when (this.code) {
+                // 请求成功
+                ServerErrorCode.SUCCESS.code -> {
+                }
+
+                ServerErrorCode.NO_LOGIN.code -> {
+                    // 未登录,清除token,跳转去登录页
+                }
+            }
+        } catch (e: Exception) {
+            when (e) {
+                is UnknownHostException,
+                is HttpException,
+                is ConnectException,
+                    -> {
+                    // 网络错误
+                }
+
+                else -> {
+                }
+            }
+        }
+
+        return this
+    }
+}

+ 32 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/mvvm/base/BaseViewModel.kt

@@ -0,0 +1,32 @@
+package com.atmob.keyboard_android.mvvm.base
+
+import androidx.lifecycle.DefaultLifecycleObserver
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
+
+/**
+ * 协程回调
+ */
+typealias block = suspend () -> Unit
+
+/**
+ * ViewModel基类
+ */
+open class BaseViewModel : ViewModel(), DefaultLifecycleObserver {
+    /**
+     * 开启一个协程
+     */
+    protected fun launch(
+        block: block
+    ): Job {
+        return viewModelScope.launch {
+            try {
+                block.invoke()
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        }
+    }
+}

+ 2 - 1
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/mvvm/repository/KeyboardRepository.kt

@@ -1,5 +1,6 @@
 package com.atmob.keyboard_android.mvvm.repository
 
+import com.atmob.keyboard_android.mvvm.base.BaseRepository
 import com.atmob.keyboard_android.util.bridge.FlutterBridgeManager
 import com.atmob.keyboard_android.util.bridge.model.base.EmptyResp
 import com.atmob.keyboard_android.util.bridge.model.req.SuperReplyReq
@@ -15,7 +16,7 @@ import com.atmob.keyboard_android.util.bridge.model.resp.SuperSpeakResp
 /**
  * 键盘Repository
  */
-class KeyboardRepository {
+class KeyboardRepository : BaseRepository() {
     /**
      * 用户是否已登录
      */

+ 2 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/mvvm/viewmodel/KeyboardViewModel.kt

@@ -2,10 +2,10 @@ package com.atmob.keyboard_android.mvvm.viewmodel
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
 import com.atmob.keyboard_android.enums.HelpMode
 import com.atmob.keyboard_android.enums.KeyboardGlobalType
 import com.atmob.keyboard_android.enums.KeyboardType
+import com.atmob.keyboard_android.mvvm.base.BaseViewModel
 import com.atmob.keyboard_android.mvvm.repository.KeyboardRepository
 import com.atmob.keyboard_android.util.LogUtil
 import com.atmob.keyboard_android.util.bridge.model.base.EmptyResp
@@ -20,7 +20,7 @@ import com.atmob.keyboard_android.util.error.ErrorHandler
 /**
  * 键盘ViewModel
  */
-class KeyboardViewModel : ViewModel() {
+class KeyboardViewModel : BaseViewModel() {
     /**
      * 仓库层
      */