我有两个组件,一个用于应用程序上下文,一个用于活动上下文,如下所示。
@Singleton
@Component(modules = {AppModule.class,})
public interface AppComponent {
@ForApplication
Context context();
//Preferences prefs(); //(Question is related to this line)
}
@PerActivity
@Component(dependencies = AppComponent.class,modules = {ActivityModule.class})
public interface ActivityComponent extends AppComponent {
void inject(ActivityA activity);
}
我想在activitya中注入一个在activitycomponent中声明的singleton类。
@Singleton
public class Preferences {
@Inject
public Preferences(@ForApplication Context context) {
...
}
}
public class ActivityA extends AppCompatActivity {
@Inject
Preferences preferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerActivityComponent.builder()
.appComponent(((MyApplication) getApplication()).getComponent())
.activityModule(new ActivityModule(this))
.build();
}
我正在注射appcomponent在我的应用程序中
onCreate()
和ActivityComponent
在一次创建活动中,在这种情况下,活动如上文所述问题:目前,如果我没有从
AppComponent
(第一个代码块中的注释行)公开这个单例类,并且在appmodule中没有提供方法。我不能编译。编译错误表明我不能引用来自ActivityComponent
的不同作用域,这我有点理解。这意味着,我无法访问具有peractivity作用域组件的单例作用域类。但是,我是否必须为所有单例类提供方法并通过
AppComponent
公开它(我目前正在做和工作)?有没有更好的方法来进行单例类注入? 最佳答案
还有别的办法。声明Activity
组件为Application
subcomponent。这样,在Application
组件中声明的所有内容都在Activity
子组件中可见。
可以通过Activity
组件访问Acpplication
子组件:
GithubClientApplication.get(this)
.getAppComponent()
.provide(new ActivityModule(this))
看看这个关于匕首组件的优秀article,特别是在实现部分。