我正在我的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
中使用任何东西。
请不要只使用组件。为所有内容注入(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编译正常,我可以访问并构建它。但是是不可访问的(检查类将其显示为私有),我需要实际注入依赖项的方法也是如此。结果我得到错误: 我该如何解决这个问题?