refactor(frame): 优化框架
- 添加和优化扩展方法 - 优化屏幕适配兼容性问题
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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) } })
|
||||
}
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -24,9 +24,4 @@ interface FrameView<VB : ViewBinding> {
|
||||
* 用于在页面创建时进行请求接口
|
||||
*/
|
||||
fun initRequestData()
|
||||
|
||||
/**
|
||||
* 页面是否重建,fragment被回收重新展示的时候为true,系统环境发生变化activity重新创建时为true
|
||||
*/
|
||||
fun isRecreate(): Boolean
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name=".activity.InternalPagerActivity" />
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
@@ -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) }
|
||||
|
||||
@@ -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
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
// }
|
||||
//
|
||||
//}
|
||||
@@ -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() {
|
||||
|
||||
@@ -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)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//}
|
||||
@@ -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("数据加载成功")
|
||||
// }
|
||||
//}
|
||||
@@ -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)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user