简体   繁体   English

如何将 ViewModelProvider.Factory 注入片段

[英]How to inject ViewModelProvider.Factory into a fragment

In short: How can I inject a ViewModelProvider.Factory into my Fragment to get access to the appropriate ViewModel?简而言之:如何将 ViewModelProvider.Factory 注入我的 Fragment 以访问适当的 ViewModel?

I have an activity with tabs managed by a BottomNavigationBar.我有一个由 BottomNavigationBar 管理的选项卡的活动。 Each tab screen is represented by a Fragment.每个选项卡屏幕都由一个片段表示。 Switching between tabs is done by replacing Fragments.选项卡之间的切换是通过替换 Fragments 来完成的。

Each TabFragment has an associated ViewModel class.每个 TabFragment 都有一个关联的 ViewModel class。 These ViewModel classes take arguments in the constructor, and for this reason I have to create a ViewModelProvider.Factory to use ViewModelProvider.这些 ViewModel 类在构造函数中采用 arguments,因此我必须创建一个 ViewModelProvider.Factory 才能使用 ViewModelProvider。

Naturally, my first instinct would be to inject this Factory into the fragment upon construction, and then retrieve a ViewModel instance via the ViewModelProvider:自然,我的第一反应是在构造时将这个 Factory 注入到片段中,然后通过 ViewModelProvider 检索一个 ViewModel 实例:

class TabA(private val viewModelFactory: ViewModelProvider.Factory) : Fragment() {
    ...
    tabAViewModel = ViewModelProvider(this, viewModelFactory)
            .get(TabAViewmodel::class.java)
    ...
}

Fragments, however, require no-arguments constructors.然而,片段需要无参数的构造函数。 Instead instantiation can be done through a static factory method and simple arguments can be supplied through a Bundle, but it seems that this Bundle cannot contain complex types such as a ViewModelFactory.相反,可以通过 static 工厂方法进行实例化,并且可以通过 Bundle 提供简单的 arguments,但似乎该 Bundle 不能包含复杂类型,例如 ViewModelFactory。

How can I then inject my ViewModelFactory into the Fragment?然后如何将我的 ViewModelFactory 注入到 Fragment 中? Is dependency injection of custom types even possible for fragments?片段是否可以进行自定义类型的依赖注入?

If you want to use a Fragment with constructor arguments you can use FragmentFactory - it is no longer a requirement to have no-arg constructors on fragments.如果您想使用带有构造函数 arguments 的Fragment ,您可以使用FragmentFactory - 不再需要在 Fragment 上使用无参数构造函数。

  1. Create the injectable factory:创建可注入工厂:

     class MyFragmentFactory @Inject constructor(private val viewModelFactoryTabA: ViewModelProvider.Factory): FragmentFactory() { override fun instantiate(classLoader: ClassLoader, className: String): Fragment = when (loadFragmentClass(classLoader, className)) { TabA::class.java -> TabA(viewModelFactoryTabA) else -> super.instantiate(classLoader, className) }

    } }

  2. Set the factory in parent Activity:在父Activity中设置工厂:

     class MyActivity: AppCompatActivity() { @Inject lateinit var fragmentFactory: MyFragmentFactory override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportFragmentManager.fragmentFactory = fragmentFactory }

    } }

More info in the documentation: https://developer.android.com/reference/androidx/fragment/app/FragmentFactory文档中的更多信息: https://developer.android.com/reference/androidx/fragment/app/FragmentFactory

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 将ViewModelProvider.Factory的提供程序注入espresso测试 - Inject provider of ViewModelProvider.Factory into esspresso test 使用匕首将 ViewModelProvider.Factory 注入不同的 Activity - Inject ViewModelProvider.Factory to different Activity using dagger 使用Android上的Dagger和Java,ViewModelProvider.Factory在片段上保持为空 - ViewModelProvider.Factory remains null on fragment using Dagger and Java on Android 匕首2 viewmodels和ViewModelProvider.Factory - dagger 2 viewmodels and ViewModelProvider.Factory 如何在活动之间共享 ViewModelProvider.Factory 实例 - How to share a ViewModelProvider.Factory instance between Activities 从 AndroidViewModel 扩展时如何使用 ViewModelProvider.Factory - How to use a ViewModelProvider.Factory when extends from AndroidViewModel Dagger 2 ViewModelProvider.Factory绑定多次 - Dagger 2 ViewModelProvider.Factory bound multiple times ViewModelProvider.Factory 总是返回一个视图模型 - ViewModelProvider.Factory always return one viewmodel 获取ViewModel ViewModelProvider.Factory和应用程序上下文 - Get ViewModel ViewModelProvider.Factory and Application Context ViewModelProvider.Factory 和 ViewModelProvider.NewInstanceFactory 有什么区别? - What are the differences between ViewModelProvider.Factory and ViewModelProvider.NewInstanceFactory?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM