【问题标题】:Dagger2 Component inject for multiple ActivitiesDagger2 为多个活动注入组件
【发布时间】:2018-06-01 09:37:23
【问题描述】:

对于Dagger2 用户来说,这似乎是一个非常基本的问题。我最近开始使用RetroFit 探索它。我遵循了一些教程并提出了以下代码(其中一些)。

    @Singleton
    @Component(modules = {AppModule.class, ApiModule.class})
     public interface ApiComponent {
    void inject(MainActivity context);
     }


    public class MyApplication extends Application {
    private ApiComponent mApiComponent;
    @Override
    public void onCreate() {
        super.onCreate();
        mApiComponent = DaggerApiComponent.builder()
                .appModule(new AppModule(this))
                .apiModule(new ApiModule("https://rect.otp/demos/"))
                .build();
    }
    public ApiComponent getNetComponent() {
        return mApiComponent;
    }
   }

还有 MainActivity.java

public class MainActivity extends AppCompatActivity {
@Inject
Retrofit retrofit;
ActivityMainBinding mainBinding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    ((MyApplication) getApplication()).getNetComponent().inject(this);
    ApiCall api = retrofit.create(ApiCall.class);
}
}

问题
1. 当我将void inject(MainActivity context); 更改为void inject(Context context); 时,我在retrofit 上得到NullPointerException MainActivity。为什么?

  1. 当使用void inject(MainActivity context); 时它工作正常。为什么?

  2. 如果我需要在多个类中注入 RetroFit,应该采用什么方法。为每个班级创建inject() 似乎不是解决方案。

我是依赖注入的新手。所以我可以对它有一些指导吗?在多个类中使用它的正确方法是什么。

【问题讨论】:

    标签: java android dagger-2


    【解决方案1】:

    当你声明void inject(Context context)时,Dagger会生成代码注入Context。由于Context 没有声明任何@Inject 注释字段,它最终不会注入任何内容。这就是为什么你的retrofit 在注射后是null

    当您声明void inject(MainActivity context) 时,它将生成注入MainActivity 的代码,该代码还将设置您的retrofit,因此它将被初始化。

    Dagger 将注入父字段,但不会注入子字段。您声明的类就是为其生成代码的类。

    您注入对象的默认方式应该是构造函数注入,您不必手动声明方法或注入对象。例如见this answer for reference

    【讨论】:

    • 感谢 David 的回答。这是一个伟大的。那么我知道如果我需要在多个活动和片段中进行字段注入,我必须创建多个注入方法?我错了吗?
    • 巧合 我的最后 4 个问题仅在最近 3 天内由来自奥地利的开发人员回答。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多