【问题标题】:Dagger2 how to use constructor injectionDagger2如何使用构造函数注入
【发布时间】:2017-05-19 13:02:25
【问题描述】:

我阅读了更多关于 Dagger2 的内容,发现它类似于 Butterknife,因为当我需要使用它时,我会创建一个模块,然后使用:

   ((MyApp) getApplication()).createAppComponent().inject(this);

使用,例如,这个:

@Inject
RegisterPresenter presenter;

但我不明白如何使用构造函数注入。我有一个案例(使用模型视图演示器):

private Register.View view;
private RegisterModel model;
private StorageModel storageModel;
private DatabaseModel databaseModel;
private Uri compressPath;

List<String > stringList;
String uid;

@Inject
public RegisterPresenter() {
    model = new RegisterModel(this);
    storageModel = new StorageModel(this);
    databaseModel = new DatabaseModel(this);

}

正确吗?还是我需要这样做?

 @Inject
    public RegisterPresenter(RegisterModel model, StorageModel storageModel, DatabaseModel databaseModel) {
        this.model = model;
        this.storageModel = storageModel;
        this.databaseModel = databaseModel;
    }

因为如果我使用第二个代码,在我的活动(视图)中我需要这样做:

protected void onResume() {
        super.onResume();
        presenter.setView(this);
    }

那么如何构建 Presenter 呢?或者如果我需要在 Activity 中创建它,从视图中传递模块是否正确?

编辑:这些是我的模型:

public class FirebaseModel implements Model, FirebaseAuth.AuthStateListener {


    FirebaseAuth auth;

    Presenter presenter;
    FirebaseUser user;

    @Inject
    public FirebaseModel(Presenter presenter) {
        this.presenter = presenter;
        auth = FirebaseAuth.getInstance();

    }


    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
        user = auth.getCurrentUser();
        presenter.updateUser(user);

    }


    @Override
    public void loadUser() {

        auth.addAuthStateListener(this);
    }
}
public class StorageModel implements Register.Storage,OnCompleteListener <UploadTask.TaskSnapshot>{

Register.Presenter presenter;
StorageReference storage;

@Inject
public StorageModel(Register.Presenter presenter) {
    this.presenter = presenter;
    storage = FirebaseStorage.getInstance().getReferenceFromUrl("gs://firebase-happypark.appspot.com");
}



@Override
public void onTryToUpdateUser(Uri path,String uid) {
    if(path != null) {
        StorageReference riversRef = storage.child("uid").child("ImgProfile/" + path.getLastPathSegment());
        UploadTask uploadTask = riversRef.putFile(path);
        Log.d("ssd", "sto qua");
        uploadTask.addOnCompleteListener(this);
     }
 }


//UNNECESSARY

@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {

    if (task.isSuccessful()) {
        presenter.onUploadCompleted();
    } else {
        presenter.onUploadError(task.getException());
    }
}

}

谢谢

【问题讨论】:

  • 第二个例子是正确的
  • @tompadre 如何用这种结构注入 RegisterPresenter 的字段?
  • 也许看看前一周的答案stackoverflow.com/a/43822373/1837367
  • @DavidMedenjak 如果构造函数有参数,我不明白如何使用 Inject

标签: android dependency-injection dagger-2 android-mvp


【解决方案1】:

Presenter 应该是这样的:

public class RegisterPresenter implements RegisterContract.Presenter {

private Register.View view;
private RegisterModel model;
private StorageModel storageModel;
private DatabaseModel databaseModel;
private Uri compressPath;

List<String > stringList;
String uid;

@Inject
 public RegisterPresenter(Register.View view, RegisterModel model, StorageModel storageModel, DatabaseModel databaseModel) {

    this.view = view;
    this.model = model;
    this.storageModel = storageModel;
    this.databaseModel = databaseModel;
}

@Override
public void someMethodFromContract(){}

//or anything else you have in mind

}

然后像这样在 onResume 中调用它

presenter.someMethodFromContract();

【讨论】:

  • 但是如果我调用 someMethodFromContract() Dagger 如何实例化模型、storageModel 和 databaseModel ?
  • 我不确定您所说的“实例化模型”是什么意思?如果您已经正确地完成了这些存储和数据库模型,只需创建一些依赖于该模型的接口并在该接口中创建注入方法。如果您的意思是如何准确地注入您的课程,那么我认为您在问题中的第一行代码应该可以完成工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2016-11-26
  • 2011-05-11
  • 2019-05-15
相关资源
最近更新 更多