我正在关注 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() {
}
}
我的计划结束。
这几天一直让我烦恼。任何帮助表示赞赏。
答案 0 :(得分:4)
你的错误的因果关系倒退了。 Dagger*
类是注释处理器的最终输出。因为图表中有错误,Dagger处理器无法完成,因此缺少输出。
第二个错误是说您要从未绑定它的组件中请求SharedPreferences
。因为您选择了组件依赖项而不是子组件,所以依赖项的所有绑定都不会继承。为了使LoadingComponent
使用NetComponent
中的绑定,必须在组件接口上公开它们。将SharedPreferences sharedPreferences();
添加到NetComponent
或切换到子组件可以解决您的问题。
有关详细信息,请参阅@Component
docs和page on subcomponents in the user's guide。