Dagger2无法在其他模块中看到使用@Provide注释的方法。没有@ provide-annotated方法

时间:2017-08-08 10:48:49

标签: java android mvvm dependency-injection dagger-2

问题在于,Dagger无法看到我想在 ActivityModule 中使用的依赖关系( DataManager ), ActivityModule ApplicationModule 。我有非常标准的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 中,我尝试注入 WelcomeViewModel ,需要 DataManager 并且消息表明Dagger无法看到 DataManager 提供的位置:

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结构,并且始终没有任何问题。

1 个答案:

答案 0 :(得分:1)

由于您使用Component dependencies,因此需要将DataManager中的ApplicationComponent公开给ActivityComponent

@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
    Context getContext();

    DataManager exposeDataManager();
}