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

如何使用Dagger2将ViewModel注入BottomSheetDialogFragment中?

如何解决《如何使用Dagger2将ViewModel注入BottomSheetDialogFragment中?》经验,为你挑选了1个好方法。

我使用的首选方式在“活动和片段”中注入依赖项AndroidInjection.inject(this)。我有推荐的ViewmodelFactory注入viewmodel。我的注射工作在“活动和片段”中。但是我遇到了BottomSheetDialogFragment的问题,因为不允许我将BottomSheetDialogFragment指定为this。所以我@Inject lateinit var viewModelFactory: ViewModelFactory没有初始化。我相信注入应该是可能的,因为BottomSheetDialogFragment应该是Fragment类的子类,但看起来并非如此。我使用的android.x相信也会引起问题。Dagger还不支持它吗?

我应该以哪种方式实现ViewModelFactory注入?

更新:当我尝试用注入片段时AndroidInjection.inject(this)androidx.fragment.app.Fragment只有不能使用android.app.Fragement。我扩展了Fragments,DaggerFragment它们可以按预期工作。



1> Alexandr Sus..:

这是我向BottomSheetDialogFragment()提供ViewModel的方式。首先在MyApp类中设置Dagger。

class MyApp : Application(), HasActivityInjector, HasSupportFragmentInjector {

@Inject
lateinit var activityInjector: DispatchingAndroidInjector
@Inject
lateinit var supportFragmentInjector: DispatchingAndroidInjector

override fun onCreate() {
    super.onCreate()

    initDagger()
}

override fun activityInjector(): AndroidInjector = activityInjector

override fun supportFragmentInjector(): AndroidInjector = supportFragmentInjector

private fun initDagger(){
    DaggerAppComponent
        .builder()
        .application(this)
        .build()
        .injectApp(this)
}

然后是AppComponent类

@Singleton
@Component(
modules = [
    AppModule::class,
    UiModule::class,
    AndroidSupportInjectionModule::class,
    AndroidInjectionModule::class
])interface AppComponent : AndroidInjector {

   @Component.Builder
   interface Builder {
       @BindsInstance
       fun application(application: MyApp): Builder

       fun build(): AppComponent
   }

    fun injectApp(app: MyApp)
}

在这里,我们对UiModule :: class感兴趣

@Module
abstract class UiModule {

    @Binds
    abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory

    @PerFragment
    @ContributesAndroidInjector(modules = [(FilterModule::class)])
    abstract fun contributeFilterFragment(): FilterFragment
}

您已经有ViewModelFactory,所以我不粘贴此代码。然后FilterModule

@Module
abstract class FilterModule {

   @Binds
   @IntoMap
   @PerFragment
   @ViewModelKey(FilterViewModel::class)
   abstract fun bindViewModel(viewModel: FilterViewModel): ViewModel
}

最后是FilterFragment和FilterViewModel

class FilterFragment : BottomSheetDialogFragment() {

   @Inject
   lateinit var factory: ViewModelProvider.Factory

   private lateinit var binding: FragmentFilterBinding
   private lateinit var viewModel: FilterViewModel

   override fun onAttach(context: Context?) {
       AndroidSupportInjection.inject(this)
       super.onAttach(context)
   }

   override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
       binding = getDataBinding(inflater, R.layout.fragment_filter, container)
       viewModel = getViewModel(factory)
       binding.viewModel = viewModel
       return binding.root
   }
}

class FilterViewModel @Inject constructor(private val testUseCase:TestUseCase) : BaseViewModel() {
     //do something
}

fragment_filter布局





    

   .......

getDataBinding()和getViewModel()是扩展函数

fun  Fragment.getDataBinding(inflater: LayoutInflater, @LayoutRes layoutId: Int, container: ViewGroup?): T =
    DataBindingUtil.inflate(inflater, layoutId, container, false)

inline fun  Fragment.getViewModel(factory: ViewModelProvider.Factory = ViewModelProviders.DefaultFactory(activity!!.application)): T =
    ViewModelProviders.of(this, factory).get(T::class.java)


推荐阅读
  • 开发笔记:Dagger2 探索记3——两大进阶组件
        今天要讲的时@Scope这个组件。为什么说它是进阶组件,就是因为它基本上没作用,但在理解了基本组件之后又必须用到。 ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 开发笔记:(002)spring容器中bean初始化销毁时执行的方法及其3种实现方式
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了(002)spring容器中bean初始化销毁时执行的方法及其3种实现方式相关的知识,希望对你有一定的参考价值。 ... [详细]
  • C#路径,文件,目录,IO常见问题汇总主要内容:一、路径的相关操作,如判定路径是否合法,路径类型, ... [详细]
  • 1.在gradle中添加依赖在主项目的build.gradle中添加Dagger2库的依赖dependencies{compilecom.google.dagger:dagger: ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本篇文章笔者在上海吃饭的时候突然想到的这段时间就有想写几篇关于返回系统的笔记,所以回家到之后就奋笔疾书的写出来发布了事先在网上找了很多方法,发现有 ... [详细]
  • ExcelApp#启动excel程序ExcelAppCreateOleObject(“Excel.Application”);#加载文件但不显示文件内容(true表 ... [详细]
  • 转载:MFC 获得各类指针、句柄的方法
    2019独角兽企业重金招聘Python工程师标准转载:最近有些人在问MFC编程一些要点,有一些句柄的获取、指针的获取是 ... [详细]
  • C#DataGridView控件中数据导出到Excel方法一:usingSystem;usingSystem.Collections.Generic;usingSys ... [详细]
author-avatar
yeszio
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有