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

Dagger 2-注入非Android类

公良奇
2023-03-14

我正在我的Android应用程序中安装匕首2。我按以下方式进行设置:

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);
}

应用njector.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);
    }
  }
}

应用模块。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
  }
}

最后在我的应用程序中。Java在onCreate方法中,我只调用AppInjector,如下所示:AppInjector。初始(本)

所有这些工作以及我在AppComponent的模型中放入的任何东西,我都可以注入到活动、片段和视图模型中。

然而,在某些情况下,我需要一个实用程序类,这取决于应用程序,用于上下文——我在不同的地方使用实用程序类。或者我将有一个管理器类,它取决于应用程序,或者需要来自AppModule的一些东西。然而,由于我在Activity、Fragments和ViewModels之外使用这些类,所以我不能仅仅注入。我将如何提供我的实用工具类及其依赖项和任何其他类型的类(如manager类)?

我的第一个想法是创建一个UtilityComponent和一个ManagerCompoent之类的东西,但是我不知道如何让它们在AppModuel或通过我的AppComponent中使用任何东西。


共有1个答案

倪灿
2023-03-14
匿名用户

请不要只使用组件。为所有内容注入(myObject)。总是喜欢构造函数注入,或者从可以执行其他设置步骤的模块中提供构造函数注入<代码>。inject(myObject)适用于您无法访问构造函数的框架组件。

我的第一个想法是创建一个实用组件(UtilityComponent)和一个管理组件(ManagerComponent),但我不知道如何让它们在AppModuel中或通过我的AppComponent处理任何事情。

这不需要单独的组件。见下文。

但是,由于我在活动、片段和视图模型之外使用这些类,所以我不能只注入。

这与注射无关。你说的是范围,听起来你的实用程序是一个单例。您的AppComponent是一个作用域组件,因此它也可以用于提供您的util。

然而,在某些情况下,我需要一个实用类,它取决于应用程序,用于上下文

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

只需声明您的util,用单例注释它,并用注入标记构造函数@Singleton确保它将由您的AppComponent提供,并且可以访问它所依赖的应用程序。

@Singleton public class MyUtil {

  private Application application;

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

}

然后你可以把它注入到你的活动、片段,甚至是其他的实用程序中。。。。

@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应用程序。我通过以下方式进行设置: AppComponent.java AppInjector.java AppModule.java 最后在 MyApplication.Java 中,我只是这样调用该方法: 所有这些工作以及我放入AppComponent模块中的所有内容都可以注入。 但是,在某些情况下,我需要一个依赖于for 的类,并且在各种地方都使用实用

  • 我得到以下生成错误: 错误:[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编译正常,我可以访问并构建它。但是是不可访问的(检查类将其显示为私有),我需要实际注入依赖项的方法也是如此。结果我得到错误: 我该如何解决这个问题?