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