我正在使用 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);
}