From 086078f6183839c52e473afae2c8a34f42b41d8c Mon Sep 17 00:00:00 2001 From: Quyunshuo Date: Sun, 26 Sep 2021 22:18:41 +0800 Subject: [PATCH] =?UTF-8?q?refactor(frame):=20=E4=BC=98=E5=8C=96=E6=A1=86?= =?UTF-8?q?=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加和优化扩展方法 - 优化屏幕适配兼容性问题 --- lib_base/build.gradle | 1 - .../base/ktx/EditTextKtx.kt | 14 +- .../base/ktx/LifecycleOwnerKtx.kt | 9 +- .../base/ktx/ViewModelExt.kt | 21 ++ .../base/mvvm/v/BaseFrameActivity.kt | 35 ++-- .../base/mvvm/v/BaseFrameFragment.kt | 17 +- .../base/mvvm/v/FrameView.kt | 5 - .../common/ui/BaseActivity.kt | 8 +- module_home/src/main/AndroidManifest.xml | 1 - .../module/home/activity/HomeViewModel.kt | 6 +- .../home/activity/InternalPagerActivity.kt | 186 +++++++++--------- .../module/home/activity/MainActivity.kt | 19 +- .../module/home/fragment/InternalFragment.kt | 168 ++++++++-------- .../home/fragment/InternalRepository.kt | 34 ++-- .../module/home/fragment/InternalViewModel.kt | 130 ++++++------ .../main/res/layout/home_activity_main.xml | 14 -- 16 files changed, 325 insertions(+), 343 deletions(-) create mode 100644 lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/ktx/ViewModelExt.kt diff --git a/lib_base/build.gradle b/lib_base/build.gradle index 51e57c8..e4bb031 100644 --- a/lib_base/build.gradle +++ b/lib_base/build.gradle @@ -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 diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/ktx/EditTextKtx.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/ktx/EditTextKtx.kt index 0a07673..d43b282 100644 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/ktx/EditTextKtx.kt +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/ktx/EditTextKtx.kt @@ -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() + filterList.addAll(filters) + filterList.add(InputFilter { source, _, _, _, _, _ -> if (source == " " || source == "\n") "" else null }) + filters = filterList.toTypedArray() } \ No newline at end of file diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/ktx/LifecycleOwnerKtx.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/ktx/LifecycleOwnerKtx.kt index 93a1bc0..1864993 100644 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/ktx/LifecycleOwnerKtx.kt +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/ktx/LifecycleOwnerKtx.kt @@ -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 LifecycleOwner.observe(liveData: LiveData, action: (t: T) -> Unit) { +inline fun LifecycleOwner.observeLiveData( + liveData: LiveData, + crossinline action: (t: T) -> Unit +) { liveData.observe(this, { it?.let { t -> action(t) } }) } \ No newline at end of file diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/ktx/ViewModelExt.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/ktx/ViewModelExt.kt new file mode 100644 index 0000000..45b70ed --- /dev/null +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/ktx/ViewModelExt.kt @@ -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) \ No newline at end of file diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt index b33690d..5c8c421 100644 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt @@ -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 : BaseFrameStatusActivity(), +abstract class BaseFrameActivity : AppCompatActivity(), FrameView, NetworkStateChangeListener { protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) { @@ -29,11 +28,6 @@ abstract class BaseFrameActivity : 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 : 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() + } } \ No newline at end of file diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameFragment.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameFragment.kt index c1f4f36..64d11fe 100644 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameFragment.kt +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameFragment.kt @@ -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 : BaseFrameStatusFragment(), +abstract class BaseFrameFragment : Fragment(), FrameView { /** @@ -31,11 +30,6 @@ abstract class BaseFrameFragment : 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 : 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 diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/FrameView.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/FrameView.kt index 345e03c..26aab76 100644 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/FrameView.kt +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/FrameView.kt @@ -24,9 +24,4 @@ interface FrameView { * 用于在页面创建时进行请求接口 */ fun initRequestData() - - /** - * 页面是否重建,fragment被回收重新展示的时候为true,系统环境发生变化activity重新创建时为true - */ - fun isRecreate(): Boolean } \ No newline at end of file diff --git a/lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/ui/BaseActivity.kt b/lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/ui/BaseActivity.kt index 85df290..9418dd0 100644 --- a/lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/ui/BaseActivity.kt +++ b/lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/ui/BaseActivity.kt @@ -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 : 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() { diff --git a/module_home/src/main/AndroidManifest.xml b/module_home/src/main/AndroidManifest.xml index 64358a4..e092a89 100644 --- a/module_home/src/main/AndroidManifest.xml +++ b/module_home/src/main/AndroidManifest.xml @@ -11,7 +11,6 @@ - \ No newline at end of file diff --git a/module_home/src/main/java/com/quyunshuo/module/home/activity/HomeViewModel.kt b/module_home/src/main/java/com/quyunshuo/module/home/activity/HomeViewModel.kt index 1f55705..f44b6a8 100644 --- a/module_home/src/main/java/com/quyunshuo/module/home/activity/HomeViewModel.kt +++ b/module_home/src/main/java/com/quyunshuo/module/home/activity/HomeViewModel.kt @@ -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) } diff --git a/module_home/src/main/java/com/quyunshuo/module/home/activity/InternalPagerActivity.kt b/module_home/src/main/java/com/quyunshuo/module/home/activity/InternalPagerActivity.kt index 0b70886..52d6300 100644 --- a/module_home/src/main/java/com/quyunshuo/module/home/activity/InternalPagerActivity.kt +++ b/module_home/src/main/java/com/quyunshuo/module/home/activity/InternalPagerActivity.kt @@ -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

