時隔半年,我又又又回來了!java
繼 KtArmor-MVP 版推出後,收穫到 「很多人」 反響,指望有個 MVVM
版。git
我便立馬投入 KtArmor-MVVM的開發中,因爲工做緣由,開發斷斷續續。缺少動力,和所謂的靈感
。 致使遲遲未能 推出 KtArmor-MVVM
版。github
最近在 KtArmor-MVP 基礎上有所突破,使得 KtArmor-MVVM
更加完美。但願你們喜歡~api
KtArmor
寓意着 爲Android 賦予戰鬥裝甲
, 方便開發者快速進行Android 開發。節約開發者開發時間。bash
架構模式
: 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
) 便可,以下代碼所示:app
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 動態切換的相關處理。maven
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("登陸成功")
})
}
}
複製代碼
一、新建一個 LoginActivity
類,並實現 IMvmActivity
「接口」
。
二、而後使用 @BindViewModel
綁定一個 ViewModel,KtArmor-MVVM 會自動注入賦值。
三、getLayoutId()方法,返回一個 R.layout.activity_login (佈局id)
四、initListener()方法中設置 登陸按鈕事件 (mBtnLogin),經過 viewModel
來發起網絡請求。
五、而後 在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
框架是一款小而美的框架,也是我我的經驗的積累, 總結,但願你們喜歡。
若是你有更好的建議歡迎 pr,issues 一塊兒交流學習。
若有不妥, 望各位大佬指出。
至此,以上就是登陸功能的全過程。這是 KtArmor-MVVM
開篇的第一篇,大概講解了KtArmor-MVVM
基本用法。 後續會詳細講解框架的使用。後續也會陸續更新。敬請期待吧!
着急的小夥伴能夠直接查看下文源碼
~
下次再見