新鮮出爐的 MVVM 腳手架 —— KtArmor-MVVM

前言

時隔半年,我又又又回來了!java

KtArmor-MVP 版推出後,收穫到 「很多人」 反響,指望有個 MVVM 版。git

我便立馬投入 KtArmor-MVVM的開發中,因爲工做緣由,開發斷斷續續。缺少動力,和所謂的靈感。 致使遲遲未能 推出 KtArmor-MVVM 版。github

最近在 KtArmor-MVP 基礎上有所突破,使得 KtArmor-MVVM 更加完美。但願你們喜歡~api

什麼是KtArmor ?

KtArmor 寓意着 爲Android 賦予戰鬥裝甲, 方便開發者快速進行Android 開發。節約開發者開發時間。bash

  • 架構模式: MVVM + Kotlin + Androidx + ViewModel + LiveData
  • 網絡請求: Retrofit + Okhttp + Coroutine + RxJava + DataBinding
  • 代碼:簡潔優雅, 易擴展
  • 文檔: 有相關的KtArmor-MVVM 系列文檔說明 (後續補充)
  • 功能:
    • 基本IActivityIFragment
    • MVVM框架封裝 IMvmActivityIMvmFragmentBaseViewModelBaseRepository封裝
    • 網絡請求封裝 BaseOkHttpClientBaseRetrofitRetrofitFactory
    • 經常使用控件PlaceHolderView(佔位佈局)LoadingView(加載框)
    • 經常使用擴展封裝 KtWing 框架(SharedPreferencesStartActivityLogToast(不重複顯示))等
    • ....

亮點1——無需初始化

通常而言,使用第三方框架都須要進行相關初始化操做。以下:網絡

class BaseApplication: Application(){

    override fun onCreate() {
        super.onCreate()

        // 初始化KtArmor (再也不須要)
        // KtArmor.init(this, MyRetrofitConfig()) 
    }
}
複製代碼

若無需定製 Retrofit 相關配置的話,KtArmor-MVVM 會自動初始化,無需手動 init架構

亮點2——無需繼承

大部分的 Android 快速開發的腳手架,都是須要繼承 BaseXXXActivityXXXActivity 等 Activity 封裝的基類,可是這每每不能解決多繼承的問題,也這樣大大限制了開發者自由,因此在 KtArmor-MVVM 框架中,採用了 接口的形式,無需繼承 BaseXXXActivity,實現對應接口(IActivity,IMvmActivity) 便可,以下代碼所示:app

class LoginActivity : AppCompatActivity(), IMvmActivity {
                                            ^^ 看這裏!!
    ...省略其餘代碼
}
複製代碼

亮點3——自動「注入」

@BindViewModel

class LoginActivity : AppCompatActivity(), IMvmActivity {
                
    @BindViewModel  // 看這裏!!
    lateinit var viewModel: LoginViewModel

    //...省略其餘
}
複製代碼

經過 @BindViewModel 註解viewModel 變量,KtArmor-MVVM 經過反射,自動建立 LoginViewModel實例, 並賦值給 viewModel 變量。直接使用便可!框架

@BaseUrl

@BaseUrl(API.BASE_URL)  // 看這裏!!
interface ApiService {
    @POST(API.LOGIN)
    suspend fun login(@Query("username") username: String, @Query("password") password: String): BaseResponse<LoginRsp>
}
複製代碼

咱們一般使用Retrofit 的時候,都會建立對應 Service 接口類, 經過在 Service 上 標識 @BaseUrl 註解,並傳入 對應 baseUrl,KtArmor-MVVM 就會將 baseUrl 「注入」 到 Retrfit 中。目前只是針對單個 baseUrl, 後續將考慮多個 baseUrl 動態切換的相關處理。maven

KtArmor-MVVM框架引入

注意!

  • 因爲採用了Androidx, 因此若是不是Androidx的話, 引入會有兼容性問題(會報錯!).
  • 版本: minSdkVersion 19

如下默認是Androidx 項目下引入

先在 build.gradle(Project:XXXX) 的 repositories 添加:

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}
複製代碼

而後在 build.gradle(Module:app) 的 dependencies 添加:

implementation 'com.hyzhan:KtArmor:1.0.7' //最新版本
複製代碼

