dagger2找不到符号

时间:2016-06-22 04:12:10

标签: android dagger-2

我正在关注 TODO 应用的 Dagger2 示例,但却遇到了2个错误。

错误1:找不到符号DaggerNetComponent。 (实际上是哪里)
错误2:如果没有@ provider-annotated方法,则无法提供Sharedpreference。(我认为错误1的结果)

这是我冗长而简单的代码:
三个模块:

@Module
public class AppModule {
    private final Application mApplication;

    AppModule(Application application) {
        mApplication = application;
    }

    @Provides
    Application provideApplication() {
        return mApplication;
    }
}

@Module
public class LoadingModule {
    public final LoadingContract.View mView;

    public LoadingModule(LoadingContract.View mView) {
        this.mView = mView;
    }

    @Provides
    LoadingContract.View provideLoadingContractView() {
        return mView;
    }
}

@Module
public class NetModule {

    @Provides @Singleton
    SharedPreferences providesSharedPreferences(Application application) {
        return PreferenceManager.getDefaultSharedPreferences(application);
    }
}

和两个组成部分:

@Singleton
@Component(modules = {AppModule.class, NetModule.class})
public interface NetComponent {
}

@FragmentScoped
@Component(dependencies = NetComponent.class, modules = LoadingModule.class)
public interface LoadingComponent {
    void inject(LoadingActivity loadingActivity);
}


我在MyApplication中获取NetComponent:

mNetComponent = DaggerNetComponent.builder()
                .appModule(new AppModule(this))
                .netModule(new NetModule())
                .build();
载入活动中的

和LoadingComponent:

DaggerLoadingComponent.builder()
                .netComponent(((MyApplication)getApplication()).getNetComponent())
                .loadingModule(new LoadingModule(loadingFragment))
                .build()
                .inject(this);


我唯一希望LoadingComponent注入的是LoadingPresenter
也在LoadingActivity

@Inject LoadingPresenter mLoadingActivityP; 

这就是LoadingPresenter构建的方式:

public class LoadingPresenter implements LoadingContract.Presenter {
    private SharedPreferences sharedPreferences;
    private LoadingContract.View loadingView;

    @Inject
    public LoadingPresenter(LoadingContract.View loadingView, SharedPreferences sharedPreferences) {
        this.loadingView = loadingView;
        this.sharedPreferences = sharedPreferences;
    }

    @Inject
    void setupListeners() {
        loadingView.setPresenter(this);
    }

    public boolean checkLoginStatus() {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        return sharedPreferences.getBoolean("loginStatus", false);
    }

    @Override
    public void start() {
    }
}


我的计划结束。 这几天一直让我烦恼。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:4)

你的错误的因果关系倒退了。 Dagger*类是注释处理器的最终输出。因为图表中有错误,Dagger处理器无法完成,因此缺少输出。

第二个错误是说您要从未绑定它的组件中请求SharedPreferences。因为您选择了组件依赖项而不是子组件,所以依赖项的所有绑定都不会继承。为了使LoadingComponent使用NetComponent中的绑定,必须在组件接口上公开它们。将SharedPreferences sharedPreferences();添加到NetComponent或切换到子组件可以解决您的问题。

有关详细信息,请参阅@Component docspage on subcomponents in the user's guide