Giter Club home page Giter Club logo

Comments (5)

lulululbj avatar lulululbj commented on May 18, 2024
  1. 可以共用,比如这个 SquareUIModel 在很多个页面都可以使用。主要看页面的具体视图逻辑了。
  2. DialogFragment 的话就参考 BaseVMFragment 使用呗。没有 viewModel 也就没有必要继承 BaseVMFragment 了,BaseFragment 就行。

from wanandroid.

bingdu0 avatar bingdu0 commented on May 18, 2024
  1. 可以共用,比如这个 SquareUIModel 在很多个页面都可以使用。主要看页面的具体视图逻辑了。
  2. DialogFragment 的话就参考 BaseVMFragment 使用呗。没有 viewModel 也就没有必要继承 BaseVMFragment 了,BaseFragment 就行。

第二点 我感觉哈 不是一个好思路,每次新增加一个像BaseDialogFragment 的 ,写一个泛型是ViewModel的,在写一个没有ViewModel的 。修改工作量也是double 。我感觉像BaseActivity 和BaseFragment 这种的不用任何泛型 ,继承之后 在子类初始化ViewModel 或者DataBinding?望大佬指点一下!

from wanandroid.

lulululbj avatar lulululbj commented on May 18, 2024

@bingdu0 我最初的 BaseVMActivity 是继承 BaseActivity 的,公用逻辑都写在 BaseActivity,不会存在 double 工作量。但是后来新版本的 ViewModel 必须在 onCreate() 之后进行初始化,调用链就成了这样,initView() -> initData() -> initVM(),initVM 之前使用 viewModel 会产生空指针。索性就不继承 BaseActivity 了。

至于你说的修改工作量 double ,我觉得可以尽量避免修改。Kotlin 的扩展函数足以让我们不去修改 BaseActivity 源码。

如果觉得还是不妥的话,依然可以让 BaseVMXXX 去继承 BaseXXX 。

from wanandroid.

bingdu0 avatar bingdu0 commented on May 18, 2024

@bingdu0 我最初的 BaseVMActivity 是继承 BaseActivity 的,公用逻辑都写在 BaseActivity,不会存在 double 工作量。但是后来新版本的 ViewModel 必须在 onCreate() 之后进行初始化,调用链就成了这样,initView() -> initData() -> initVM(),initVM 之前使用 viewModel 会产生空指针。索性就不继承 BaseActivity 了。

至于你说的修改工作量 double ,我觉得可以尽量避免修改。Kotlin 的扩展函数足以让我们不去修改 BaseActivity 源码。

如果觉得还是不妥的话,依然可以让 BaseVMXXX 去继承 BaseXXX 。

    private fun initVM() {
        providerVMClass()?.let {
            mViewModel = ViewModelProviders.of(this).get(it)
            lifecycle.addObserver(mViewModel)
        }
    }

    open fun providerVMClass(): Class<VM>? = null

    override fun onDestroy() {
        lifecycle.removeObserver(mViewModel)
        super.onDestroy()
    }
我可能没说清楚,初始化VM 放到子类去初始化, 

伪代码如下
   private val mViewModel2: SquareViewModel by lazy {
        ViewModelProvider(requireActivity(), SquareViewModelFactory(SquareRepository())).get(SquareRepository::class.java)
}

这样是不是就没必要在BaseActivity 通过泛型来来初始化了?另外 lifecycle.addObserver(mViewModel)  和 lifecycle.removeObserver(mViewModel)  有 起作用吗?

from wanandroid.

lulululbj avatar lulululbj commented on May 18, 2024

@bingdu0

  1. VM 的初始化,做法比较多。google 的 plaid 应用使用 dagger2 进一步解耦。
@Inject
lateinit var viewModel: LoginViewModel

当然你的做法也是可以的。架构上的东西,不违背大原则,顺手就行。

  1. 谢谢你的提醒。鉴于项目中直接使用了 viewmodel-ktx 库为 ViewModel 提供的 viewModelScope 协程作用域,lifecycle.addObserver(mViewModel) 和 lifecycle.removeObserver(mViewModel) 现在的确没有起到什么作用。

from wanandroid.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.