java - Dagger 2 - 构造函数注入(inject) - 作用域

标签 java android dagger-2

我正在使用具有简单 MVP 模式的 Dagger 2。我有一个 @PerApp@PerActivity 作用域。我正在使用构造函数注入(inject)来注入(inject)演示者依赖项,这使得这些演示者“可注入(inject)”(我不需要在 Activity 模块中编写提供方法)。代码 fragment :

每个应用:

// AppComponent
@PerApp
@Component(modules = {AppModule.class, DataModule.class, NetworkModule.class})
public interface AppComponent {
    LoginComponent plus(LoginModule loginModule);

    MainComponent plus(MainModule mainModule);
}

// Example @PerApp module
@Module
public class NetworkModule {

    @Provides
    @PerApp
    Retrofit providesRetrofit(){
         ...
    }
}

PerActivity:

// LoginModule
@Module
public class LoginModule {
    private final LoginActivity mLoginActivity;

    public LoginModule(LoginActivity loginActivity) {
        mLoginActivity = loginActivity;
    }

    @Provides
    @PerActivity
    Context providesContext() {
        return mLoginActivity;
    }
}

// LoginComponent
@PerActivity
@Subcomponent(
        modules = LoginModule.class
)
public interface LoginComponent {
    void inject(LoginActivity loginActivity);
}

Activity :

public class LoginActivity {
    @Inject LoginPresenter mPresenter;
}

主持人:

public class LoginPresenter {

    @Inject
    public LoginPresenter(Retrofit retrofit) {
        ...
    }
}

效果很好。我的问题是:所提供的 LoginPresenter 的范围是什么?它会和 LoginActivity 一样吗?我应该用 @PerActivity 或其他东西来注释演示者的构造函数吗?

最佳答案

我已经运行了一些测试来自行检查作用域如何与构造函数注入(inject)一起工作,这是我的结果。

1) 将LoginPresenter注入(inject)LoginActivity:

LoginComponent - @PerActivity 范围 (代码与我第一篇文章中的代码完全相同)

我尝试将演示者注入(inject) 2 个变量:

public class LoginActivity {
    @Inject LoginPresenter A;
    @Inject LoginPresenter B;
}

LoginPresenter 注释为:

  • nothing - AB 不同
  • @PerActivity - AB 相同
  • @PerApp - AB 相同

2) 将LoginPresenter注入(inject)LoginActivityMainActivity:

LoginComponent, MainComponent - @PerActivity scope (代码与我第一篇文章中的完全一样) .

我尝试将演示者注入(inject)到 2 个不同的 Activity 中:

public class LoginActivity {
    @Inject LoginPresenter A;
}

public class MainActivity {
    @Inject LoginPresenter B;
}

LoginPresenter 注释为:

  • nothing - AB 不同
  • @PerActivity - AB 不同
  • @PerApp - AB 相同

关于java - Dagger 2 - 构造函数注入(inject) - 作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36447251/

相关文章:

java - Android ScrollView 图标

java - Intent 问题: how to use MainActivity from another class "Adapter" to pass data to SecondActivity

java - 插入性能和插入稳定性差的 Cassandra 集群

java - 从截击 JSON 对象 POST 方法响应中捕获 cookie

android - Dagger 2 和 android Studio : working but can't see generated classes

Dagger 2 模块依赖图 : bound multiple times

java - Executors 类中的 newSingleThreadExecutor() 方法

java - Android:进度对话框错误 java.lang.NullPointerException

Android - UI 操作栏在平板电脑上倾斜

带有 Dagger 2 的 Android MVP - 具有多个 fragment 的 Activity