- * - 文件描述 : ViewPager2+fragment 模拟Fragment页面重建。 - */ -@AndroidEntryPoint -class InternalPagerActivity : BaseActivity() { - - override val mViewModel: EmptyViewModel by viewModels() - - private val mCreateFragmentData = mutableListOf() - - 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 = mutableListOf()) : - BaseFragmentStateAdapter(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 - } - } - - - } - -} \ No newline at end of file +//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

+// * - 文件描述 : ViewPager2+fragment 模拟Fragment页面重建。 +// */ +//@AndroidEntryPoint +//class InternalPagerActivity : BaseActivity() { +// +// override val mViewModel: EmptyViewModel by viewModels() +// +// private val mCreateFragmentData = mutableListOf() +// +// 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 = mutableListOf()) : +// BaseFragmentStateAdapter(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 +// } +// } +// +// +// } +// +//} \ No newline at end of file diff --git a/module_home/src/main/java/com/quyunshuo/module/home/activity/MainActivity.kt b/module_home/src/main/java/com/quyunshuo/module/home/activity/MainActivity.kt index a1fa84a..eaca665 100644 --- a/module_home/src/main/java/com/quyunshuo/module/home/activity/MainActivity.kt +++ b/module_home/src/main/java/com/quyunshuo/module/home/activity/MainActivity.kt @@ -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() { */ override val mViewModel by viewModels() - 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() { diff --git a/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalFragment.kt b/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalFragment.kt index e181538..73f9922 100644 --- a/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalFragment.kt +++ b/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalFragment.kt @@ -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

- * - 文件描述 : 测试fragment - */ -@AndroidEntryPoint -class InternalFragment : BaseFragment() { - - override val mViewModel by viewModels() - - /** - * 页面状态数据管理帮助类 - */ - 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

+// * - 文件描述 : 测试fragment +// */ +//@AndroidEntryPoint +//class InternalFragment : BaseFragment() { +// +// override val mViewModel by viewModels() +// +// /** +// * 页面状态数据管理帮助类 +// */ +// 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) - } - } - -} \ No newline at end of file +// 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) +// } +// } +// +//} \ No newline at end of file diff --git a/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalRepository.kt b/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalRepository.kt index 04a5f8b..7680258 100644 --- a/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalRepository.kt +++ b/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalRepository.kt @@ -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

- * - 文件描述 : - */ -class InternalRepository @Inject constructor() : BaseRepository() { - - suspend fun getData() = request { - delay(1000) - emit("数据加载成功") - } -} \ No newline at end of file +//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

+// * - 文件描述 : +// */ +//class InternalRepository @Inject constructor() : BaseRepository() { +// +// suspend fun getData() = request { +// delay(1000) +// emit("数据加载成功") +// } +//} \ No newline at end of file diff --git a/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalViewModel.kt b/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalViewModel.kt index 689e652..24da318 100644 --- a/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalViewModel.kt +++ b/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalViewModel.kt @@ -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

- * - 文件描述 : ViewModel再ViewPager2的Fragment中会随着Fragment执行[Fragment.onDestory]一同销毁。 - * 所以一些需要长期保存的变量数据,不适合保存再ViewModel,考虑使用[ViewStatusHelper]保存页面上部分数据, - * 页面恢复的时候再交给ViewModel处理,例如[recreatedCont] - */ -@HiltViewModel -class InternalViewModel @Inject constructor() : - BaseViewModel() { - - @Inject - lateinit var repository: InternalRepository - - /** - * 重建计数 - */ - val recreatedCont = MutableLiveData() - - /** - * 首个数据 - */ - val firstData = MutableLiveData() - - /** - * 累加重建次数 - */ - 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

+// * - 文件描述 : ViewModel再ViewPager2的Fragment中会随着Fragment执行[Fragment.onDestory]一同销毁。 +// * 所以一些需要长期保存的变量数据,不适合保存再ViewModel,考虑使用[ViewStatusHelper]保存页面上部分数据, +// * 页面恢复的时候再交给ViewModel处理,例如[recreatedCont] +// */ +//@HiltViewModel +//class InternalViewModel @Inject constructor() : +// BaseViewModel() { +// +// @Inject +// lateinit var repository: InternalRepository +// +// /** +// * 重建计数 +// */ +// val recreatedCont = MutableLiveData() +// +// /** +// * 首个数据 +// */ +// val firstData = MutableLiveData() +// +// /** +// * 累加重建次数 +// */ +// 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) +// } +// } +// } +// +//} diff --git a/module_home/src/main/res/layout/home_activity_main.xml b/module_home/src/main/res/layout/home_activity_main.xml index 2e91dd6..31a57e7 100644 --- a/module_home/src/main/res/layout/home_activity_main.xml +++ b/module_home/src/main/res/layout/home_activity_main.xml @@ -20,18 +20,4 @@ app:layout_constraintTop_toTopOf="parent" tools:ignore="HardcodedText" /> -