当前位置: 首页 > 面试题库 >

Dagger 2-注入非Android类

云俊名
2023-03-14
问题内容

我是在暗示Dagger 2我的Android应用程序。我通过以下方式进行设置:

AppComponent.java

@Singleton
@Component(modules = {
  AndroidInjectionModule.class,
  AndroidSupportInjectionModule.class,
  ActivityBuilder.class,
  AppModule.class,
  DataBaseDaoModule.class
})

public interface AppComponent {
  @Component.Builder
  interface Builder {
    @BindsInstance
    Builder application(Application aApplication);

    AppComponent build();
  }

  Application application();
  void inject(MyApplication aApplication);
}

AppInjector.java

ublic class AppInjector {

  public static void init(MyApplication aApplication) {

    //Initialize dagger and inject the aApplication
    DaggerAppComponent.builder().application(aApplication).build().inject(aApplication);

    aApplication.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
      @Override
      public void onActivityCreated(Activity aActivity, Bundle aBundle) {
        handleActivity(aActivity);
      }

      @Override
      public void onActivityStarted(Activity aActivity) {
      }

      @Override
      public void onActivityResumed(Activity aActivity) {
      }

      @Override
      public void onActivityPaused(Activity aActivity) {
      }

      @Override
      public void onActivityStopped(Activity aActivity) {
      }

      @Override
      public void onActivitySaveInstanceState(Activity aActivity, Bundle aBundle) {
      }

      @Override
      public void onActivityDestroyed(Activity aActivity) {
      }
    });
  }

  private static void handleActivity(Activity aActivity) {
    if (aActivity instanceof HasActivityInjector) {
      AndroidInjection.inject(aActivity);
      Timber.d("injected Activity");
    }
    if (aActivity instanceof FragmentActivity) {
      ((FragmentActivity) aActivity).getSupportFragmentManager()
        .registerFragmentLifecycleCallbacks(
          new FragmentManager.FragmentLifecycleCallbacks() {
            @Override
            public void onFragmentCreated(FragmentManager fm, Fragment f,
                                          Bundle savedInstanceState) {
              if (f instanceof Injectable) {
                Timber.d("injected Fragment");
                AndroidSupportInjection.inject(f);
              }
            }
          }, true);
    }
  }
}

AppModule.java

Module(includes = ViewModelModule.class)
class AppModule {

  @Singleton
  @Provides
  ApiService providesApiService(OkHttpClient aClient, MyInterceptor aInterceptor) {

    //Build a Retrofit object here
  }

  @Singleton
  @Provides
  OkHttpClient providesOkHTTPClient(MyInterceptor aInterceptor) {
   //Setup OKHTTP here
  }
}

最后在 MyApplication.Java 中,onCreate我只是这样调用该方法AppInjector
AppInjector.init(this);

所有这些工作以及我放入AppComponent模块中的所有内容都可以注入Activities, Fragments and ViewModels

但是,在某些情况下,我需要一个utility依赖于Applicationfor
的类,contex并且在各种地方都使用实用程序类。或者,我将有一个Manager依赖于Application
的类,或者需要AppModule中的一些东西。但是,由于我在外部使用了这些类,所以我Activities, Fragments and ViewModels不能仅仅注入。如何为utility类提供依赖项以及其他任何类型的类(例如管理器类)?

我的第一个想法是创建a UtilityComponent和a
ManagerCompoent,但是我不知道如何让它们与in中AppModuel或通过in中的任何东西一起工作AppComponent


问题答案:

请不要仅仅component.inject(myObject)用于所有事情。始终喜欢使用构造函数注入或从模块中提供构造函数注入,您可以在其中执行其他设置步骤。.inject(myObject)适用于您无权访问构造函数的Framework组件。

我最初的想法是创建各种UtilityComponent和ManagerCompoent,但是我不知道如何让它们与AppModuel或AppComponent中的任何东西一起使用。

您不需要为此单独的组件。见下文。

但是,由于我在Activity,Fragments和ViewModels之外使用这些类,所以我不能只注入它们。

这与注射无关。您在谈论范围,听起来您的实用程序是@Singleton。您AppComponent是有@Singleton作用域的组件,因此它也可以用于提供您的工具。

不过,我在那里我会需要一个实用工具类的情况下,依赖于Application,对于context

如果它们是@Singleton可以访问您的应用程序的组件的一部分,则也可以在其他任何地方提供它们。无需更多组件或任何其他东西。只需声明您的依赖项,不要想太多。

只需声明您的util,用批注并用@Singleton标记构造函数,即可@Inject进行构造函数注入。@Singleton确保您将提供它,AppComponent并且可以访问Application它所依赖的对象

@Singleton public class MyUtil {

  private Application application;

  @Inject public MyUtil(Application application) {
    this.application = application;
  }

}

然后,您可以将其注入到Activity,Fragments甚至其他工具中。

@Singleton public class MyUtilWrapper {

  private MyUtil myUtil;

  @Inject public MyUtilWrapper(MyUtil myUtil) {
    this.myUtil = myUtil;
  }

}

您可以将其中之一或两者都注入您的活动或片段中…

@Inject MyUtil myUtil;
@Inject MyUtilWrapper myUtilWrapper;

void onCreate(..) {
  AndroidInjection.inject(this);
}

不会 需要任何模块,提供了一些方法,或组件,以提供简单的类。只要确保添加正确的范围即可!



 类似资料:
  • 本文向大家介绍Dagger2 Android依赖注入学习笔记,包括了Dagger2 Android依赖注入学习笔记的使用技巧和注意事项,需要的朋友参考一下 前言 最近在用 MVP + RxJava + Retrofit 写项目,觉得相对于其他的开发框架,这的确是给我们带来了很多方便,但是在网上搜寻相关资料的时候,总是能看到 MVP + RxJava + Retrofit + Dagger 这样的搭

  • 我刚开始使用Dagger并尝试使用dagger2进行DI,但看起来它给我的活动注入了一个空演示器。下面是我的代码。 公共类TasksActivity扩展AppCompatActivity{

  • 我正在我的Android应用程序中安装匕首2。我按以下方式进行设置: AppComponent。Java语言 应用njector.java 应用模块。Java语言 最后在我的应用程序中。Java在onCreate方法中,我只调用AppInjector,如下所示:

  • 我得到以下生成错误: 错误:[dagger.android.androidinjector.inject(T)]没有@provides-annotated方法,无法提供android.support.v4.app.fragmentManager。 公共抽象接口AppComponent扩展dagger.android.androidinjector{^android.support.v4.app.f

  • 我学习了Dagger2,并尝试使用MVVM制作应用程序。我根据方案创建了Dagger类(模块、组件、BaseApplication),但当我尝试将QuotableAPI对象注入ViewModel时,Dagger不会生成DaggerAppComponent类(在ViewModel构造函数中没有QuotableAPI生成)。 报价视图模型 应用程序模块 应用组件 基础应用 ViewModelFacto

  • 我试图将一组房间组件注入存储库,存储库本身使用Dagger2注入ViewModel(在片段中)。 代码如下。 片段: 视图模型: 我的存储库: 最后,对于我的匕首类,我有两个模块: 和我的AppComponent: Dagger编译正常,我可以访问并构建它。但是是不可访问的(检查类将其显示为私有),我需要实际注入依赖项的方法也是如此。结果我得到错误: 我该如何解决这个问题?