我有两个组件,一个用于应用程序上下文,一个用于活动上下文,如下所示。

@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组件为Applicationsubcomponent。这样,在Application组件中声明的所有内容都在Activity子组件中可见。
可以通过Activity组件访问Acpplication子组件:

GithubClientApplication.get(this)
            .getAppComponent()
            .provide(new ActivityModule(this))

看看这个关于匕首组件的优秀article,特别是在实现部分。

10-06 10:17