美文网首页
Android开发之MVVM模式实践(三):Fragment的封

Android开发之MVVM模式实践(三):Fragment的封

作者: 码途有道 | 来源:发表于2021-03-26 19:36 被阅读0次

    前言

    大家好,我是小益。本章是Android的MVVM架构实践系列文章的第三篇,上一篇文章主要介绍了Activity的封装,本章主要介绍Fragment的封装。如果有去Github上看过小益的封装案例的同学,会发现上章中Activity的封装以及本篇中Fragment的封装比Gtihub上的案例要简单,相当于是一个简化版本。这是因为小益只是抽取了与MVVM相关的部分放在文章中讲解,Github中的案例除了MVVM部分的封装,还包括了一些常见的基础功能封装。不同的项目有不同的功能需求,大家可以根据自己的项目需求在MVVM的基础封装上自行添加自己需要的功能封装。

    本章的封装过程与上章的Activity的封装非常相似,可以算是上章内容的后续,所以本章会直接展示代码,如果没有阅读过上章《Android的MVVM架构实践(二):Activity的封装》的同学,强烈推荐先阅读上章的内容。

    推荐

    文章将率先在公众号「Code满满」与个人博客「李益的小站」上发布,欢迎大家关注!

    一、将DataBinding加入Fragment的封装

    abstract class BaseBindingFragment<B : ViewDataBinding> : Fragment() {
        /**
         * 缓存视图,如果视图已经创建,则不再初始化视图
         */
        private var rootView: View? = null
    
        protected lateinit var binding: B
            private set
    
        override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            if (rootView != null) {
                return rootView
            }
            rootView = inflater.inflate(getLayoutId(), container, false)
            injectDataBinding(inflater, container)
            initialize(savedInstanceState)
            return rootView
        }
    
        protected open fun injectDataBinding(inflater: LayoutInflater, container: ViewGroup?) {
            binding = DataBindingUtil.inflate(inflater, getLayoutId(), container, false)
            binding.lifecycleOwner = this
            rootView = binding.root
        }
        
        protected abstract @LayoutRes
        fun getLayoutId(): Int
    
        /**
         *  初始化操作
         */
        protected abstract fun initialize(savedInstanceState: Bundle?)
    
        override fun onDestroyView() {
            binding.unbind()
            super.onDestroyView()
        }
    }
    

    二、将ViewModel加入Fragment的封装

    abstract class BaseBVMFragment<B : ViewDataBinding, VM : BaseViewModel> : BaseBindingFragment<B>(),
        ViewBehavior {
    
        protected lateinit var viewModel: VM
            private set
    
        override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            if (rootView != null) {
                return rootView
            }
            injectDataBinding(inflater, container)
            injectViewModel()
            initialize(savedInstanceState)
            initInternalObserver()
            return rootView
        }
    
        protected fun injectViewModel() {
            val vm = createViewModel()
            viewModel = ViewModelProvider(this, BaseViewModel.createViewModelFactory(vm))
                .get(vm::class.java)
            viewModel.application = activity!!.application
            lifecycle.addObserver(viewModel)
        }
    
        override fun onDestroy() {
            super.onDestroy()
            lifecycle.removeObserver(viewModel)
        }
    
        protected fun initInternalObserver() {
            viewModel._loadingEvent.observeNonNull(this) {
                showLoadingUI(it)
            }
            viewModel._emptyPageEvent.observeNonNull(this) {
                showEmptyUI(it)
            }
            viewModel._toastEvent.observeNonNull(this) {
                showToast(it)
            }
            viewModel._pageNavigationEvent.observeNonNull(this) {
                navigate(it)
            }
            viewModel._backPressEvent.observeNonNull(this) {
                backPress(it)
            }
            viewModel._finishPageEvent.observeNonNull(this) {
                finishPage(it)
            }
        }
    
        protected abstract fun createViewModel(): VM;
    }
    

    三、小结

    本章的内容非常简洁,到目前为止,MVVM模式中的V层基本已经封装完毕,VM层也基本完成,剩下的还有M层。而M层主要用来处理纯粹的数据逻辑,完全脱离UI,可以说完全是与项目的业务需求相关。不过既然以已经封装到这了,我们就把所有项目中都需要使用的网络请求也拿出来封装一下吧,毕竟从一定程度上来说,网络请求获取数据也属于M层的一部分。所以下章将主要讲解如何去封装网络请求,这其中还会涉及到协程相关知识,各位同学下章见啦!另外,完整的封装代码已上传至Github,项目地址为:https://github.com/albert-lii/Fly-Android

    相关文章

      网友评论

          本文标题:Android开发之MVVM模式实践(三):Fragment的封

          本文链接:https://www.haomeiwen.com/subject/tirshltx.html