ошибка: [Dagger / MissingBinding] androidx.lifecycle.ViewModelProvider.Factory не может быть предоставлен без аннотируемого метода @ Provides - PullRequest
0 голосов
/ 06 июня 2019

Я прочитал следующие статьи, но не знаю, что делаю неправильно.

  1. Dagger AndroidInjector не может быть предоставлен без аннотируемого метода @ Provides

  2. > не может быть предоставлено без аннотируемого метода @ Provides

трассировка стека

error: [Dagger/MissingBinding] androidx.lifecycle.ViewModelProvider.Factory cannot be provided without an @Provides-annotated method.
A binding with matching key exists in component: com.mycompany.mobile.dagger.AppModule_ContributeSettingsActivityInjector.SettingsActivitySubcomponent
A binding with matching key exists in component: com.mycompany.mobile.settings.dagger.SettingsActivityModule_ContributeSignInPreferencesFragment.AuthenticationPreferencesFragmentSubcomponent
androidx.lifecycle.ViewModelProvider.Factory is injected at
com.mycompany.mobile.notifications.PushJobIntentService.viewModelProviderFactory
com.mycompany.mobile.notifications.PushJobIntentService is injected at
dagger.android.AndroidInjector.inject(T) [com.mycompany.mobile.dagger.AppComponent → com.mycompany.mobile.dagger.AppModule_ContributePushJobIntentServiceInjector.PushJobIntentServiceSubcomponent]

ViewModelProvider.Factory реализация

public class InjectableViewModelProviderFactory implements ViewModelProvider.Factory
{
    private final Map<Class<? extends ViewModel>, Provider<ViewModel>> viewModelMap;

    @Inject
    InjectableViewModelProviderFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> viewModelMap)
    {
        this.viewModelMap = viewModelMap;
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass)
    {
        final Provider<ViewModel> viewModelProvider = viewModelMap.get(modelClass);
        if (viewModelProvider != null)
        {
            final ViewModel viewModel = viewModelProvider.get();
            if (modelClass.isInstance(viewModel))
            {
                final T viewModelAsModelClass = modelClass.cast(viewModel);
                if (viewModelAsModelClass != null)
                    return viewModelAsModelClass;
            }
        }
        throw new IllegalStateException(String.format("Could not find view model provider for %1$s",
            modelClass.getSimpleName()));
    }
}

Модуль # 1

@Module
public abstract class ViewModelInjectionModule
{
    @Binds
    abstract ViewModelProvider.Factory bindViewModelProviderFactory(InjectableViewModelProviderFactory factory);

    @Multibinds
    abstract Map<Class<? extends ViewModel>, ViewModel> provideViewModelProviderMap();
}

Модуль № 2

Существует несколько таких модулей, которые вводят ключи в другие модули.

@Module(includes=ViewModelInjectionModule.class)
public abstract SettingsModule {

@Binds
    @IntoMap
    @ViewModelKey(NotificationsViewModel.class)
    abstract ViewModel bindNotificationsViewModel(NotificationsViewModel viewModel);

    @Binds
    @IntoMap
    @ViewModelKey(DcsViewModel.class)
    abstract ViewModel bindDcsViewModel(DcsViewModel viewModel);
}

Экземпляр ViewModel.Factory внедряется в экземпляр IntentService.

public class PushJobIntentService extends IntentService
{

    @Inject
    ViewModelProvider.Factory viewModelProviderFactory;

    @Override
    protected void onHandleWork(@NonNull Intent intent)
    {

        ... Run an intent service . . . 
    }
}

AppModule

@Module(includes = {
    AnalyticsAppModule.class,
    AppUpgradeModule.class,
    AndroidSupportInjectionModule.class,
    AppDcsModule.class
})
public abstract class AppModule
{

    @ActivityScope
    @ContributesAndroidInjector(modules = {SettingsModule.class})
    abstract SettingsActivity contributeSettingsActivityInjector();
}

AppComponent

@Singleton
@Component(
    modules = {
        AppModule.class,
        .. . Other modules
    })
public interface AppComponent {
    @NonNull
DispatchingAndroidInjector<Activity> getDispatchingActivityInjector();

   . . . Other Activity Injectors. . . 
}

Любое предложение будет оценено.

...