我对Dagger2比较陌生,但我开始喜欢在我的项目中使用它的优势。我目前正在尝试了解自定义范围。
我有这个基本的应用设置:ApplicationComponent
,ActivityComponent
,UserComponent
。这就是我打算让他们在我的应用程序中工作的方式
[-----------User scope-------------]
[ Activity scope ][ Activity scope ][ Activity scope ][ Activity scope ]
[-----------------------Aplication Scope (Singleton)-------------------]
在中间的两个活动中,用户已登录。
我的依赖关系图如下所示:AplicationComponent
< - ActivityComponent
< - UserComponent
UserComponent
取决于ActivityComponent
工作,ActivityComponent
取决于AplicationComponent
。
UserComponent
只是一个“Specialized”ActivityComponent
,它还提供当前登录的用户。
不需要用户的活动将仅使用ActivityComponent
注入,需要注入用户的人将需要使用UserComponent
。希望它有意义。
当用户第一次登录时,我会在当前活动中创建UserComponent
:
ActivtyComponent activityComponent = DaggerActivityComponent.builder()
.activityModule(new ActivityModule(this)) //** here, 'this' is the current Activity
.applicationComponent(MyApplication.getApp(getActivity()).getAppComponent())
.build();
UserComponent userComponent = DaggerUserComponent.builder()
.activityComponent(activityComponent)
.build();
userComponent.inject(this);
//Store user component to be retrieved by other activities
MyApplication.getApp(getActivity()).storeUserComponent(userComponent);
这很好用。现在,假设我开始 new 活动并尝试注入其依赖项。这个时间要容易得多,因为这个原因我已经存储了一个UserComponent!我可以使用那个,对吧?:
MyApplication.getApp(getActivity()).getUserComponent().inject(this);
错了!......它会崩溃!因为该组件仍然存储在其活动模块中的先前活动(**见上面的代码)
而且我不想创建另一个UserComponent,这会使范围变得无用......所有提供的方法都会被再次调用,我是对的吗?
我需要那个特定的组件,而不是新组件。但我必须以某种方式将其ActivityComponent换成一个新的,新的将在其activityModule中传递此活动...这是我的问题:
有可能吗?我是以正确的方式看待这个吗? 我可以更改已构建组件中的子组件吗?
提前致谢
答案 0 :(得分:1)
通常大多数教程显示的方式是您拥有AppComponent <- UserComponent <- ActivityComponent
组件创建一次范围对象,如果有什么变化,您应该创建一个新组件。匕首2中没有热交换模块或物体,如果你试着这样想,你会明白为什么:
如果你提供依赖关系A,那么在任何地方使用A,然后用NEW-A替换A并从那时开始使用NEW-A ......这是一个你可能想要避免的真正不一致的状态。
组件应该处于各自的生命周期中。如果您的组件保留对活动的引用,它应该与此活动一起使用,否则将导致内存泄漏(或类似您的错误)。
如果您的用户组件依赖于应用程序,那么您可以将该组件存储在应用程序中而不会产生任何问题。然后,您的活动只需使用应用程序或用户组件创建自己的作用域组件。