我遇到了同样的情况。一种在所有活动中简化来自公共组件的注入的方法如下:
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;
}
}
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);
}
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);
}
}
当然,您仍然需要在组件中显式声明每个 Activity。
更新:将@ActivityScope 对象注入片段
在某些时候,我需要使用 custom scopes 将对象绑定到
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);
}
然后,可以像这样创建一个扩展Fragment 的类FragmentDagger:
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);
}
对于Activities,扩展FragmentDagger的Fragments只有一种实现方法:
public abstract void injectFragment(ActivityComponent component);
你应该能够在任何你想要的地方重复使用Fragments。请注意,
ActivityDagger 中的方法 super.onCreated() 应该在组件实例化之后调用。否则,在重新创建Activity 状态时会得到NullPointerException,因为会调用Fragment 的方法super.onCreate()。