我看了几篇不同的文章,这些文章似乎建议在Dagger 2中使用两种不同的方法进行自定义范围界定:
>
在配置更改第2部分(Github repo)中幸存的MVP演示者:
Hello1Frament
和@Hello2Scope
的和Hello2Frament
在Android上品尝匕首2:
对所有片段使用单个自定义范围,例如@PerFragment
据我所知,似乎在方法2中,定义一个可用于所有片段的单一作用域是可以的(即,
@PerFragment
)。事实上(如果我错了,请纠正我),似乎自定义范围的名称无关紧要,只有在创建子组件的地方(即在应用程序、活动或片段中)才重要。
是否存在为每个片段定义唯一作用域的用例,如案例1?
你的理解是正确的。命名的作用域允许您传达意图,但它们都以相同的方式工作。
不过,组件实例的生存期很重要。同一组件的两个不同实例将提供不同的对象实例,甚至是范围不同的实例。
作用域名称应该指示所提供对象的生存期(与组件实例的生存期相匹配),因此@PerFragment
对我来说更有意义。
快速查看“MVP演示者…”在本教程中,我不清楚作者使用单独作用域的确切意图。既然这些名字都是一次性的,我就不会读太多了。
在阅读了@vaughandroid的答案后,是什么决定了Dagger 2中组件(对象图)的生命周期?我想我对自定义范围的理解足以回答我自己的问题。
首先,在dagger2中处理组件、模块和范围标注时,这里有一些规则。
@Singleton
或@CustomScope
)
@Singleton
。子组件必须使用自定义范围,但该范围的功能与@Singleton
完全相同
现在,要回答这个问题:我会说为每个概念上不同的范围创建一个新的命名范围。例如,创建一个@PerActive
、@PerFrament
或@PerView
注释,指示组件应该在哪里实例化,从而指示其生存期。
注:这是两个极端之间的折衷。考虑根元素和需要的N个子组件的情况:
@Singleton
和@SubSingleton
)和@Singleton
,@SubSingleton1
,…@SubSingletonN
)
应用:
/** AppComponent.java **/
@Singleton
@Component( modules = AppModule.class )
public interface AppComponent{
void inject(MainActivity mainActivity);
}
/** AppModule.java **/
@Module
public class AppModule{
private App app;
public AppModule(App app){
this.app = app;
}
// For singleton objects, annotate with same scope as component, i.e. @Singleton
@Provides @Singleton public App provideApp() { return app; }
@Provides @Singleton public EventBus provideBus() { return EventBus.getDefault(); }
}
片段:
/** Fragment1Component.java **/
@PerFragment
@Component( modules = {Fragment1Module.class}, dependencies = {AppComponent.class} )
public interface Fragment1Component {
void inject(Fragment1 fragment1);
}
/** Fragment1Module.java **/
@Module
public class Fragment1Module {
// For singleton objects, annotate with same scope as component, i.e. @PerFragment
@Provides @PerFragment public Fragment1Presenter providePresenter(){
return new Fragment1Presenter();
}
}
/** PerFragment.java **/
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerFragment {}
我一直在看谷歌Android架构的MVP与匕首2的例子: https://github.com/googlesamples/android-architecture/blob/todo-mvp-dagger/todoapp/app/src/main/java/com/example/android/architecture/blueprents/todoapp/tasksactivity.java
我不知道如何使用以下内容显示自定义片段: 类型不匹配:推断的类型是LoginFrament,但预期是片段
问题内容: 我可能错过了一些东西,但我认为像@Singleton这样的作用域用于定义“作用域生命周期”。 我在Android应用程序中使用了Dagger 2(但我认为问题根本与android相关)。 我有1个模块: 我有两个与范围不同的组件: 两者,并且,有一个构造函数。虽然MenuPresenter期望将其作为参数,但LoginPresenter却采用了: 但是每次我使用这些组件创建一个或时,都
我已经和匕首2一起工作了一段时间,我还在试图弄清楚一些事情。我仍然不能很好地管理的一件事是为不同的情况设置模块和组件,比如一个有几个片段的活动。我看过很多实现,大多数时候都有点不同。 所以,让我公开我目前的应用程序结构使用MVP,我想要一些意见,如果我的实现是好的或不是。 现在,MainActivity有3个片段,我将为片段创建3个模块和1个组件 然后我必须实例化Dagger,首先在我的应用程序类
我在android项目中使用Dagger2我有两个作用域:ActivityScope和FragmentScope我读了一些示例代码,他们说定义并使用ActivityScope,所以对象将在activity lifecycle中销毁。因为活动和片段有不同的生命周期,所以我们应该有两个作用域。 我的问题是:我是否需要做一些事情让代码知道,当我使用ActivityScope时,对象应该随活动生命周期一起
编辑:小心!我已经删除了这个问题中提到的旧存储库。请看我自己对问题的答案,以获得一个可能的解决方案,并随时改进它! 我指的是我的职位。现在我走得更远了。我还提到了github项目中的两个分支: null 提供了 我的使用了: 提供了: 我的有一个方法和一个方法。使用后者,您可以将组件交换到检测测试中的测试组件。活动内容如下: 如您所见,本练习使用。在片段的中注入组件: 然后在测试中,我将与交换: