MVVMLin一個基於Jatpack+Kotlin+協程+Retrofit的快速開發框架

MVVMLin

一個基於MVVM用Kotlin+Retrofit+協程+Databinding+LiveData來封裝的快速開發框架: 項目地址:MVVMLinjava

Github上關於MVVM的框架也很多,以前一直在用RxJava +Retrofit 用MVP模式來作項目,如今AndroidX 是大勢所趨,Kotlin已經成官方語言兩年了,今年GoogleIO大會又出了新東西,哎~~~~學不動了呀。近期項目不太忙,把這幾個新東西結合起來,封裝了一個MVVM的框架,分享出來給你們獻醜了。 拋棄了強大的RxJava,內心仍是有點虛的。android

框架簡介

  • 使用技術 基於MVVM模式用了 kotlin+協程+retrofit+livedata+DataBinding,默認使用了AndroidX
  • 基本封裝 封裝了BaseActivity、BaseFragment、BaseViewModel基於協和的網絡請方式更加方便,考慮到有些小夥伴不太喜歡用DataBinding在xml中綁定數據的方式,也提供了相應的適配,兩種方式自行選擇。Retrofit2.6提供了對協程的支持,使用起來更加方便,不用考慮類型的轉換了。
  • 特色 使用Rxjava 處理很差的話會有內存泄露的風險,咱們會用使用AutoDispose、RxLifecycle等方式來處理,可是使用協程來請求數據,徹底不用擔憂這個問題,全部請求都是在viewModelScope中啓動,當頁面銷燬的時候,會統一取消,不用關心這個問題了。用Kotlin封裝,大量語法糖可以使用。
  • 引入第三方庫 AndroidUtilCode:包含了大量的經常使用工具類,簡直是必備神器啊。 material-dialogs:彈窗 glide:圖片加載 Retrofit:網絡請求

1,如何使用

1.1 啓用databinding

在主工程app的build.gradle的android {}中加入:git

dataBinding {
    enabled true
}
複製代碼

1.2 依賴

在主項目app的build.gradle中依賴github

dependencies {
    ...
   implementation 'me.aleyn:MVVMLin:1.0'
}
複製代碼

或者 下載到本地導入Modulebash

1.3 配置依賴版本文件 config.gradle

複製Demo的 config,gradle 到要目錄,在項目的build.gradle 中加入:網絡

apply from: "config.gradle"
複製代碼

2,快速開始

2.1Activity

繼承BaseActivityapp

class DetailActivity : BaseActivity<NoViewModel, ViewDataBinding>() {
	override fun layoutId() = R.layout.activity_detail
	
	override fun initView(savedInstanceState: Bundle?) {
       ....
    }

    override fun initData() {
      ....
    }
}
複製代碼

第一個泛型是VIewModel,若是頁面很簡單不須要ViewModel,直接傳入NoViewModel便可。 第二個泛型是Databinding,若是頁面使用Databinding的話,就要傳對應生成的Binding類,若是這個頁面不使用DataBinding,傳ViewDataBinding,基類不會初始化mBinding而會使用**setContentView(l)**方式。 layoutId() 方法返回對應佈局 initView()initData() 爲默認實現,作初始化UI等操做框架

2.2 Fragment

繼承BaseFragmentide

class HomeFragment : BaseFragment<HomeViewModel, ViewDataBinding>() {
		override fun layoutId() = R.layout.home_fragment
		override fun initView(savedInstanceState: Bundle?) {  }
		override fun lazyLoadData() { 
			....
		}
}
複製代碼

實現方法同Activity同樣,Fragment多了懶加載方法lazyLoadData() 可選擇性重寫。 setUserVisibleHint() 方法已經被棄用,懶加載使用新的方式實現。工具

一樣Fragment中若是想不使用Databinding,泛型傳ViewDataBinding

2,使用DataBinding,佈局文件:

<layout>
    <data>
    .....
    </data>
    .....
</layout>
複製代碼

泛型傳對應生成Binding類:

class ProjectFragment : BaseFragment<ProjectViewModel, ProjectFragmentBinding>() {
		.........
}
複製代碼
2.3 ViewModel

繼承BaseViewModel

class HomeViewModel : BaseViewModel() {
		.........
}
複製代碼

若是一個頁面內容不多,不須要ViewModel,咱們可能不想再建一個ViewModel類,泛型傳NoViewModel便可。 BaseVIewModel 中對協程進行了簡單封裝,BaseViewMode 已經作了對網絡請求異常的統一處理。好比咱們的網絡請求能夠這樣寫:

class HomeViewModel : BaseViewModel() {
    private val homeRepository by lazy { InjectorUtil.getHomeRepository() }
    val mBanners = MutableLiveData<List<BannerBean>>()
    fun getBanner() {
    	//只返回結果,其餘全拋自定義異常
        launchOnlyresult({ homeRepository.getBannerData() }, {
            mBanners.value = it
        })
    }
}
複製代碼

那若是咱們想本身處理錯誤怎麼辦?

class HomeViewModel : BaseViewModel() {
    private val homeRepository by lazy { InjectorUtil.getHomeRepository() }
    val mBanners = MutableLiveData<List<BannerBean>>()
    fun getBanner() {
        launchOnlyresult({ homeRepository.getBannerData() }, {
            mBanners.value = it
        },{
         // 這裏是Error 返回   ()
        })
    }
}
複製代碼

只須要加一個方法參數就好了。

另外一種不過濾返回結果的方式:

class MeViewModel : BaseViewModel() {
    private val homeRepository by lazy { InjectorUtil.getHomeRepository() }
    var popularWeb = MutableLiveData<List<UsedWeb>>()
    fun getPopularWeb() {
        launch({
            val result = homeRepository.getPopularWeb()  //
            if (result.isSuccess()) {
                popularWeb.value = result.data
            }
        })
    }
}
複製代碼

要本身處理Error 跟上面同樣,加一個方法參數就好了。

每一個網絡請求都會加等待框,若是咱們不想要等待框:

fun getProjectType() {
        launchOnlyresult({
            homeRepository.getNaviJson()
        }, {
            navData.addAll(it)
            it.forEach { item ->
                navTitle.add(item.name)
            }
        }, isShowDialog = false)
 }
複製代碼

isShowDialog 傳false,默認是true

3,例子

Demo中只展現了三種列表使用方式

3.1 不使用Databinging,結合BRVAH

詳見Demo的 HomeFragment

3.2 使用Databinging,結合bindingcollectionadapter

結合bindingcollectionadapter不用寫Adapter適配器了,詳見Demo的 ProjectFragment

3.2 使用Databinging,結合BRVAH

BRVAH 對DataBinding也作了支持,詳見Demo的 MeFragment

4,關於框架

剛剛完成1.0版,也算是我對新東西的一個學習過程,問題應該仍是挺多的,後續會進一步完善,下一步會考慮把Eventbus加進去,也歡迎你們多提意見。順手給個Stat。哈哈~~~~~~

相關文章
相關標籤/搜索