Modify: 基类进一步封装
This commit is contained in:
@ -63,7 +63,7 @@ dependencies {
|
||||
api GitHub.RetrofitConverterGson
|
||||
api GitHub.Gson
|
||||
api GitHub.MMKV
|
||||
api GitHub.AutoSize
|
||||
// api GitHub.AutoSize
|
||||
api GitHub.Glide
|
||||
api GitHub.ARoute
|
||||
api GitHub.RecyclerViewAdapter
|
||||
|
||||
@ -9,4 +9,8 @@ import android.app.Application
|
||||
* @Remark: 自定义Application的基类
|
||||
*/
|
||||
open class BaseApplication : Application() {
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
package com.quyunshuo.base.mvvm.m
|
||||
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.flow.FlowCollector
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.coroutines.flow.flowOn
|
||||
|
||||
/**
|
||||
* @Author: QuYunShuo
|
||||
* @Time: 2020/8/27
|
||||
* @Class: BaseRepository
|
||||
* @Remark: 仓库层 Repository 基类
|
||||
*/
|
||||
open class BaseRepository {
|
||||
|
||||
/**
|
||||
* 发起请求封装
|
||||
* @param requestBlock 请求的整体逻辑
|
||||
* @return Flow<T>
|
||||
*/
|
||||
protected suspend fun <T> flowRequest(requestBlock: suspend FlowCollector<T>.() -> Unit) =
|
||||
flow {
|
||||
requestBlock()
|
||||
}.flowOn(Dispatchers.IO) // 通过 flowOn 切换到 io 线程
|
||||
}
|
||||
@ -1,7 +1,9 @@
|
||||
package com.quyunshuo.base.ui
|
||||
package com.quyunshuo.base.mvvm.v
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.viewbinding.ViewBinding
|
||||
|
||||
/**
|
||||
@ -10,13 +12,17 @@ import androidx.viewbinding.ViewBinding
|
||||
* @Class: BaseFrameActivity
|
||||
* @Remark: Activity基类 与项目无关
|
||||
*/
|
||||
abstract class BaseFrameActivity<VB : ViewBinding> : AppCompatActivity() {
|
||||
abstract class BaseFrameActivity<VB : ViewBinding, VM : ViewModel>(private val vmClass: Class<VM>) :
|
||||
AppCompatActivity() {
|
||||
|
||||
lateinit var mBinding: VB
|
||||
protected val mViewModel: VM by lazy(mode = LazyThreadSafetyMode.NONE) {
|
||||
ViewModelProvider(this).get(vmClass)
|
||||
}
|
||||
|
||||
protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) { initViewBinding() }
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
mBinding = initViewBinding()
|
||||
setContentView(mBinding.root)
|
||||
initView()
|
||||
}
|
||||
@ -0,0 +1,43 @@
|
||||
package com.quyunshuo.base.mvvm.v
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.viewbinding.ViewBinding
|
||||
|
||||
/**
|
||||
* @Author: QuYunShuo
|
||||
* @Time: 2020/8/27
|
||||
* @Class: BaseFrameFragment
|
||||
* @Remark: Fragment基类 与项目无关
|
||||
*/
|
||||
abstract class BaseFrameFragment<VB : ViewBinding, VM : ViewModel>(private val vmClass: Class<VM>) :
|
||||
Fragment() {
|
||||
|
||||
protected val mViewModel: VM by lazy(mode = LazyThreadSafetyMode.NONE) {
|
||||
ViewModelProvider(this).get(vmClass)
|
||||
}
|
||||
|
||||
protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) { initViewBinding() }
|
||||
|
||||
protected abstract fun initViewBinding(): VB
|
||||
|
||||
protected abstract fun initView()
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
return mBinding.root
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
initView()
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,17 @@
|
||||
package com.quyunshuo.base.mvvm.vm
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import com.quyunshuo.base.mvvm.m.BaseRepository
|
||||
|
||||
/**
|
||||
* @Author: QuYunShuo
|
||||
* @Time: 2020/8/27
|
||||
* @Class: BaseViewModel
|
||||
* @Remark: ViewModel 基类
|
||||
*/
|
||||
abstract class BaseViewModel<R : BaseRepository> : ViewModel() {
|
||||
|
||||
protected val mRepository: R by lazy { initRepository() }
|
||||
|
||||
protected abstract fun initRepository(): R
|
||||
}
|
||||
@ -1,12 +0,0 @@
|
||||
package com.quyunshuo.base.ui
|
||||
|
||||
import androidx.fragment.app.Fragment
|
||||
|
||||
/**
|
||||
* @Author: QuYunShuo
|
||||
* @Time: 2020/8/27
|
||||
* @Class: BaseFrameFragment
|
||||
* @Remark: Fragment基类 与项目无关
|
||||
*/
|
||||
abstract class BaseFrameFragment : Fragment() {
|
||||
}
|
||||
@ -1,10 +0,0 @@
|
||||
package com.quyunshuo.base.ui
|
||||
|
||||
/**
|
||||
* @Author: QuYunShuo
|
||||
* @Time: 2020/8/27
|
||||
* @Class: BaseRepository
|
||||
* @Remark: 仓库层 Repository 基类
|
||||
*/
|
||||
open class BaseRepository {
|
||||
}
|
||||
@ -1,12 +0,0 @@
|
||||
package com.quyunshuo.base.ui
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
|
||||
/**
|
||||
* @Author: QuYunShuo
|
||||
* @Time: 2020/8/27
|
||||
* @Class: BaseViewModel
|
||||
* @Remark: ViewModel 基类
|
||||
*/
|
||||
open class BaseViewModel : ViewModel() {
|
||||
}
|
||||
@ -1,7 +1,7 @@
|
||||
<resources>
|
||||
|
||||
<!-- Base application theme. -->
|
||||
<style name="base_AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||
<style name="base_AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||
<!-- Customize your theme here. -->
|
||||
<item name="colorPrimary">@color/base_colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/base_colorPrimaryDark</item>
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
package com.quyunshuo.common.ui
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.viewbinding.ViewBinding
|
||||
import com.quyunshuo.base.ui.BaseFrameActivity
|
||||
import com.quyunshuo.base.mvvm.v.BaseFrameActivity
|
||||
|
||||
/**
|
||||
* @Author: QuYunShuo
|
||||
@ -9,4 +10,5 @@ import com.quyunshuo.base.ui.BaseFrameActivity
|
||||
* @Class: BaseActivity
|
||||
* @Remark: 项目相关的Activity基类
|
||||
*/
|
||||
abstract class BaseActivity<VB : ViewBinding> : BaseFrameActivity<VB>()
|
||||
abstract class BaseActivity<VB : ViewBinding, VM : ViewModel>(vmClass: Class<VM>) :
|
||||
BaseFrameActivity<VB, VM>(vmClass)
|
||||
@ -1,6 +1,8 @@
|
||||
package com.quyunshuo.common.ui
|
||||
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.viewbinding.ViewBinding
|
||||
import com.quyunshuo.base.mvvm.v.BaseFrameFragment
|
||||
|
||||
/**
|
||||
* @Author: QuYunShuo
|
||||
@ -8,5 +10,5 @@ import androidx.fragment.app.Fragment
|
||||
* @Class: BaseFragment
|
||||
* @Remark: 项目相关的Fragment基类
|
||||
*/
|
||||
abstract class BaseFragment : Fragment() {
|
||||
}
|
||||
abstract class BaseFragment<VB : ViewBinding, VM : ViewModel>(vmClass: Class<VM>) :
|
||||
BaseFrameFragment<VB, VM>(vmClass)
|
||||
@ -1,5 +1,6 @@
|
||||
package com.quyunshuo.main
|
||||
|
||||
import android.widget.Toast
|
||||
import com.quyunshuo.common.ui.BaseActivity
|
||||
import com.quyunshuo.main.databinding.MainActivityMainBinding
|
||||
|
||||
@ -9,12 +10,17 @@ import com.quyunshuo.main.databinding.MainActivityMainBinding
|
||||
* @Class: MainActivity
|
||||
* @Remark: 主界面Activity
|
||||
*/
|
||||
class MainActivity : BaseActivity<MainActivityMainBinding>() {
|
||||
class MainActivity :
|
||||
BaseActivity<MainActivityMainBinding, MainViewModel>(MainViewModel::class.java) {
|
||||
|
||||
override fun initViewBinding(): MainActivityMainBinding =
|
||||
MainActivityMainBinding.inflate(layoutInflater)
|
||||
|
||||
override fun initView() {
|
||||
mBinding.mTv.text = "Hello MVVM"
|
||||
mViewModel.msg.observe(this, {
|
||||
mBinding.mTv.text = it
|
||||
Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
|
||||
})
|
||||
mBinding.mBtn.setOnClickListener { mViewModel.getString() }
|
||||
}
|
||||
}
|
||||
20
Lib_Main/src/main/java/com/quyunshuo/main/MainRepository.kt
Normal file
20
Lib_Main/src/main/java/com/quyunshuo/main/MainRepository.kt
Normal file
@ -0,0 +1,20 @@
|
||||
package com.quyunshuo.main
|
||||
|
||||
import com.quyunshuo.base.mvvm.m.BaseRepository
|
||||
|
||||
/**
|
||||
* @Author: QuYunShuo
|
||||
* @Time: 2020/8/28
|
||||
* @Class: MainRepository
|
||||
* @Remark:
|
||||
*/
|
||||
class MainRepository : BaseRepository() {
|
||||
|
||||
/**
|
||||
* 模拟请求或读取数据库
|
||||
*/
|
||||
suspend fun getString() =
|
||||
flowRequest<String> {
|
||||
emit("嘿嘿")
|
||||
}
|
||||
}
|
||||
29
Lib_Main/src/main/java/com/quyunshuo/main/MainViewModel.kt
Normal file
29
Lib_Main/src/main/java/com/quyunshuo/main/MainViewModel.kt
Normal file
@ -0,0 +1,29 @@
|
||||
package com.quyunshuo.main
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.quyunshuo.base.mvvm.vm.BaseViewModel
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.flow.collectLatest
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
/**
|
||||
* @Author: QuYunShuo
|
||||
* @Time: 2020/8/28
|
||||
* @Class: MainViewModel
|
||||
* @Remark:
|
||||
*/
|
||||
class MainViewModel : BaseViewModel<MainRepository>() {
|
||||
|
||||
val msg: MutableLiveData<String> = MutableLiveData<String>()
|
||||
|
||||
override fun initRepository(): MainRepository = MainRepository()
|
||||
|
||||
fun getString() {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
mRepository.getString().collectLatest {
|
||||
msg.postValue(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -15,4 +15,13 @@
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/mBtn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="获取值"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/mTv" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
Reference in New Issue
Block a user