Articles of dagger 2

Dagger 2注入构造函数

我开始在我正在开发的应用程序中使用Dagger 2,但我对Dagger 2的工作方式有一些疑问。 我得到了@Provides方法和@Inject注释背后的所有逻辑来初始化你的依赖关系,但@Inject注释到类构造函数有点像我的想法。 例如: 我的应用程序,我有一个模块定义,ContextModule,以检索我的应用程序的上下文: ContextModule.java @Module public class ContextModule { private final Context context; public ContextModule(Context context) { this.context = context; } @Provides public Context context() { return this.context; } } 我的BaseActivityComponent使用此模块: BaseActivityComponent.java @BaseActivityScope @Component(modules = ContextModule.class) public interface BaseActivityComponent { void injectBaseActivity(BaseActivity baseActivity); } 到目前为止很好..然后我有一个AuthController类,这取决于上下文,我想在我的BaseActivity中注入它。 所以在我的AuthControllers.class中我有类似的东西: public class AuthController { private Context […]

匕首的范围2

我可能错过了一些东西,但我认为像@Singleton这样的Scopes用来定义“范围生命周期”。 我在Android应用程序中使用Dagger 2(但我不认为这个问题与Android有关)。 我有1个模块: @Module public class MailModule { @Singleton @Provides public AccountManager providesAccountManager() { return new AccountManager(); } @Singleton @Provides public MailProvider providesMailProvider(AccountManager accountManager) { return new MailProvider(accountManager); } } 我有两个不同的组件@Singleton范围: @Singleton @Component(modules = MailModule.class) public interface LoginComponent { public LoginPresenter presenter(); } @Singleton @Component( modules = MailModule.class ) public interface MenuComponent { MenuPresenter […]

Dagger 2注入Android Context

我正在使用Dagger 2并使其工作,但我现在需要访问Android应用程序上下文。 我不清楚如何注入和访问上下文。 我试过这样做如下: @Module public class MainActivityModule { private final Context context; MainActivityModule(Context context) { this.context = context; } @Provides @Singleton Context provideContext() { return context; } 但是,这会导致以下exception: java.lang.RuntimeException:无法创建应用程序:java.lang.IllegalStateException:必须设置mainActivityModule 如果我检查Dagger生成的代码,则会在此处引发此exception: public Graph build() { if (mainActivityModule == null) { throw new IllegalStateException(“mainActivityModule must be set”); } return new DaggerGraph(this); } 我不确定这是否是注入Context的正确方法 – 任何帮助将不胜感激。

Dagger 2:@ Component.Builder缺少所需模块或组件的setter:`

我正在配置新的Dagger Android模块但我收到此错误这是我的组件: @AppScope @Component(modules = {AppModule.class, NetModule.class}) public interface AppComponent { @Component.Builder interface Builder { @BindsInstance Builder application(ExampleApplication application); @BindsInstance Builder appModule(AppModule appModule); @BindsInstance Builder netModule(NetModule netModule); AppComponent build(); } void inject(ExampleApplication __); … 我在我的应用程序中构建了这样的内容 appComponent = DaggerAppComponent .builder() .application(this) .appModule(new AppModule(this)) .netModule(new NetModule()) .build() .inject(this); 但我仍然收到错误 错误:(20,3)错误:@ Component.Builder缺少所需模块或组件的setter:[app.example.com.dagger.AppModule] 根据应该是正确的文件,我错过了什么? 例如,这可能是一个带有Builder的有效组件: @Component(modules = {BackendModule.class, FrontendModule.class}) […]

使用Dagger 2进行方法注射

我没有设法使用Dagger 2find关于方法注入的好解释/示例。有人可以帮我理解吗? 例: @Inject public Dinner makeDinner(Pasta pasta, Sauce sauce) { mPan.add(pasta); mPan.add(sauce); return mPan.cookDinner(); } 因此,如果我用@Inject注释我的方法,我是否正确假设方法签名中的参数将从对象图中注入定义的对象? 我如何在我的代码中使用此方法呢? 当我进行方法调用时,它仍然期望我提供所有参数,这会破坏目的。 更新: 因此,根据我的理解,如果我调用DinnerComponent.dinner() ,则可以使用Dinner对象,假设我的DinnerComponent设置如下: @Component(modules = DinnerModule.class) public interface DinnerComponent { Dinner dinner(); } 我的DinnerModule设置如下: @Module public class DinnerModule { public DinnerModule() {} @Provides Pasta providePasta() { return new Pasta(); } @Provides Sauce provideSauce() { return new […]

未解决的参考DaggerApplicationComponent

我正在尝试创建我的应用程序组件,但Dagger不会生成我的应用程序组件。 这是MyApplication类 class MyApplication : Application() { companion object { @JvmStatic lateinit var graph: ApplicationComponent } @Inject lateinit var locationManager : LocationManager override fun onCreate() { super.onCreate() graph = DaggerApplicationComponent.builder().appModule(AppModule(this)).build() graph.inject(this) } } 这是我的AppComponent类 @Singleton @Component(modules = arrayOf(AppModule::class)) interface ApplicationComponent { fun inject(application: MyApplication) } 这是截图 这是我在github上的 项目 这是错误日志 Error:(7, 48) Unresolved reference: DaggerApplicationComponent Error:(28, […]

在Android 7.0和Samsung设备上使用Dagger 2运行RuntimeException

在我的Google Play控制台上,自从我开始使用Dagger 2以来,我看到了很多崩溃报告,但仅限于Android 7.0,主要是三星设备,一些Huawai和Motorola设备以及一些罕见的Xperia设备: java.lang.RuntimeException: at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2984) at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3045) at android.app.ActivityThread.-wrap14 (ActivityThread.java) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1642) at android.os.Handler.dispatchMessage (Handler.java:102) at android.os.Looper.loop (Looper.java:154) at android.app.ActivityThread.main (ActivityThread.java:6776) at java.lang.reflect.Method.invoke (Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1518) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1408) Caused by: java.lang.RuntimeException: at dagger.android.AndroidInjection.inject (AndroidInjection.java:48) at dagger.android.support.DaggerAppCompatActivity.onCreate (DaggerAppCompatActivity.java:43) at com.package.MainActivity.onCreate (MainActivity.java:83) at android.app.Activity.performCreate (Activity.java:6956) at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1126) at android.app.ActivityThread.performLaunchActivity […]

使用Retrofit 2.0和Dagger 2设置动态基本URL

我正在尝试使用Dagger 2使用Retrofit 2.0执行登录操作 这是我如何设置Retrofit依赖 @Provides @Singleton Retrofit provideRetrofit(Gson gson, OkHttpClient client) { Retrofit retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create(gson) .client(client) .baseUrl(application.getUrl()) .build(); return retrofit; } 这是API接口。 interface LoginAPI { @GET(relative_path) Call logMe(); } 我有三个不同的基本url用户可以登录。 因此,在设置Retrofit依赖项时,我无法设置静态URL。 我在Application类上创建了一个setUrl()和getUrl()方法。 用户登录后,我在调用API调用之前将url设置为Application。 我像这样使用懒惰注射进行改造 Lazy retrofit 这样,只有当我可以打电话时,Dagger才会注入依赖关系 retrofit.get() 这部分效果很好。 我把url设置为改进依赖。 但是,当用户键入错误的基本URL(例如,mywifi.domain.com)时,会出现问题,理解它是错误的并更改它(比如mydata.domain.com)。 由于Dagger已经为改造创建了依赖关系,因此不会再做了。 所以我必须重新打开应用程序并输入正确的URL。 我阅读了不同post,使用Dagger在Retrofit上设置动态url。 在我的案例中,没有什么比这更好的了。 我想念什么吗?

Dagger 2范围和子组件

我正在努力使我的应用程序更好,代码更易于使用Dagger2我抓住了一般的想法,但仍然无法弄清楚范围是如何管理Dagger2我把dagger注入我的项目(听起来很有趣)。 我创建了ApplicationComonent组件,它在我的项目中完美运行。 这是我的代码。 @Singleton @Component(modules = { ApplicationModule.class, ThreadingModule.class, NetworkModule.class, DatabaseModule.class, ServiceModule.class, ParseModule.class, PreferencesSessionModule.class}) public interface ApplicationComponent { ActivityComponent activityComponent(ActivityModule activityModule); void inject(BaseActivity baseActivity); void inject(MainAppActivity mainAppActivity); void inject(MyApplication application); void inject(BaseFragment baseFragment); void inject(MyService service); void inject(RegistrationIntentService service); } 我在MyApplication类中创建我的组件实例 private void initializeAndInjectComponent() { mApplicationComponent = DaggerApplicationComponent .builder() .threadingModule(new ThreadingModule(1)) .applicationModule(new ApplicationModule(this)) .networkModule(new NetworkModule( […]

Dagger 2组件,模块和范围的生命周期

我已经阅读了很多关于匕首2的post和教程: http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/ https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2 http://fernandocejas.com/2015/04/11/tasting-dagger-2-on-android/ https://github.com/konmik/konmik.github.io/wiki/Snorkeling-with-Dagger-2 什么决定了Dagger 2中组件(对象图)的生命周期? 等等 但我仍然对组件的生命周期以及它与模块和范围的关系感到困惑。 我想确保在我只需要Singleton时不创建对象的多个实例。 希望有人可以对这些有所了解: 在应用程序类中构建的组件的生命周期是什么? 在Activity或Fragment类中构建的组件的生命周期是什么? 如果我想从组件中获取单例实例,是否必须使用@Singleton或自定义范围注释组件并在应用程序类中构建该组件? 如果我在应用程序类中构建一个组件,这是否意味着通过此组件可用的所有对象实例将是整个应用程序中的单例实例,直到该应用程序被终止或重新启动? 我有一个带有自定义范围的组件,比如@ActivityScope,我在Activity中构建该组件,在调用onDestroy()之后,通过该组件注入的对象实例会自动销毁吗? 同样,我有一个带有自定义范围的组件,比如@ActivityScope,我在ActivityA和ActivityB中构建这个组件,ActivityA和ActivityB是否会从这个组件共享相同的对象实例,或者它们将拥有自己的同一对象实例?