时隔半年,我又又又回来了!
继 KtArmor-MVP 版推出后,收获到 “不少人” 反响,期望有个 MVVM
版。
我便立马投入 KtArmor-MVVM的开发中,由于工作原因,开发断断续续。缺乏动力,和所谓的灵感
。 导致迟迟未能 推出 KtArmor-MVVM
版。
最近在 KtArmor-MVP 基础上有所突破,使得 KtArmor-MVVM
更加完美。希望大家喜欢~
KtArmor
寓意着 为Android 赋予战斗装甲
, 方便开发者快速进行Android 开发。节约开发者开发时间。
架构模式
: MVVM
+ Kotlin
+ Androidx
+ ViewModel
+ LiveData
网络请求
: Retrofit
+ Okhttp
+ Coroutine
+ RxJava
DataBinding
代码
:简洁优雅, 易扩展文档
: 有相关的KtArmor-MVVM 系列文档说明 (后续补充)功能
:
IActivity
、IFragment
IMvmActivity
、IMvmFragment
、BaseViewModel
、BaseRepository
封装BaseOkHttpClient
、BaseRetrofit
、RetrofitFactory
PlaceHolderView(占位布局)
, LoadingView(加载框)
KtWing
框架(SharedPreferences
、StartActivity
、Log
、Toast
(不重复显示))等一般而言,使用第三方框架都需要进行相关初始化操作。如下:
class BaseApplication: Application(){ override fun onCreate() { super.onCreate() // 初始化KtArmor (不再需要) // KtArmor.init(this, MyRetrofitConfig()) } } 复制代码
若无需定制 Retrofit
相关配置的话,KtArmor-MVVM 会自动初始化,无需手动 init
大部分的 Android 快速开发的脚手架,都是需要继承 BaseXXXActivity
、XXXActivity
等 Activity 封装的基类,但是这往往不能解决多继承
的问题,也这样大大限制了开发者自由,所以在 KtArmor-MVVM
框架中,采用了 接口
的形式,无需继承 BaseXXXActivity,实现对应接口(IActivity,IMvmActivity
) 即可,如下代码所示:
class LoginActivity : AppCompatActivity(), IMvmActivity { ^^ 看这里!! ...省略其他代码 } 复制代码
class LoginActivity : AppCompatActivity(), IMvmActivity { @BindViewModel // 看这里!! lateinit var viewModel: LoginViewModel //...省略其他 } 复制代码
通过 @BindViewModel
注解viewModel 变量,KtArmor-MVVM 通过反射
,自动创建 LoginViewModel
实例, 并赋值给 viewModel 变量。直接使用即可!
@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 动态切换的相关处理。
Androidx
, 所以如果不是Androidx的话, 引入会有兼容性
问题(会报错!).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
使用流程。
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("登录成功") }) } } 复制代码
1、新建一个 LoginActivity
类,并实现 IMvmActivity
“接口”
。
2、然后使用 @BindViewModel
绑定一个 ViewModel,KtArmor-MVVM 会自动注入赋值。
3、getLayoutId()方法,返回一个 R.layout.activity_login (布局id)
4、initListener()方法中设置 登录按钮事件 (mBtnLogin),通过 viewModel
来发起网络请求。
5、然后 在dataObserver()监听回调的结果即可。
然后我们再来看看, VM 层如何实现,也就是 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 } } } } 复制代码
BaseViewModel
,并传入 LoginRepository
,自动注入 LoginRepositoy 实例。quickLaunch<XXX>
方法是使用 DSL
方式发起网络请求repository
login 方法真正发起网络请求onSuccess()
方法 监听回调结果,并设置给 LoginData
最后,我们来看看 Repository 的处理。
// 注意这里! @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) } } 复制代码
@BaseUrl
注解,value 值为 baseUrl,其他按照正常 retrofit
使用即可。RetrofitFactory.create()
来创建对应 ApiService。RetrofitFactory封装了Retrofit
创建流程。KtArmor-MVVM
框架是一款小而美的框架,也是我个人经验的积累, 总结,希望大家喜欢。
如果你有更好的建议欢迎加入 QQ 群(373716660) 一起交流学习。
如有不妥, 望各位大佬指出。
至此,以上就是登录功能的全过程。这是 KtArmor-MVVM
开篇的第一篇,大概讲解了KtArmor-MVVM
基本用法。 后续会详细讲解框架的使用。后续也会陆续更新。敬请期待吧!
着急的小伙伴可以直接查看下文源码
~
下次再见