【发布时间】:2020-12-28 16:43:06
【问题描述】:
我想要范围 ViewModel,它是 Fragment 而不是活动的依赖项,
interface MarsRepository {
suspend fun getProperties(): List<Mars>
}
@Module
@InstallIn(FragmentComponent::class)
class MarsRepositoryModule {
@Provides
fun bindRemoteMarsDataSource(): MarsRepository{
return RemoteMarsStorageImp()
}
}
class MarsViewModel @ViewModelInject constructor(private val repository: MarsRepository): ViewModel()
@AndroidEntryPoint
class MarsFragment: Fragment() {
val viewModel by viewModels<MarsViewModel>()
}
但我得到了这个
/app/build/generated/source/kapt/debug/com/Sample/bestcase/DevByteApplication_HiltComponents.java:111: error: [Dagger/MissingBinding] com.Sample.domain.repository.MarsRepository cannot be provided without an @Provides-annotated method.
public abstract static class SingletonC implements DevByteApplication_GeneratedInjector,
^
javax.inject.Provider<com.Sample.domain.repository.MarsRepository> is injected at
com.Sample.bestcase.features.mars.MarsViewModel_AssistedFactory(repository)
com.Sample.bestcase.features.mars.MarsViewModel_AssistedFactory is injected at
com.Sample.bestcase.features.mars.MarsViewModel_HiltModule.bind(factory)
java.util.Map<java.lang.String,javax.inject.Provider<androidx.hilt.lifecycle.ViewModelAssistedFactory<? extends androidx.lifecycle.ViewModel>>> is injected at
androidx.hilt.lifecycle.ViewModelFactoryModules.ActivityModule.provideFactory(…, viewModelFactories)
@dagger.hilt.android.internal.lifecycle.DefaultActivityViewModelFactory java.util.Set<androidx.lifecycle.ViewModelProvider.Factory> is requested at
dagger.hilt.android.internal.lifecycle.DefaultViewModelFactories.ActivityEntryPoint.getActivityViewModelFactory() [com.Sample.bestcase.DevByteApplication_HiltComponents.SingletonC → com.Sample.bestcase.DevByteApplication_HiltComponents.ActivityRetainedC → com.Sample.bestcase.DevByteApplication_HiltComponents.ActivityC]
The following other entry points also depend on it:
dagger.hilt.android.internal.lifecycle.DefaultViewModelFactories.FragmentEntryPoint.getFragmentViewModelFactory() [com.Sample.bestcase.DevByteApplication_HiltComponents.SingletonC → com.Sample.bestcase.DevByteApplication_HiltComponents.ActivityRetainedC → com.Sample.bestcase.DevByteApplication_HiltComponents.ActivityC → com.Sample.bestcase.DevByteApplication_HiltComponents.FragmentC]
只有通过 ActivityComponent 安装才能工作
@Module
@InstallIn(ActivityComponent::class)
class MarsRepositoryModule {
@Provides
fun bindRemoteMarsDataSource(): MarsRepository{
return RemoteMarsStorageImp()
}
}
当我跟踪代码时,它使用 DefaultActivityViewModelFactory 而不是 DefaultFragmentViewModelFactory
/**
* Hilt Modules for providing the activity level ViewModelFactory
*/
@Module
@InstallIn(ActivityComponent.class)
public abstract static class ActivityModule {
@NonNull
@Multibinds
abstract Map<String, ViewModelAssistedFactory<? extends ViewModel>> viewModelFactoriesMap();
@Provides
@IntoSet
@NonNull
@DefaultActivityViewModelFactory
static ViewModelProvider.Factory provideFactory(
@NonNull Activity activity,
@NonNull Application application,
@NonNull Map<String, Provider<ViewModelAssistedFactory<? extends ViewModel>>>
viewModelFactories) {
// Hilt guarantees concrete activity is a subclass of ComponentActivity.
SavedStateRegistryOwner owner = (ComponentActivity) activity;
Bundle defaultArgs = activity.getIntent() != null
? activity.getIntent().getExtras() : null;
SavedStateViewModelFactory delegate =
new SavedStateViewModelFactory(application, owner, defaultArgs);
return new HiltViewModelFactory(owner, defaultArgs, delegate, viewModelFactories);
}
}
/**
* Hilt Modules for providing the fragment level ViewModelFactory
*/
@Module
@InstallIn(FragmentComponent.class)
public static final class FragmentModule {
@Provides
@IntoSet
@NonNull
@DefaultFragmentViewModelFactory
static ViewModelProvider.Factory provideFactory(
@NonNull Fragment fragment,
@NonNull Application application,
@NonNull Map<String, Provider<ViewModelAssistedFactory<? extends ViewModel>>>
viewModelFactories) {
Bundle defaultArgs = fragment.getArguments();
SavedStateViewModelFactory delegate =
new SavedStateViewModelFactory(application, fragment, defaultArgs);
return new HiltViewModelFactory(fragment, defaultArgs, delegate, viewModelFactories);
}
private FragmentModule() {
}
}
【问题讨论】:
标签: android dagger dagger-hilt