refactor(frame): 优化框架

- 添加和优化扩展方法
- 优化屏幕适配兼容性问题
This commit is contained in:
Quyunshuo
2021-09-26 22:18:41 +08:00
parent 4b705ef9c2
commit 086078f618
16 changed files with 325 additions and 343 deletions

View File

@@ -43,7 +43,6 @@ dependencies {
api DependencyConfig.GitHub.AutoSize
api DependencyConfig.GitHub.ARoute
api DependencyConfig.GitHub.RecyclerViewAdapter
api DependencyConfig.GitHub.StatusBar
api DependencyConfig.GitHub.EventBus
api DependencyConfig.GitHub.PermissionX
api DependencyConfig.GitHub.AutoService

View File

@@ -4,16 +4,18 @@ import android.text.InputFilter
import android.widget.EditText
/**
* @Author: QuYunShuo
* @Time: 2020/9/17
* @Class: EditTextKtx
* @Remark: EditText相关扩展方法
* EditText相关扩展方法
*
* @author Qu Yunshuo
* @since 2020/9/17
*/
/**
* 过滤掉空格和回车
*/
fun EditText.filterBlankAndCarriageReturn() {
this.filters =
arrayOf(InputFilter { source, _, _, _, _, _ -> if (source == " " || source == "\n") "" else null })
val filterList = mutableListOf<InputFilter>()
filterList.addAll(filters)
filterList.add(InputFilter { source, _, _, _, _, _ -> if (source == " " || source == "\n") "" else null })
filters = filterList.toTypedArray()
}

View File

@@ -9,10 +9,10 @@ import androidx.lifecycle.LiveData
* 使用示例
* ```
* override fun initObserve() {
* observe(mViewModel.stateViewLD, ::stateViewLivaDataHandler)
* observeLiveData(mViewModel.stateViewLD, ::processStateViewLivaData)
* }
*
* private fun stateViewLivaDataHandler(data: StateLayoutEnum) {
* private fun processStateViewLivaData(data: StateLayoutEnum) {
* ...
* }
* ```
@@ -22,6 +22,9 @@ import androidx.lifecycle.LiveData
* @param action action: (t: T) -> Unit 处理订阅内容的方法
* @return Unit
*/
fun <T> LifecycleOwner.observe(liveData: LiveData<T>, action: (t: T) -> Unit) {
inline fun <T> LifecycleOwner.observeLiveData(
liveData: LiveData<T>,
crossinline action: (t: T) -> Unit
) {
liveData.observe(this, { it?.let { t -> action(t) } })
}

View File

@@ -0,0 +1,21 @@
package com.quyunshuo.androidbaseframemvvm.base.ktx
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.*
/**
* 开启一个线程调度模式为[Dispatchers.IO]的协程 有默认的异常处理器
*
* @receiver ViewModel
*
* @param exceptionHandler CoroutineExceptionHandler 异常处理器
* @param block suspend CoroutineScope.() -> Unit 协程体
* @return Job
*/
fun ViewModel.launchIO(
exceptionHandler: CoroutineExceptionHandler = CoroutineExceptionHandler { coroutineContext, throwable ->
throwable.printStackTrace()
},
block: suspend CoroutineScope.() -> Unit
): Job = viewModelScope.launch(Dispatchers.IO + exceptionHandler, block = block)

View File

@@ -1,18 +1,17 @@
package com.quyunshuo.androidbaseframemvvm.base.mvvm.v
import android.content.res.Resources
import android.os.Bundle
import android.os.Looper
import androidx.appcompat.app.AppCompatActivity
import androidx.viewbinding.ViewBinding
import com.alibaba.android.arouter.launcher.ARouter
import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.BaseViewModel
import com.quyunshuo.androidbaseframemvvm.base.utils.BindingReflex
import com.quyunshuo.androidbaseframemvvm.base.utils.EventBusRegister
import com.quyunshuo.androidbaseframemvvm.base.utils.EventBusUtils
import com.quyunshuo.androidbaseframemvvm.base.utils.*
import com.quyunshuo.androidbaseframemvvm.base.utils.network.AutoRegisterNetListener
import com.quyunshuo.androidbaseframemvvm.base.utils.network.NetworkStateChangeListener
import com.quyunshuo.androidbaseframemvvm.base.utils.network.NetworkTypeEnum
import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper
import com.quyunshuo.androidbaseframemvvm.base.utils.status.imp.BaseFrameViewStatusHelperImp
import com.quyunshuo.androidbaseframemvvm.base.utils.toast
import me.jessyan.autosize.AutoSizeCompat
/**
* Activity基类
@@ -20,7 +19,7 @@ import com.quyunshuo.androidbaseframemvvm.base.utils.toast
* @author Qu Yunshuo
* @since 8/27/20
*/
abstract class BaseFrameActivity<VB : ViewBinding, VM : BaseViewModel> : BaseFrameStatusActivity(),
abstract class BaseFrameActivity<VB : ViewBinding, VM : BaseViewModel> : AppCompatActivity(),
FrameView<VB>, NetworkStateChangeListener {
protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) {
@@ -29,11 +28,6 @@ abstract class BaseFrameActivity<VB : ViewBinding, VM : BaseViewModel> : BaseFra
protected abstract val mViewModel: VM
/**
* 基础UI状态管理工具 保存了是否重建的状态信息
*/
private lateinit var mStatusHelper: BaseFrameViewStatusHelperImp
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(mBinding.root)
@@ -80,17 +74,20 @@ abstract class BaseFrameActivity<VB : ViewBinding, VM : BaseViewModel> : BaseFra
toast(if (isConnected) "网络已连接" else "网络已断开")
}
override fun isRecreate(): Boolean = mStatusHelper.isRecreate
override fun onRegisterStatusHelper(): ViewStatusHelper? {
mStatusHelper = BaseFrameViewStatusHelperImp(super.onRegisterStatusHelper())
return mStatusHelper
}
override fun onDestroy() {
if (javaClass.isAnnotationPresent(EventBusRegister::class.java)) EventBusUtils.unRegister(
this
)
super.onDestroy()
}
override fun getResources(): Resources {
// 主要是为了解决 AndroidAutoSize 在横屏切换时导致适配失效的问题
// 但是 AutoSizeCompat.autoConvertDensity() 对线程做了判断 导致Coil等图片加载框架在子线程访问的时候会异常
// 所以在这里加了线程的判断 如果是非主线程 就取消单独的适配
if (Looper.myLooper() == Looper.getMainLooper()) {
AutoSizeCompat.autoConvertDensityOfGlobal((super.getResources()))
}
return super.getResources()
}
}

View File

@@ -4,14 +4,13 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.viewbinding.ViewBinding
import com.alibaba.android.arouter.launcher.ARouter
import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.BaseViewModel
import com.quyunshuo.androidbaseframemvvm.base.utils.BindingReflex
import com.quyunshuo.androidbaseframemvvm.base.utils.EventBusRegister
import com.quyunshuo.androidbaseframemvvm.base.utils.EventBusUtils
import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper
import com.quyunshuo.androidbaseframemvvm.base.utils.status.imp.BaseFrameViewStatusHelperImp
/**
* Fragment基类
@@ -19,7 +18,7 @@ import com.quyunshuo.androidbaseframemvvm.base.utils.status.imp.BaseFrameViewSta
* @author Qu Yunshuo
* @since 8/27/20
*/
abstract class BaseFrameFragment<VB : ViewBinding, VM : BaseViewModel> : BaseFrameStatusFragment(),
abstract class BaseFrameFragment<VB : ViewBinding, VM : BaseViewModel> : Fragment(),
FrameView<VB> {
/**
@@ -31,11 +30,6 @@ abstract class BaseFrameFragment<VB : ViewBinding, VM : BaseViewModel> : BaseFra
protected abstract val mViewModel: VM
/**
* 基础UI状态管理工具
*/
private lateinit var mBaseStatusHelper: BaseFrameViewStatusHelperImp
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -57,13 +51,6 @@ abstract class BaseFrameFragment<VB : ViewBinding, VM : BaseViewModel> : BaseFra
initRequestData()
}
override fun isRecreate(): Boolean = mBaseStatusHelper.isRecreate
override fun onRegisterStatusHelper(): ViewStatusHelper? {
mBaseStatusHelper = BaseFrameViewStatusHelperImp(super.onRegisterStatusHelper())
return mBaseStatusHelper
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null

View File

@@ -24,9 +24,4 @@ interface FrameView<VB : ViewBinding> {
* 用于在页面创建时进行请求接口
*/
fun initRequestData()
/**
* 页面是否重建fragment被回收重新展示的时候为true系统环境发生变化activity重新创建时为true
*/
fun isRecreate(): Boolean
}

View File

@@ -1,14 +1,12 @@
package com.quyunshuo.androidbaseframemvvm.common.ui
import android.util.Log
import androidx.core.content.ContextCompat
import androidx.viewbinding.ViewBinding
import com.jaeger.library.StatusBarUtil
import com.quyunshuo.androidbaseframemvvm.base.mvvm.v.BaseFrameActivity
import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.BaseViewModel
import com.quyunshuo.androidbaseframemvvm.base.utils.ActivityStackManager
import com.quyunshuo.androidbaseframemvvm.base.utils.AndroidBugFixUtils
import com.quyunshuo.androidbaseframemvvm.common.R
import com.quyunshuo.androidbaseframemvvm.base.utils.BarUtils
/**
* Activity基类
@@ -24,8 +22,8 @@ abstract class BaseActivity<VB : ViewBinding, VM : BaseViewModel> : BaseFrameAct
* @return Unit
*/
override fun setStatusBar() {
val themeColor = ContextCompat.getColor(this, R.color.common_theme)
StatusBarUtil.setColor(this, themeColor, 0)
BarUtils.transparentStatusBar(this)
BarUtils.setStatusBarLightMode(this, true)
}
override fun onResume() {

View File

@@ -11,7 +11,6 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activity.InternalPagerActivity" />
</application>
</manifest>

View File

@@ -2,13 +2,11 @@ package com.quyunshuo.module.home.activity
import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.quyunshuo.androidbaseframemvvm.base.ktx.launchIO
import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import javax.inject.Inject
/**
@@ -28,7 +26,7 @@ class HomeViewModel @Inject constructor(private val mRepository: HomeRepository)
* 模拟获取数据
*/
fun getData() {
viewModelScope.launch(Dispatchers.IO) {
launchIO {
mRepository.getData()
.catch { Log.d("qqq", "getData: $it") }
.collect { data.postValue(it) }

View File

@@ -1,93 +1,93 @@
package com.quyunshuo.module.home.activity
import android.os.Bundle
import androidx.activity.viewModels
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.EmptyViewModel
import com.quyunshuo.androidbaseframemvvm.common.ui.BaseActivity
import com.quyunshuo.androidbaseframemvvm.common.ui.BaseFragmentStateAdapter
import com.quyunshuo.module.home.databinding.HomeActivityInternalLayoutBinding
import com.quyunshuo.module.home.fragment.InternalFragment
import dagger.hilt.android.AndroidEntryPoint
import kotlin.random.Random
/**
* @author DBoy 2021/7/6 <p>
* - 文件描述 : ViewPager2+fragment 模拟Fragment页面重建。
*/
@AndroidEntryPoint
class InternalPagerActivity : BaseActivity<HomeActivityInternalLayoutBinding, EmptyViewModel>() {
override val mViewModel: EmptyViewModel by viewModels()
private val mCreateFragmentData = mutableListOf<String>()
private var mAdapter: InternalPagerFragmentAdapter? = null
override fun HomeActivityInternalLayoutBinding.initView() {
addFragment.setOnClickListener {
//添加一个随机页面
mAdapter?.addData("Pager ID:${Random.nextInt()}")
}
removeFragment.setOnClickListener {
//移除当前展示页面
// mAdapter?.removeData("更多")
mAdapter?.removeData(viewPager.currentItem)
}
initPager()
}
private fun initPager() {
mCreateFragmentData.add("首页")
mCreateFragmentData.add("我的")
mCreateFragmentData.add("设置")
mCreateFragmentData.add("更多")
mCreateFragmentData.add("动态")
mAdapter = InternalPagerFragmentAdapter(this, mCreateFragmentData)
mBinding.viewPager.adapter = mAdapter
}
override fun initObserve() {}
override fun initRequestData() {}
class InternalPagerFragmentAdapter(activity: FragmentActivity, data: MutableList<String> = mutableListOf()) :
BaseFragmentStateAdapter<String>(activity, data) {
override fun createFragment(item: String, position: Int): Fragment {
val bundle = Bundle().apply {
putString("What", item)
}
return when (item) {
"首页" -> {
//假装首页
InternalFragment()
}
"我的" -> {
//假装我的
InternalFragment()
}
"设置" -> {
//假装设置
InternalFragment()
}
"更多" -> {
//假装更多
InternalFragment()
}
else -> {
//另外动态item创建类型
InternalFragment()
}
}.apply {
//设置传递参数bundle
arguments = bundle
}
}
}
}
//package com.quyunshuo.module.home.activity
//
//import android.os.Bundle
//import androidx.activity.viewModels
//import androidx.fragment.app.Fragment
//import androidx.fragment.app.FragmentActivity
//import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.EmptyViewModel
//import com.quyunshuo.androidbaseframemvvm.common.ui.BaseActivity
//import com.quyunshuo.androidbaseframemvvm.common.ui.BaseFragmentStateAdapter
//import com.quyunshuo.module.home.databinding.HomeActivityInternalLayoutBinding
//import com.quyunshuo.module.home.fragment.InternalFragment
//import dagger.hilt.android.AndroidEntryPoint
//import kotlin.random.Random
//
///**
// * @author DBoy 2021/7/6 <p>
// * - 文件描述 : ViewPager2+fragment 模拟Fragment页面重建。
// */
//@AndroidEntryPoint
//class InternalPagerActivity : BaseActivity<HomeActivityInternalLayoutBinding, EmptyViewModel>() {
//
// override val mViewModel: EmptyViewModel by viewModels()
//
// private val mCreateFragmentData = mutableListOf<String>()
//
// private var mAdapter: InternalPagerFragmentAdapter? = null
//
//
// override fun HomeActivityInternalLayoutBinding.initView() {
// addFragment.setOnClickListener {
// //添加一个随机页面
// mAdapter?.addData("Pager ID:${Random.nextInt()}")
// }
// removeFragment.setOnClickListener {
// //移除当前展示页面
//// mAdapter?.removeData("更多")
// mAdapter?.removeData(viewPager.currentItem)
// }
// initPager()
// }
//
// private fun initPager() {
// mCreateFragmentData.add("首页")
// mCreateFragmentData.add("我的")
// mCreateFragmentData.add("设置")
// mCreateFragmentData.add("更多")
// mCreateFragmentData.add("动态")
// mAdapter = InternalPagerFragmentAdapter(this, mCreateFragmentData)
// mBinding.viewPager.adapter = mAdapter
//
// }
//
// override fun initObserve() {}
//
// override fun initRequestData() {}
//
// class InternalPagerFragmentAdapter(activity: FragmentActivity, data: MutableList<String> = mutableListOf()) :
// BaseFragmentStateAdapter<String>(activity, data) {
// override fun createFragment(item: String, position: Int): Fragment {
// val bundle = Bundle().apply {
// putString("What", item)
// }
// return when (item) {
// "首页" -> {
// //假装首页
// InternalFragment()
// }
// "我的" -> {
// //假装我的
// InternalFragment()
// }
// "设置" -> {
// //假装设置
// InternalFragment()
// }
// "更多" -> {
// //假装更多
// InternalFragment()
// }
// else -> {
// //另外动态item创建类型
// InternalFragment()
// }
// }.apply {
// //设置传递参数bundle
// arguments = bundle
// }
// }
//
//
// }
//
//}

View File

@@ -1,8 +1,8 @@
package com.quyunshuo.module.home.activity
import android.content.Intent
import android.graphics.Color
import androidx.activity.viewModels
import com.quyunshuo.androidbaseframemvvm.base.ktx.observeLiveData
import com.quyunshuo.androidbaseframemvvm.common.ui.BaseActivity
import com.quyunshuo.module.home.databinding.HomeActivityMainBinding
import dagger.hilt.android.AndroidEntryPoint
@@ -21,18 +21,15 @@ class MainActivity : BaseActivity<HomeActivityMainBinding, HomeViewModel>() {
*/
override val mViewModel by viewModels<HomeViewModel>()
override fun HomeActivityMainBinding.initView() {
goToNextBtn.setOnClickListener {
startActivity(Intent(this@MainActivity, InternalPagerActivity::class.java))
}
}
override fun HomeActivityMainBinding.initView() {}
override fun initObserve() {
// 订阅数据
mViewModel.data.observe(this, {
mBinding.vTvHello.text = it
mBinding.vTvHello.setTextColor(Color.BLUE)
})
observeLiveData(mViewModel.data, ::processData)
}
private fun processData(data: String) {
mBinding.vTvHello.text = data
mBinding.vTvHello.setTextColor(Color.BLUE)
}
override fun initRequestData() {

View File

@@ -1,85 +1,85 @@
package com.quyunshuo.module.home.fragment
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.viewModels
import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper
import com.quyunshuo.androidbaseframemvvm.common.ui.BaseFragment
import com.quyunshuo.module.home.databinding.HomeFragmentInternalLayoutBinding
import dagger.hilt.android.AndroidEntryPoint
/**
* @author DBoy 2021/7/6 <p>
* - 文件描述 : 测试fragment
*/
@AndroidEntryPoint
class InternalFragment : BaseFragment<HomeFragmentInternalLayoutBinding, InternalViewModel>() {
override val mViewModel by viewModels<InternalViewModel>()
/**
* 页面状态数据管理帮助类
*/
private lateinit var mInternalFragmentStatusHelper: InternalFragmentStatusHelper
/***
* 注册帮助类
*/
override fun onRegisterStatusHelper(): ViewStatusHelper? {
mInternalFragmentStatusHelper = InternalFragmentStatusHelper(super.onRegisterStatusHelper())
return mInternalFragmentStatusHelper
}
override fun HomeFragmentInternalLayoutBinding.initView() {}
override fun initObserve() {
mViewModel.increase(mInternalFragmentStatusHelper.rebuildSize)
val s = arguments?.getString("What") ?: ""
mBinding.toolBarTitle.text = s
mViewModel.recreatedCont.observe(viewLifecycleOwner) {
mBinding.recreateContTv.text = "重建次数 $it"
}
mViewModel.firstData.observe(viewLifecycleOwner) {
mBinding.loadDataTv.text = it
}
// mViewModel.isLoading.observe(viewLifecycleOwner) {
// mBinding.loadingStatusTv.text = if (it) {
// "正在加载..."
// } else {
// "加载完成!"
// }
//package com.quyunshuo.module.home.fragment
//
//import android.os.Bundle
//import android.util.Log
//import androidx.fragment.app.viewModels
//import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper
//import com.quyunshuo.androidbaseframemvvm.common.ui.BaseFragment
//import com.quyunshuo.module.home.databinding.HomeFragmentInternalLayoutBinding
//import dagger.hilt.android.AndroidEntryPoint
//
///**
// * @author DBoy 2021/7/6 <p>
// * - 文件描述 : 测试fragment
// */
//@AndroidEntryPoint
//class InternalFragment : BaseFragment<HomeFragmentInternalLayoutBinding, InternalViewModel>() {
//
// override val mViewModel by viewModels<InternalViewModel>()
//
// /**
// * 页面状态数据管理帮助类
// */
// private lateinit var mInternalFragmentStatusHelper: InternalFragmentStatusHelper
//
// /***
// * 注册帮助类
// */
// override fun onRegisterStatusHelper(): ViewStatusHelper? {
// mInternalFragmentStatusHelper = InternalFragmentStatusHelper(super.onRegisterStatusHelper())
// return mInternalFragmentStatusHelper
// }
//
// override fun HomeFragmentInternalLayoutBinding.initView() {}
//
//
// override fun initObserve() {
// mViewModel.increase(mInternalFragmentStatusHelper.rebuildSize)
// val s = arguments?.getString("What") ?: ""
// mBinding.toolBarTitle.text = s
// mViewModel.recreatedCont.observe(viewLifecycleOwner) {
// mBinding.recreateContTv.text = "重建次数 $it"
// }
}
override fun initRequestData() {
//当页面重建的时候不再重新请求数据,且当前页面数据数据有且没有刷新逻辑的情况下不再请求数据。
if (isRecreate() && mViewModel.firstData.value != null) {
return
}
mViewModel.getData()
}
/**
* 当前Fragment重建帮助类
*/
internal class InternalFragmentStatusHelper(parentViewStatusHelper: ViewStatusHelper?) : ViewStatusHelper(parentViewStatusHelper) {
/**
* 重建次数
*/
var rebuildSize = 0
private val KEY_REBUILD = "com.quyunshuo.module.home.fragment.InternalFragment.InternalFragmentStatusHelper.rebuild"
override fun onRestoreInstanceStatus(savedInstanceState: Bundle?) {
super.onRestoreInstanceStatus(savedInstanceState)
rebuildSize = (savedInstanceState?.getInt(KEY_REBUILD) ?: 0) + 1
}
override fun onSaveInstanceState(bundle: Bundle) {
super.onSaveInstanceState(bundle)
bundle.putInt(KEY_REBUILD, rebuildSize)
}
}
}
// mViewModel.firstData.observe(viewLifecycleOwner) {
// mBinding.loadDataTv.text = it
// }
//// mViewModel.isLoading.observe(viewLifecycleOwner) {
//// mBinding.loadingStatusTv.text = if (it) {
//// "正在加载..."
//// } else {
//// "加载完成!"
//// }
//// }
// }
//
// override fun initRequestData() {
// //当页面重建的时候不再重新请求数据,且当前页面数据数据有且没有刷新逻辑的情况下不再请求数据。
// if (isRecreate() && mViewModel.firstData.value != null) {
// return
// }
// mViewModel.getData()
// }
//
// /**
// * 当前Fragment重建帮助类
// */
// internal class InternalFragmentStatusHelper(parentViewStatusHelper: ViewStatusHelper?) : ViewStatusHelper(parentViewStatusHelper) {
// /**
// * 重建次数
// */
// var rebuildSize = 0
//
// private val KEY_REBUILD = "com.quyunshuo.module.home.fragment.InternalFragment.InternalFragmentStatusHelper.rebuild"
//
// override fun onRestoreInstanceStatus(savedInstanceState: Bundle?) {
// super.onRestoreInstanceStatus(savedInstanceState)
// rebuildSize = (savedInstanceState?.getInt(KEY_REBUILD) ?: 0) + 1
// }
//
// override fun onSaveInstanceState(bundle: Bundle) {
// super.onSaveInstanceState(bundle)
// bundle.putInt(KEY_REBUILD, rebuildSize)
// }
// }
//
//}

View File

@@ -1,17 +1,17 @@
package com.quyunshuo.module.home.fragment
import com.quyunshuo.androidbaseframemvvm.base.mvvm.m.BaseRepository
import kotlinx.coroutines.delay
import javax.inject.Inject
/**
* @author DBoy 2021/7/6 <p>
* - 文件描述 :
*/
class InternalRepository @Inject constructor() : BaseRepository() {
suspend fun getData() = request<String> {
delay(1000)
emit("数据加载成功")
}
}
//package com.quyunshuo.module.home.fragment
//
//import com.quyunshuo.androidbaseframemvvm.base.mvvm.m.BaseRepository
//import kotlinx.coroutines.delay
//import javax.inject.Inject
//
///**
// * @author DBoy 2021/7/6 <p>
// * - 文件描述 :
// */
//class InternalRepository @Inject constructor() : BaseRepository() {
//
// suspend fun getData() = request<String> {
// delay(1000)
// emit("数据加载成功")
// }
//}

View File

@@ -1,65 +1,65 @@
package com.quyunshuo.module.home.fragment
import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.BaseViewModel
import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.launch
import javax.inject.Inject
/**
* @author DBoy 2021/7/6 <p>
* - 文件描述 : ViewModel再ViewPager2的Fragment中会随着Fragment执行[Fragment.onDestory]一同销毁。
* 所以一些需要长期保存的变量数据不适合保存再ViewModel考虑使用[ViewStatusHelper]保存页面上部分数据,
* 页面恢复的时候再交给ViewModel处理,例如[recreatedCont]
*/
@HiltViewModel
class InternalViewModel @Inject constructor() :
BaseViewModel() {
@Inject
lateinit var repository: InternalRepository
/**
* 重建计数
*/
val recreatedCont = MutableLiveData<Int>()
/**
* 首个数据
*/
val firstData = MutableLiveData<String>()
/**
* 累加重建次数
*/
fun increase(size: Int) {
recreatedCont.value = size
}
/**
* 获取数据
*/
fun getData() {
viewModelScope.launch(Dispatchers.IO) {
repository.getData()
.catch {
Log.d("DJC", "getData: ")
}
.onStart { changeStateView(loading = true) }
.collect {
changeStateView(hide = true)
delay(200)
firstData.postValue(it)
}
}
}
}
//package com.quyunshuo.module.home.fragment
//
//import android.util.Log
//import androidx.lifecycle.MutableLiveData
//import androidx.lifecycle.viewModelScope
//import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.BaseViewModel
//import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper
//import dagger.hilt.android.lifecycle.HiltViewModel
//import kotlinx.coroutines.Dispatchers
//import kotlinx.coroutines.delay
//import kotlinx.coroutines.flow.catch
//import kotlinx.coroutines.flow.collect
//import kotlinx.coroutines.flow.onStart
//import kotlinx.coroutines.launch
//import javax.inject.Inject
//
///**
// * @author DBoy 2021/7/6 <p>
// * - 文件描述 : ViewModel再ViewPager2的Fragment中会随着Fragment执行[Fragment.onDestory]一同销毁。
// * 所以一些需要长期保存的变量数据不适合保存再ViewModel考虑使用[ViewStatusHelper]保存页面上部分数据,
// * 页面恢复的时候再交给ViewModel处理,例如[recreatedCont]
// */
//@HiltViewModel
//class InternalViewModel @Inject constructor() :
// BaseViewModel() {
//
// @Inject
// lateinit var repository: InternalRepository
//
// /**
// * 重建计数
// */
// val recreatedCont = MutableLiveData<Int>()
//
// /**
// * 首个数据
// */
// val firstData = MutableLiveData<String>()
//
// /**
// * 累加重建次数
// */
// fun increase(size: Int) {
// recreatedCont.value = size
// }
//
// /**
// * 获取数据
// */
// fun getData() {
// viewModelScope.launch(Dispatchers.IO) {
// repository.getData()
// .catch {
// Log.d("DJC", "getData: ")
// }
// .onStart { changeStateView(loading = true) }
// .collect {
// changeStateView(hide = true)
// delay(200)
// firstData.postValue(it)
// }
// }
// }
//
//}

View File

@@ -20,18 +20,4 @@
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/goToNextBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="进入ViewPager2示例"
android:textAllCaps="false"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/vTvHello"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>