tôi đang cố gắng để ràng buộc các lớp con của ViewModel
thành một bản đồ bằng KClass
loại của họ:Binding Into Bản đồ Với Type KClass
@Module abstract class ViewModelModule {
@Binds @IntoMap @ViewModelKey(MyViewModel::class)
abstract fun bindsMyViewModel(viewModel: MyViewModel): ViewModel
@Binds abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
}
Nhưng tôi nhận được biên dịch Dagger lỗi:
e: ~/Example/app/build/tmp/kapt3/stubs/debug/com/example/app/injection/AppComponent.java:5: error: [dagger.android.AndroidInjector.inject(T)] java.util.Map<kotlin.reflect.KClass<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method.
e:
e: public abstract interface AppComponent {
e: ^
e: java.util.Map<kotlin.reflect.KClass<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> is injected at
e: com.example.app.ui.ViewModelFactory.<init>(creators)
e: com.example.app.ui.ViewModelFactory is injected at
e: com.example.app.injection.ViewModelModule.bindViewModelFactory(p0)
e: android.arch.lifecycle.ViewModelProvider.Factory is injected at
e: com.example.app.ui.MyFragment.setViewModelFactory(p0)
e: com.example.app.ui.MyFragment is injected at
e: dagger.android.AndroidInjector.inject(arg0)
Trên đây ViewModelModule
được bao gồm trong số AppModule
của tôi, là một mô-đun trong số AppComponent
của tôi. Vì vậy, Dagger sẽ có thể cung cấp Map<KClass<out ViewModel>, Provider<ViewModel>>
theo yêu cầu của tôi ViewModelFactory
, nhưng tôi không thể hiểu tại sao nó bị rơi.
Tôi cũng đã cố gắng chuyển lớp ViewModelKey
chú thích trên Java, tham gia một Class
như một tham số nhà xây dựng thay vì một KClass
. Sau đó sửa đổi ViewModelFactory
của tôi để phụ thuộc vào một Map<Class<out ViewModel>, Provider<ViewModel>>
, nhưng cùng một lỗi xảy ra.
Bạn thật tuyệt vời, cảm ơn rất nhiều – Roman
Thật tuyệt vời. Tôi sẽ không bao giờ nhận được điều này, tất cả các dự án Kiến trúc của Google Android đều có trong Java! – Arjun