简体   繁体   English

Dagger2如何使用构造函数注入

[英]Dagger2 how to use constructor injection

I've read more about Dagger2 and I find that is similar to Butterknife , because when I need to use it I create a module, and use: 我已经阅读了有关Dagger2的更多信息,并且发现它类似于Butterknife ,因为当我需要使用它时,我创建了一个模块,并使用:

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

to use, for example, this: 使用例如:

@Inject
RegisterPresenter presenter;

but I don't understand how to use constructor injection. 但我不明白如何使用构造函数注入。 I've a case(use model-view-presenter): 我有一个案例(使用model-view-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);

}

is it correct? 这是正确的吗? Or I need to do it? 还是我需要这样做?

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

because if I use the second code, in my activity(View) I need to do it: 因为如果我使用第二个代码,那么我需要在activity(View)中执行以下操作:

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

so how could construct the Presenter? 那么如何构造演示者? Or if I need to create this in Activity, is it correct to pass the module from the view? 或者,如果我需要在“活动”中创建此对象,从视图中传递模块是否正确?

EDIT: these are my models: 编辑:这些是我的模型:

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());
    }
}

} }

Thank you 谢谢

Presenter would be something like this: 演示者将是这样的:

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

}

And then call it in onResume like this 然后像这样在onResume中调用它

presenter.someMethodFromContract();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM