新鲜出炉的 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网络调用封装(四)

下次再见

相关文章
相关标签/搜索