快速上手

咱們先從一個 簡單登陸功能來熟悉一下 KtArmor-MVVM 使用流程。

LoginActivity

class LoginActivity : AppCompatActivity(), IMvmActivity {

    @BindViewModel
    lateinit var viewModel: LoginViewModel

    override fun getLayoutId(): Int = R.layout.activity_login

    override fun initListener() {
        mBtnLogin.setOnClickListener {
            viewModel.login(mEtAccount.str(), mEtPassword.str())
        }
    }

    override fun dataObserver() {
        viewModel.loginData.observe(this, Observer {
            toast("登陸成功")
        })
    }
}
複製代碼
  • 一、新建一個 LoginActivity 類,並實現 IMvmActivity 「接口」

  • 二、而後使用 @BindViewModel 綁定一個 ViewModel,KtArmor-MVVM 會自動注入賦值。

  • 三、getLayoutId()方法,返回一個 R.layout.activity_login (佈局id)

  • 四、initListener()方法中設置 登陸按鈕事件 (mBtnLogin),經過 viewModel 來發起網絡請求。

  • 五、而後 在dataObserver()監聽回調的結果便可。

而後咱們再來看看, VM 層如何實現,也就是 LoginViewModel。

LoginViewModel

class LoginViewModel : BaseViewModel<LoginRepository>() {

    val loginData = MutableLiveData<LoginRsp>()

    fun login(account: String, password: String) {
        
        // 校驗參數
        if (TextUtils.isEmpty(account) || TextUtils.isEmpty(password)) {
            showToast(R.string.account_or_password_empty)
            return
        }

        // DSL 方式發起 網絡請求
        quickLaunch<LoginRsp> {

            onStart { showLoading() }
            
            request { repository.login(account, password) }

            onSuccess { loginData.value = it }
        }
    }
}
複製代碼
  • 需建立 LoginViewModel類,繼承BaseViewModel,並傳入 LoginRepository,自動注入 LoginRepositoy 實例。
  • quickLaunch<XXX> 方法是使用 DSL 方式發起網絡請求
  • repository login 方法真正發起網絡請求
  • onSuccess() 方法 監聽回調結果,並設置給 LoginData

最後,咱們來看看 Repository 的處理。

LoginRepository

// 注意這裏!
@BaseUrl(API.BASE_URL)
interface ApiService {
    @POST(API.LOGIN)
    suspend fun login(@Query("username") username: String, @Query("password") password: String): BaseResponse<LoginRsp>
}

// ServiceFactory.kt
object ServiceFactory {
    // 初始化 ApiService
    val apiService by lazy { RetrofitFactory.create(ApiService::class.java) }
}

// LoginRepository.kt
class LoginRepository {
    suspend fun login(account: String, password: String): BaseResponse<LoginRsp> {
        return ServiceFactory.apiService.login(account, password)
    }
}
複製代碼
  • 建立一個 ApiService,這裏須要在class 類上 設置 @BaseUrl 註解,value 值爲 baseUrl,其餘按照正常 retrofit 使用便可。
  • 而後使用 RetrofitFactory.create() 來建立對應 ApiService。RetrofitFactory封裝了Retrofit 建立流程。
  • 最後 在LoginRepository 中便可使用 ServiceFactory.apiService.login 來發起網絡請求便可。

期待

KtArmor-MVVM 框架是一款小而美的框架,也是我我的經驗的積累, 總結,但願你們喜歡。

若是你有更好的建議歡迎 pr,issues 一塊兒交流學習。

若有不妥, 望各位大佬指出。

未完待續

至此,以上就是登陸功能的全過程。這是 KtArmor-MVVM 開篇的第一篇,大概講解了KtArmor-MVVM 基本用法。 後續會詳細講解框架的使用。後續也會陸續更新。敬請期待吧!

着急的小夥伴能夠直接查看下文源碼~

KtArmor-MVVM 源碼傳送門

其餘相關

Kotlin的魔能機甲——KtArmor(一)

Kotlin的魔能機甲——KtArmor插件篇(二)

Kotlin的魔能機甲——KtArmor(三)

Kotlin的魔能機甲——KtArmor網絡調用封裝(四)

下次再見

相關文章
相關標籤/搜索