我有一个应用程序,比如说 15 个屏幕。有 3 个主要的、完全独立的活动:
LoginActivity
- 很明显的一个,一些登录的东西MainActivity
- 最重要的,最重要的TheOtherOneNotRelevantAtTheMoment
我决定使用Conductor
,因为我发现 Fragment 的生命周期太复杂了,对我Conductor
来说现在是“热狗屎”
我有很多指挥家的控制器。它们中的大多数都XXXListController
与对应的XXXDetailController
. 所有这些控制器都只存在于内部MainActivity
。这有点像“单一活动应用程序”。LoginActivity
主要是由于 FbLogin 和 Google Login 等第三方 OAuth 的回调而引入的。我只是想MainActivity
完全属于我 - 没有任何其他奇怪的行为。
为了稍微组织依赖关系,我决定使用 Dagger2。我在 Spring 和 JavaEE 方面有很好的经验,所以我认为这很容易。
我认出了几个没有任何问题的模块:
AppModule
- 与我的应用程序相关的东西,如服务器地址等
AndroidModule
- 与类似的东西SharedPreferences
,Application
然后,我几乎“即兴创作”了如何组织我的观点。这就是我所拥有的:
- 3 个附加范围:
ActivityScope
、ControllerScope
和ServiceScope
- 不相关。 - 每个
Controller
都有自己对应的Module
&Component
。我读过这不是一个好主意,但我可以接受 - 每个Controller
都是非常独立的,并且有自己独特的依赖项集。 ApplicationComponent
当然是层次结构的根。MainActivityComponent
是@Subcomponent
一个ApplicationComponent
XXXControllerComponent
是@Subcomponent
一个MainActivityComponent
MainActivity
要在我使用的内部注入依赖项,我发现这段代码很常见:
protected void injectDependencies(ApplicationComponent component) {
component.plus(new MainActivityModule(this)).inject(this);
}
当我想创建和注入依赖项到我Controller
的 s.
MainActivity
外观如下:
@ActivityScope
@Subcomponent(modules = {
MainActivityModule.class
})
public interface MainActivityComponent {
XXXListComponent newXXXListComponent(XXXListModule xxxListModule);
void inject(MainActivity activity);
}
目前,典型的Controller
看起来是这样的:
@ControllerScope
@Subcomponent(modules = {
XXXListModule.class
})
public interface XXXListComponent {
void inject(XXXListController controller);
}
和相应的Module
:
@Module
public class XXXListModule {
private XXXListController listController;
public XXXListModule(XXXListController listController) {
this.listController = listController;
}
@Provides
@ControllerScope
public XXXListController getMainView() {
return ListController;
}
// other not important
}
基本上每个都Controller
应该是单例的——我不想在里面有两个实例MainActivity
——但这不是“必备”。
问题是如何创建Controller
正确的方法。目前,MainActivity
请执行以下操作:
router.pushController(RouterTransaction.with(new XXXListController()));
我不确定这一点,为什么要Controller
手动创建?
Controller
在里面onCreateView()
我已经注入了所有需要的依赖项——在我看来以非常丑陋的方式:
((MainActivity) getActivity()).getMainActivityComponent()
.newXXXListComponent(new XXXListModule(this))
.inject(this);
这个长长的问题帮助我整理了关于 Dagger 的知识——也许有人觉得它有帮助。但!对于那些到达这条线的Stackoverflowers,这是一个好方法还是有其他更好的方法来做到这一点?