gpt4 book ai didi

java - Dagger2 - 项目重建错误 - 字段注入(inject) - Android

转载 作者:行者123 更新时间:2023-12-02 02:21:58 26 4
gpt4 key购买 nike

我一直在尝试实现 Dagger2。

问题:当我使用构造函数注入(inject)时,它工作正常,但是当我使用字段注入(inject)时,它会抛出如下错误:

Error:(6, 48) error: cannot find symbol class DaggerApplicationComponent
/home/moderator/Downloads/Maulik/Sample Codes/Made/Dagger2Demo/app/src/main/java/com/dagger2demo/dagger2demo/di/component/ApplicationComponent.java
Error:(18, 10) error: com.dagger2demo.dagger2demo.mvp.HomePresenter cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method. This type supports members injection but cannot be implicitly provided.
com.dagger2demo.dagger2demo.mvp.HomePresenter is injected at
com.dagger2demo.dagger2demo.mvp.BaseActivity.homePresenter
com.dagger2demo.dagger2demo.mvp.BaseActivity is injected at
com.dagger2demo.dagger2demo.di.component.ApplicationComponent.inject(baseActivity)
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

Dagger2 - 我的理解:您必须创建一个将在其中创建方法的模块类。这些方法将为您提供所需类的相应对象,例如 Retrofit、ApplicationContext 等。您将创建一个组件接口(interface),在其中定义在何处注入(inject)模块类的依赖项。

我正在使用: Retrofit、RxJava - RaxAndroid、Dagger2 和 MVP。

代码如下:

build.gradle(应用程序)

// Retrofit Dependency
compile 'com.squareup.retrofit2:retrofit:2.3.0'

// Gson Converter Factory Dependency
compile 'com.squareup.retrofit2:converter-gson:2.3.0'

// RxJava2 Adapter Dependency for Retrofit2
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

// ButterKnife Dependencies
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

// RxJava & RxAndroid Dependencies
compile group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.1.8'
compile group: 'io.reactivex.rxjava2', name: 'rxandroid', version: '2.0.1'

// Dagger2 Dependency
compile 'com.google.dagger:dagger:2.14.1'
annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1'

Dagger2DemoApplication.java

    public class Dagger2DemoApplication extends Application {

private ApplicationComponent mApplicationComponent;

@Override
public void onCreate() {
super.onCreate();

mApplicationComponent = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule())
.build();
}

public ApplicationComponent getmApplicationComponent() {
return mApplicationComponent;
}
}

ApplicationModule.java

    @Module
public class ApplicationModule {

@Provides
@Singleton
public APIEndPoints provideAPIEndPoints() {

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://reqres.in/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();

APIEndPoints apiEndPoints = retrofit.create(APIEndPoints.class);

return apiEndPoints;
}
}

ApplicationComponent.java

    @Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {

void inject(BaseActivity baseActivity);
}

BaseActivity.java

    public class BaseActivity extends AppCompatActivity {

// Variables
public ProgressDialog mProgressDialog;

@Inject
HomePresenter homePresenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// For Dagger2 i.e Creating instance of all provide methods defined in ApplicationModule
((Dagger2DemoApplication) getApplication()).getmApplicationComponent().inject(this);

setupProgressBar();
}

private void setupProgressBar() {
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setTitle(getString(R.string.str_progress_dialog_title));
mProgressDialog.setMessage(getString(R.string.str_progress_dialog_desc));
mProgressDialog.setCancelable(false);
}
}

BaseView.java

    public interface BaseView extends View {

void handleResponse(Object obj);

void showMessage(String msg);
}

View.java

    public interface View {

}

BasePresenter.java

public interface BasePresenter {

void attachView(View view);

void callAPI();
}

HomePresenter.java

    public class HomePresenter implements BasePresenter {

private BaseView mBaseView;

@Inject
APIEndPoints mApiEndPoints;

/*@Inject
public HomePresenter(APIEndPoints apiEndPoints) {
this.mApiEndPoints = apiEndPoints;
}*/

@Override
public void attachView(View view) {
mBaseView = (BaseView) view;
}

@Override
public void callAPI() {

// Actually calling API here with observable object - Start
Observable<Users> usersObservable = mApiEndPoints.getUsers();

usersObservable
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onSuccess, this::onError);
// Actually calling API here with observable object - End
}

private void onSuccess(Users users) {
mBaseView.handleResponse(users);
}

private void onError(Throwable throwable) {
mBaseView.showMessage(throwable.toString());
}
}

HomeActivity.java

    public class HomeActivity extends BaseActivity implements BaseView {

// Widgets
@BindView(R.id.rv_users)
RecyclerView rv_users;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// For ButterKnife
ButterKnife.bind(this);

// Initializing Presenter
homePresenter.attachView(this);
}

public void getDataFromServer(View view) {
mProgressDialog.show();
homePresenter.callAPI();
}

// BaseView Methods
@Override
public void handleResponse(Object obj) {
Users users;
if (obj instanceof Users) {
users = (Users) obj;
if (users != null) {
mProgressDialog.dismiss();
rv_users.setLayoutManager(new LinearLayoutManager(HomeActivity.this));
rv_users.setAdapter(new RVAdapter(users.getData()));
}
}
}

@Override
public void showMessage(String msg) {
if (msg != null) {
mProgressDialog.dismiss();
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
}
}

正如你所看到的,我在 HomePresenter 中评论了构造函数注入(inject)。我在那里进行现场注入(inject)。但我无法构建该项目,因为我遇到了如上所述的错误。

任何帮助将不胜感激。如果需要与代码相关的任何其他内容,请告诉我。

提前致谢。

编辑:PS:我知道答案,但我就是不明白为什么要进行现场注入(inject),即@Inject APIEndPoints mApiEndPoints; 在 HomePresenter 中不起作用。请有人解释一下。

最佳答案

As you can see I commented Constructor Injection in HomePresenter. I'm having Field Injection there instead.

如果您使用构造函数注入(inject),那么 Dagger 将为您创建对象并了解它的所有信息。

如果您使用字段注入(inject),那么必须创建对象告诉 Dagger 相关信息。

我不明白为什么在这种情况下您更愿意使用字段注入(inject),但是通过字段注入(inject),您需要向模块之一添加一个 @Provides 带注释的方法,以便 Dagger 能够访问您的演示者。

您需要在模块中使用 Contrucotr 注入(inject)或 @Provides 注释方法,正如错误所述。

关于java - Dagger2 - 项目重建错误 - 字段注入(inject) - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48380865/

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