gpt4 book ai didi

java - 通过 Dagger 将 Presenter 注入(inject) Activity

转载 作者:行者123 更新时间:2023-11-30 10:14:35 26 4
gpt4 key购买 nike

我想知道如何使用代码在 Activity 中注入(inject) Presenter 以下是详细信息

错误信息如下:

 Error:(12, 46) error: cannot find symbol class DaggerCategoryPresenterComponent
Error:(9, 46) error: cannot find symbol class DaggerNetComponent
Error:(18, 10) error: [Dagger/MissingBinding] com.headytest.android.category_listing.CategoryContract.CategoryPresenter cannot be provided without an @Provides-annotated method.
com.headytest.android.category_listing.CategoryContract.CategoryPresenter is injected at
com.headytest.android.MainActivity.categoryPresenter
com.headytest.android.MainActivity is injected at
com.headytest.android.dagger_component.NetComponent.inject(com.headytest.android.MainActivity)

以下是模块

  @Module
public class NetworkModule {

String baseURL;

public NetworkModule(String baseURL) {
this.baseURL = baseURL;
}

@Provides
@Singleton
Cache provideHttpCache(Application application) {
int cacheSize = 10 * 1024 * 1024;
Cache cache = new Cache(application.getCacheDir(), cacheSize);
return cache;
}

@Provides
@Singleton
Gson provideGson() {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
return gsonBuilder.create();
}

@Provides
@Singleton
OkHttpClient provideOkhttpClient(Cache cache) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder client = new OkHttpClient.Builder();
client.cache(cache);
client.addInterceptor(interceptor);
return client.build();
}

@Provides
@Singleton
Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) {
try {
return new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(baseURL)
.client(okHttpClient)
.build();
} catch (Exception e) {
e.printStackTrace();
return new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(Constants.BASE_URL)
.client(okHttpClient)
.build();
}
}
}

应用模块

@Module
public class ApplicationModule {

Application application;

public ApplicationModule(Application application) {
this.application = application;
}

@Provides
@Singleton
Application providesApplication() {
return application;
}
}

CategoryContractModule

@Module
public class CategoryContractModule {


public CategoryContractModule() {
}

@Provides
@AScope
CategoryContract.CategoryPresenter providesCategoryPresenter(CategoryPresenterImpl categoryPresenter) {
return (CategoryContract.CategoryPresenter)categoryPresenter;
}
}

以下是组件:

@Singleton
@Component(modules = {ApplicationModule.class, NetworkModule.class})
public interface NetComponent {
void inject(MainActivity activity);
}

CategoryPresenterComponent:

@AScope
@Component(dependencies = NetComponent.class, modules =
{CategoryContractModule.class})
public interface CategoryPresenterComponent {
void inject(MainActivity activity);
}

AScope

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface AScope {
}

MainActivity中的代码如下:

@Inject
CategoryPresenter categoryPresenter;

@Inject
Retrofit retrofit;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerCategoryPresenterComponent.builder()
.categoryContractModule(new CategoryContractModule())
.netComponent(((App) getApplicationContext()).getNetComponent())
.build()
.inject(this);
}

CategoryPresenterImpl

    public class CategoryPresenterImpl implements CategoryContract.CategoryPresenter {

@Inject
public CategoryPresenterImpl() {
}

@Override
public void onStart() {

}

@Override
public void onStop() {

}

@Override
public void getCategoryLiast() {


}
}

最佳答案

我认为当前的错误很容易修复,因为它看起来很像 this问题。

您已指示 Dagger 如何提供 @AScope CategoryContract.CategoryPresenter 但在 Activity 中您请求 Dagger 注入(inject) CategoryContract.CategoryPresenter。 Dagger 在这一点上很困惑,因为这两个东西不匹配。

您只需将 @AScope 添加到 categoryPresenter 即可:

@Inject
@AScope
CategoryPresenter categoryPresenter;

我已经 checkout your project .问题出在 NetComponent.java 中:

@Singleton
@Component(modules = {ApplicationModule.class, NetworkModule.class})
public interface NetComponent {
void inject(MainActivity activity);
}

问题在 void inject(MainActivity activity) 行。为什么这是一个问题?因为当你在 App 中构建 NetComponent 时,dagger 分析 MainActivity@Inject 注释的字段并看到 CategoryPresenter。这意味着,此时 Dagger 应该找到合适的提供者/绑定(bind)器方法,以便能够注入(inject)在此接口(interface)内声明的 MainActivity

但是它找不到这样的提供者/绑定(bind)器方法,因为它是在另一个组件 - CategoryPresenterComponent 中声明的,而这个组件 (NetComponent) 没有连接到 CategoryPresenterComponent 无论如何(子组件或组件依赖项),因此不会公开绑定(bind)。

只需删除该行即可使您的构建成功:

@Singleton
@Component(modules = {ApplicationModule.class, NetworkModule.class})
public interface NetComponent {
}

要解决 “错误:无法访问 Nullable”,请参阅 this线程,建议将 compile 'com.google.code.findbugs:jsr305:3.0.2' 应用到您的 gradle 文件。

完成此操作后,您将克服该错误消息,并会偶然发现 retrofit2。如果没有 @Inject 构造函数或 @Provides-annotated 方法,则无法提供 Retrofit,其症状与 CategoryPresenter 有。

要克服这个问题,您必须在 NetComponent 中添加一个 Retrofit 提供程序方法(或从 Activity 中删除 @Inject Retrofit retrofit):

@Singleton
@Component(modules = {ApplicationModule.class, NetworkModule.class})
public interface NetComponent {
Retrofit providesRetrofit();
}

完成此操作后,您将能够运行该应用程序,但由于这一行,您最终会进入 MainActivity 中的 NPE:

.categoryContractModule(new CategoryContractModule(retrofit.create(HeadyAPI.class)))

您指的是尚未初始化的 retrofit 对象。

长话短说,您最初的问题发生了几次变化,实际上您的代码中存在一些问题。你仍然有问题,因为你正在尝试使用 retrofit 来构建一个组件,它应该为你注入(inject) retrofit

关于java - 通过 Dagger 将 Presenter 注入(inject) Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50837576/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com