当前位置: 首页 > 知识库问答 >
问题:

匕首2每个碎片(或活动等)的自定义范围

尹冠宇
2023-03-14

我看了几篇不同的文章,这些文章似乎建议在Dagger 2中使用两种不同的方法进行自定义范围界定:

>

  • 在配置更改第2部分(Github repo)中幸存的MVP演示者:

    • 为每个片段使用唯一的自定义作用域,例如分别为Hello1Frament@Hello2ScopeHello2Frament

    在Android上品尝匕首2:

    • 对所有片段使用单个自定义范围,例如@PerFragment

    据我所知,似乎在方法2中,定义一个可用于所有片段的单一作用域是可以的(即,@PerFragment)。事实上(如果我错了,请纠正我),似乎自定义范围的名称无关紧要,只有在创建子组件的地方(即在应用程序、活动或片段中)才重要。

    是否存在为每个片段定义唯一作用域的用例,如案例1?


  • 共有2个答案

    刘成礼
    2023-03-14

    你的理解是正确的。命名的作用域允许您传达意图,但它们都以相同的方式工作。

    • 对于作用域提供程序方法,每个组件实例将创建所提供对象的1个实例
    • 对于非作用域提供程序方法,每个组件实例将在需要注入时创建所提供对象的新实例

    不过,组件实例的生存期很重要。同一组件的两个不同实例将提供不同的对象实例,甚至是范围不同的实例。

    作用域名称应该指示所提供对象的生存期(与组件实例的生存期相匹配),因此@PerFragment对我来说更有意义。

    快速查看“MVP演示者…”在本教程中,我不清楚作者使用单独作用域的确切意图。既然这些名字都是一次性的,我就不会读太多了。

    衡安晏
    2023-03-14

    在阅读了@vaughandroid的答案后,是什么决定了Dagger 2中组件(对象图)的生命周期?我想我对自定义范围的理解足以回答我自己的问题。

    首先,在dagger2中处理组件、模块和范围标注时,这里有一些规则。

    • 组件必须具有(单个)范围注释(例如@Singleton@CustomScope
    • 模块没有范围批注
    • 模块方法可能具有与其组件匹配的(单个)作用域,也可能没有作用域,其中:
      • 作用域:表示为组件的每个实例创建一个实例
      • Unscoped:表示使用每个inject()或provider调用创建一个新实例
      • 注意:Dagger2仅为根组件(及其模块)保留@Singleton。子组件必须使用自定义范围,但该范围的功能与@Singleton完全相同

      现在,要回答这个问题:我会说为每个概念上不同的范围创建一个新的命名范围。例如,创建一个@PerActive@PerFrament@PerView注释,指示组件应该在哪里实例化,从而指示其生存期。

      注:这是两个极端之间的折衷。考虑根元素和需要的N个子组件的情况:

      • 至少2个注释(@Singleton@SubSingleton)和
      • 最多n个注释(@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 提供了 我的使用了: 提供了: 我的有一个方法和一个方法。使用后者,您可以将组件交换到检测测试中的测试组件。活动内容如下: 如您所见,本练习使用。在片段的中注入组件: 然后在测试中,我将与交换: