Dagger2 看不到在其他模块中定义的带有@Provide 注解的方法。没有 @provides-annotated 方法就无法提供
Dagger2 can't see method with @Provide annotation defined in other module. Cannot be provided without an @provides-annotated method
问题是 Dagger 看不到我想在 ActivityModule 中使用的依赖项 (DataManager) 应用模块。我有非常标准的 Dagger2 项目结构:
ActivityComponent.java:
@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
void inject(WelcomeFragment fragment); // HERE ERROR IS COMING FROM
}
ApplicationComponent.java:
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
Context getContext();
}
ActivityModule.java:
@Module
public class ActivityModule {
private Activity activity;
public ActivityModule(Activity activity) {
this.activity = activity;
}
@Provides
CompositeDisposable provideCompositeDisposable() {
return new CompositeDisposable();
}
@Provides
@PerActivity
WelcomeViewModel provideWelcomeViewModel(DataManager dataManager, CompositeDisposable compositeDisposable) {
return new WelcomeViewModel(dataManager, compositeDisposable);
}
}
ApplicationModule.java:
@Module
public class ApplicationModule {
private final Application application;
public ApplicationModule(Application application) {
this.application = application;
}
@Provides
Context provideContext() {
return application;
}
@Provides
@Singleton
DataManager provideDataManager(DataManagerImpl dataManager) {
return dataManager;
}
@Provides
@Singleton
Retrofit provideRetrofit() {
return new Retrofit.Builder()
.baseUrl(<API_ADDRESS>)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
}
PerActivity.java:
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {
}
错误出现在 WelcomeFragment 中,我正在尝试 inject WelcomeViewModel需要 DataManager 并且消息表明 Dagger 看不到 DataManager 在哪里 Provided:
Error:(12, 10) error: <PACKAGE_NAME>.data.DataManager cannot be provided without an @Provides-annotated method.
<PACKAGE_NAME>.data.DataManager is injected at
<PACKAGE_NAME>.di.module.ActivityModule.provideWelcomeViewModel(dataManager, …)
<PACKAGE_NAME>.views.welcome.WelcomeViewModel is injected at
<PACKAGE_NAME>.views.welcome.WelcomeFragment.viewModel
<PACKAGE_NAME>.views.welcome.WelcomeFragment is injected at
<PACKAGE_NAME>.di.component.ActivityComponent.inject(fragment)
WelcomeViewModel.java:
public class WelcomeViewModel extends ViewModel {
@Inject
public WelcomeViewModel(DataManager dataManager, CompositeDisposable compositeDisposable) {
super(dataManager, compositeDisposable);
}
(...)
}
WelcomeFragment.java:
public class WelcomeFragment extends BaseFragment {
@Inject WelcomeViewModel viewModel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_welcome, container, false);
getActivityComponent().inject(this);
init();
return view;
}
(...)
}
DataManagerImpl.java:
@Singleton
public class DataManagerImpl implements DataManager {
private Retrofit retrofit;
@Inject
public DataManagerImpl(Retrofit retrofit) {
this.retrofit = retrofit;
}
(...)
}
我只能说我在其他 2 个项目中使用了相同的 Dagger 结构,并且它始终可以正常工作。
由于您使用 Component dependencies,因此您需要将 ApplicationComponent
中的 DataManager
暴露给 ActivityComponent
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
Context getContext();
DataManager exposeDataManager();
}
问题是 Dagger 看不到我想在 ActivityModule 中使用的依赖项 (DataManager) 应用模块。我有非常标准的 Dagger2 项目结构:
ActivityComponent.java:
@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
void inject(WelcomeFragment fragment); // HERE ERROR IS COMING FROM
}
ApplicationComponent.java:
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
Context getContext();
}
ActivityModule.java:
@Module
public class ActivityModule {
private Activity activity;
public ActivityModule(Activity activity) {
this.activity = activity;
}
@Provides
CompositeDisposable provideCompositeDisposable() {
return new CompositeDisposable();
}
@Provides
@PerActivity
WelcomeViewModel provideWelcomeViewModel(DataManager dataManager, CompositeDisposable compositeDisposable) {
return new WelcomeViewModel(dataManager, compositeDisposable);
}
}
ApplicationModule.java:
@Module
public class ApplicationModule {
private final Application application;
public ApplicationModule(Application application) {
this.application = application;
}
@Provides
Context provideContext() {
return application;
}
@Provides
@Singleton
DataManager provideDataManager(DataManagerImpl dataManager) {
return dataManager;
}
@Provides
@Singleton
Retrofit provideRetrofit() {
return new Retrofit.Builder()
.baseUrl(<API_ADDRESS>)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
}
PerActivity.java:
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {
}
错误出现在 WelcomeFragment 中,我正在尝试 inject WelcomeViewModel需要 DataManager 并且消息表明 Dagger 看不到 DataManager 在哪里 Provided:
Error:(12, 10) error: <PACKAGE_NAME>.data.DataManager cannot be provided without an @Provides-annotated method.
<PACKAGE_NAME>.data.DataManager is injected at
<PACKAGE_NAME>.di.module.ActivityModule.provideWelcomeViewModel(dataManager, …)
<PACKAGE_NAME>.views.welcome.WelcomeViewModel is injected at
<PACKAGE_NAME>.views.welcome.WelcomeFragment.viewModel
<PACKAGE_NAME>.views.welcome.WelcomeFragment is injected at
<PACKAGE_NAME>.di.component.ActivityComponent.inject(fragment)
WelcomeViewModel.java:
public class WelcomeViewModel extends ViewModel {
@Inject
public WelcomeViewModel(DataManager dataManager, CompositeDisposable compositeDisposable) {
super(dataManager, compositeDisposable);
}
(...)
}
WelcomeFragment.java:
public class WelcomeFragment extends BaseFragment {
@Inject WelcomeViewModel viewModel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_welcome, container, false);
getActivityComponent().inject(this);
init();
return view;
}
(...)
}
DataManagerImpl.java:
@Singleton
public class DataManagerImpl implements DataManager {
private Retrofit retrofit;
@Inject
public DataManagerImpl(Retrofit retrofit) {
this.retrofit = retrofit;
}
(...)
}
我只能说我在其他 2 个项目中使用了相同的 Dagger 结构,并且它始终可以正常工作。
由于您使用 Component dependencies,因此您需要将 ApplicationComponent
中的 DataManager
暴露给 ActivityComponent
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
Context getContext();
DataManager exposeDataManager();
}