Chr*_*Zou 44 java android dependency-injection dagger dagger-2
我在我的android应用程序中使用Dagger2 for DI.我发现我必须为每个使用@Inject字段的类编写inject方法.有没有办法我可以注入父类,这样我就不必在每个子类上调用注入?以活动为例.我有一个BaseActivity
每个活动都延伸出来的.有没有办法可以在组件中为BaseActivity创建一个注入方法,只需在BaseActivity的onCreate中调用注入,子活动中的@inject字段会自动注入?
Gor*_*dak 41
我遇到了同样的情况.在所有活动中缓解来自公共组件的注入的一种方法如下:
1)扩展Application类,以便能够创建公共组件并保持对它的引用.
public class ApplicationDagger extends Application {
private ApplicationComponent component;
@Override
public void onCreate(){
super.onCreate();
component = DaggerApplicationComponent.builder().applicationModule(new ApplicationModule(this)).build();
}
public ApplicationComponent getComponent(){
return component;
}
}
Run Code Online (Sandbox Code Playgroud)
2)创建一个抽象的DaggerActivity,它从Application获取公共组件并调用抽象方法injectActivity
,将组件作为参数.像这样:
public abstract class DaggerActivity extends Activity {
@Override
public void onCreate(Bundle saved){
super.onCreate(saved);
ApplicationComponent component = ((ApplicationDagger) getApplication()).getComponent();
injectActivity(component);
}
public abstract void injectActivity(ApplicationComponent component);
}
Run Code Online (Sandbox Code Playgroud)
3)最后,你必须实际注入每个Activity
扩展DaggerActivity
.但是现在可以用更少的努力来完成,因为你必须实现该abstract
方法,否则你将得到编译错误.开始了:
public class FirstActivity extends DaggerActivity {
@Inject
ClassToInject object;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//initialize your Activity
}
@Override
public void injectActivity(ApplicationComponent component) {
component.inject(this);
}
}
Run Code Online (Sandbox Code Playgroud)
当然,您仍然必须在Component中明确声明每个Activity.
更新:将@ActivityScope对象注入碎片
在某些时候,我需要使用自定义范围将对象绑定到
Activity
生命周期.我决定延长这篇文章,因为它可能会帮助一些人.
假设你有一个@Module类ActivityModule
和一个@Subcomponent接口ActivityComponent
.
你需要修改DaggerActivity
.该Activities
扩展DaggerActivity
需要实现新的方法(签字的变化).
public abstract class ActivityDagger extends AppCompatActivity {
ActivityComponent component;
@Override
protected void onCreate(Bundle savedInstanceState) {
component = ((ApplicationDagger) getApplication()).getComponent().plus(new ActivityModule(this));
injectActivity(component);
super.onCreate(savedInstanceState);
}
ActivityComponent getComponent() {
return component;
}
public abstract void injectActivity(ActivityComponent component);
}
Run Code Online (Sandbox Code Playgroud)
然后,可以像这样创建一个类FragmentDagger
扩展Fragment
:
public abstract class FragmentDagger extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityDagger activityDagger = (ActivityDagger) getActivity();
ActivityComponent component = activityDagger.getComponent();
injectFragment(component);
}
public abstract void injectFragment(ActivityComponent component);
}
Run Code Online (Sandbox Code Playgroud)
至于Activities
,Fragments
扩展FragmentDagger
只有一种方法可以实现:
public abstract void injectFragment(ActivityComponent component);
Run Code Online (Sandbox Code Playgroud)
您应该可以Fragments
在任何地方重复使用.请注意,应在组件实例化后调用方法super.onCreated()
in ActivityDagger
.否则,你会得到NullPointerException异常时的Activity
状态重新创建,因为该方法super.onCreate()
的Fragment
将被调用.
归档时间: |
|
查看次数: |
17491 次 |
最近记录: |