hegaojian / JetpackMvvm

:chicken::basketball:一个Jetpack结合MVVM的快速开发框架,基于MVVM模式集成谷歌官方推荐的JetPack组件库:LiveData、ViewModel、Lifecycle、Navigation组件 使用Kotlin语言,添加大量拓展函数,简化代码 加入Retrofit网络请求,协程,帮你简化各种操作,让你快速开发项目
https://github.com/hegaojian/JetpackMvvm
Apache License 2.0
3.16k stars 616 forks source link

关于多个fragment共用一个viewmodel的情况 #16

Closed ppg408331701 closed 4 years ago

ppg408331701 commented 4 years ago

me.hgj.jetpackmvvm.demo D: loginFragment--------->onCreate me.hgj.jetpackmvvm.demo D: loginFragment--------->onStart me.hgj.jetpackmvvm.demo D: loginFragment--------->onResume me.hgj.jetpackmvvm.demo D: loginFragment--------->LoginRegisterViewModel@5df2ec me.hgj.jetpackmvvm.demo D: loginFragment--------->RequestLoginRegisterViewModel@68c86b5 me.hgj.jetpackmvvm.demo D: RegisterFrgment--------->onCreate me.hgj.jetpackmvvm.demo D: RegisterFrgment--------->onStart me.hgj.jetpackmvvm.demo D: RegisterFrgment--------->onResume me.hgj.jetpackmvvm.demo D: RegisterFrgment--------->LoginRegisterViewModel@b754ad6 me.hgj.jetpackmvvm.demo D: RegisterFrgment--------->RequestLoginRegisterViewModel@5424157

我注意到LoginFragment和 RegisterFrgment 共用了2个ViewModel,但是因为是使用getViewModel(获取当前fragment上下文的方法)获取的,所以这两个ViewModel并不是同一个对象。 假设我在LoginFragment和RegisterFrgment 的RequestLoginRegisterViewModel都内持有了数据库的操作对象,那么我在RegisterFrgment 被销毁的时候回调rViewModel的onCleared()中把它close了。那么会影响到LoginFragment的RequestLoginRegisterViewModel内的数据库的操作对象吗?

ppg408331701 commented 4 years ago

QQ截图20200606104119

还有一个小问题。我在demo的fragment中想调用getActivityViewModel时,出现ide提示要实现一个getValue方法,但是kotlin我是初学者,请问这种情况是怎么回事

/**
 * 在Fragment中得到父类Activity的共享ViewModel
 * 提示,在fragment中调用该方法时,请在该Fragment onCreate以后调用或者请用by lazy方式懒加载初始化调用,不然会提示requireActivity没有导致错误
 */
inline fun <reified VM : BaseViewModel> Fragment.getActivityViewModel(): VM {
    return ViewModelProvider(requireActivity(),
        ViewModelProvider.AndroidViewModelFactory(this.requireActivity().application)
    ).get(VM::class.java)
}
hegaojian commented 4 years ago

不会受到影响的,因为他们两个都是绑定各自的fragment,相当于独立存在, 当然如果你得数据库对象是单例那肯定会有影响 还有就是两个fragment持有的viewmodel两个都是绑定了父Activity的话,就可以达到共享作用域

hegaojian commented 4 years ago

下面的你多了一个括号 删除泛型前面的那个就好了

ppg408331701 commented 4 years ago

嗷嗷,谢谢了。

那个括号是android studio的代码补全的时候自己加的,没注意。 感觉kotlin的代码补全没java的智能