ViewModel 中使用 Dagger(不是 Hilt,只是 dagger)的 @AssistedInject 无法编译:没有 @Inject 构造函数就无法提供

问题描述 投票:0回答:1

我正在使用 Android Studio - Dagger 2.35.1(不是 Hilt,只是 dagger),ViewModel 注入使用 @Inject constructor() 模式工作正常,一切都很有趣和游戏,但我通过一个函数将 id 传递给 viewmodel是我不喜欢的东西,所以,现在我尝试在 ViewModel 中实现 @Assisted 参数,以便 ViewModel 在构造过程中接收参数,该参数来自活动的意图。

将 @AssistedInject constructor() 模式添加到 ViewModel 后,现在 dagger 抱怨:

[如果没有 @Inject 构造函数或 @Provides 注释方法,则无法提供 Dagger/MissingBinding DetailsViewModel

我已经搜索了所有问题和示例,但没有人解释完整的解决方案或为什么 dagger 发送该错误,他们只是发布代码段,似乎 dagger 甚至不知道如何处理 @AssistedInjection,此时我已经出局了的想法。

class DetailsViewModel @AssistedInject constructor(
    application: Application,
    val repository: DetailsRepository,
    @Assisted val id: String,
) : BaseViewModel(application) {

    @AssistedFactory
    interface Factory { fun create(@Assisted id: String) : DetailsViewModel }

    companion object {
        @Suppress("UNCHECKED_CAST")
        fun factory(
            factory: Factory,
            id: String
        ) : ViewModelProvider.Factory {
            return object : ViewModelProvider.Factory {
                override fun <T : ViewModel> create(modelClass: Class<T>): T =
                    factory.create(id) as T
            }
        }
    }


class DetailsActivity : AppCompatActivity() {
    
    @Inject
    lateinit var viewModelFactory: DetailsViewModel.Factory

    private lateinit var viewModel: DetailsViewModel

     override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
        (application as MyApplication).appComponent.inject(this)

        val id = intent.getStringExtra("ID").orEmpty()

        viewModel = ViewModelProvider(this, DetailsViewModel.factory(
            viewModelFactory, id
        ))[DetailsViewModel::class.java]

}

ViewModelModule.java

@Module
public abstract class ViewModelModule {

   @Binds
   @IntoMap
   @ViewModelKey(DetailsViewModel.class)
   abstract ViewModel bindDetailsViewModel(DetailsViewModel viewModel);
}

AppComponent.java

@Singleton
@Component(modules = {AppModule.class, .class, ViewModelModule.class})
public interface AppComponent {

    void inject(DetailsActivity activity);

}
android dependency-injection viewmodel dagger
1个回答
0
投票

ViewModelModule
就是问题所在。您尝试将 ViewModel 绑定到地图,但不能,因为 ViewModel 本身不是对象图的一部分,因此您不能将其作为依赖项,因为 Dagger 无法自行创建它— 图中只有工厂,您可以使用工厂来创建 ViewModel。

设置实际上更简单:您可以放弃

ViewModelModule
,您应该已经可以开始了。您可以检查此评论作为参考,我建议您查看我的评论这里以及使用
viewModels()
扩展进一步简化设置的想法。

© www.soinside.com 2019 - 2024. All rights reserved.