热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Android中注入ViewModelFactory有什么意义-Dagger2

如何解决《在Android中注入ViewModelFactory有什么意义-Dagger2》经验,为你挑选了1个好方法。

我最近开始从事Android开发,并且来自iOS背景,诸如依赖注入框架和ViewModelFactories之类的概念对我来说是新事物。在我看到的所有教程中,ViewModels始终扩展了所提供的ViewModel类android.arch.lifecycle.ViewModel。如果viewModel具有参数,则必须创建一个ViewModelFactory并由Dagger注入到活动中

@Provides
@ActivityScope
fun provideViewModelFactory(dependency: Dependency) : ViewModelProvider.Factory = CustomViewModelFactory(dependency)

CustomViewModelFactory然后将负责创建ViewModels。一切都很好,但是,当我可以将viewModels直接注入这样的活动中时,我并没有真正理解viewModelFactory的要点:

@Module
class ViewModelModule(private val user: User) {
    @ActivityScope
    @Provides
    fun provideMainViewModel() = MainViewModel(user = user)
    fun provideOtherViewModel() = OtherViewModel()
}

@ActivityScope
@Subcomponent(modules = [ViewModelModule::class])
interface MainActivitySubComponent {
    fun inject(activity: MainActivity)
}

@ApplicationScope
@Component()
interface ApplicationComponent {
    fun addMainActivitySubComponent(viewModelModule: ViewModelModule) : MainActivitySubComponent
}

在我的活动中

class MainActivity : AppCompatActivity() {

    @Inject lateinit var viewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val subCompOnent= (application as MainApplication).component.addMainActivitySubComponent(ViewModelModule(User("NEW NAME")))

        subComponent.inject(this)
    }
}

那么,当我可以直接在活动中直接插入一个ViewModel时,ViewModelFactory有什么意义呢?



1> David Medenj..:

让我们看一下注入ViewModel时会发生什么:

    您的活动被创建(重新)。

    您为所述活动创建一个(Sub)Component。

    您注入依赖项。

有趣的部分是3,我们将注入一些作用域对象(例如Singletons),但为其余依赖项创建新对象。

每次(重新)创建活动(->配置更改)时,将再次创建这些对象,并且您将失去状态。您可以savedInstanceState用来保留一些数据,也可以找出其他方法来保存状态(例如,单例,保留的片段等)。


另一方面,ViewModel承诺在方向更改之间保持状态。当我们从ViewModelProviders方向更改后请求ViewModel时,我们将收到与以前相同的对象。我们不必担心保存和恢复状态。

我们将重新创建工厂,但是Android /支持库/ Jetpack / Arch组件(无论现在叫什么)都将存储Viewmodel并仅在之前未创建时创建它。先前的模型将在配置更改期间重用。


因此,如果您想直接注入ViewModel,显然可以这样做,但是ViewModel不会在方向更改之间保持其状态。


推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 在开发app时,使用了butterknife后,在androidStudio打包apk时可能会遇到报错。为了解决这个问题,可以通过打开proguard-rules.pro文件进行代码混淆来解决。本文介绍了具体的混淆代码和方法。 ... [详细]
author-avatar
chucai
这个家伙很懒,什么也没留下,只留下了这个默认个签!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有