标签: dagger

使用Kotlin和Dagger

使用Dagger将依赖项注入类中的最佳方法是什么,尤其是使用Dagger的零工作构造函数类(如Activities)?Dagger 2可能会改善这种情况吗?

提前致谢.

dependency-injection kotlin dagger dagger-2

24
推荐指数
2
解决办法
7187
查看次数

具有相同返回类型的@Named提供程序最终会给出java.lang.IllegalArgumentException:Duplicate

这是问题,

我正在开发一个LibGDX项目,我有不同平台的不同模块.

这是我的android模块的样子:

@Module(
    includes = {BaseModule.class, NetModule.class},
    injects = {DummyProjectActivity.class, DummyProject.class},
    overrides = true)
public class DummyProjectAndroidModule {

    ...

    @Provides @Singleton @Named("DummyOne")
    DummyInterface provideDummyOne() {
        return new DummyOne();
    }

    @Provides @Singleton @Named("DummyTwo")
    DummyInterface provideDummyTwo() {
        return new DummyTwo();
    }

    @Provides @Singleton @Named("DummyConsumer")
    DummyConsumer provideDummyConsumer(@Named("DummyOne") DummyInterface dummyOne,
                                    @Named("DummyTwo") DummyInterface dummyTwo) {
        return new DummyConsumer(dummyOne, dummyTwo);
    }
}
Run Code Online (Sandbox Code Playgroud)

..在这里我的桌面模块如何:

@Module(
    includes = {BaseModule.class, NetModule.class},
    injects = {DummyProjectDesktop.class, DummyProject.class},
    overrides = true)
public class DummyProjectDesktopModule {
Run Code Online (Sandbox Code Playgroud)

好好休息几乎一样.然而,当我正在为桌面构建项目时,一切都很顺利,在Android方面,我得到了这个错误让我大吃一惊.

Process: net.alicanhasirci.mobile.DummyProject.android, PID: 4603
    java.lang.RuntimeException: …
Run Code Online (Sandbox Code Playgroud)

java android dependency-injection libgdx dagger

24
推荐指数
1
解决办法
530
查看次数

无法找到导入javax.inject.Inject包

我正在尝试将Dagger实现为IntelliJ项目中的依赖注入器,但我的代码失败了:

import javax.inject.Inject;
Run Code Online (Sandbox Code Playgroud)

Intellij正在寻找' javax'包,但不是' inject'包,所以它失败了.

我是Android的新手,所以我很抱歉,如果这是一个没脑子,但任何人都可以告诉我为什么没有找到注入包?

java importerror dagger

23
推荐指数
4
解决办法
5万
查看次数

Generic @Inject'd字段在抽象超类中

考虑一组MVP-ish类型.存在一个抽象的Presenter,带有View接口:

public interface View {
    //...
}

public abstract class AbstractPresenter<V extends View> {
    @Inject V view;
    //...
}
Run Code Online (Sandbox Code Playgroud)

然后,让我们有一个特定的具体的presenter子类,其视图接口和实现:

public interface LoginView extends View {
    //...
}
public LoginPresenter extends AbstractPresenter<LoginView> {
    //...
}

public class LoginViewImpl implements LoginView {
    //...
}
Run Code Online (Sandbox Code Playgroud)

在Dagger模块中,我们当然会定义一个@Provides方法:

@Provides
LoginView provideLoginView() {
    return new LoginViewImpl();
}
Run Code Online (Sandbox Code Playgroud)

在Guice你可以用同样的方式写这个,或者只是bind(LoginView.class).to(LoginViewImpl.class).

但是,在Dagger(来自Google的v1和2.0-SNAPSHOT)中,这会产生错误,因为它无法弄清楚V创建绑定布线时的情况AbstractPresenter<V>.另一方面,Guice指出,因为它实际上是在创建一个LoginPresenter,所以它需要一个实现LoginView.

匕首1.2.2:

foo.bar.AbstractPresenter$$InjectAdapter.java:[21,31] cannot find symbol
  symbol:   class V
  location: class foo.bar.AbstractPresenter$$InjectAdapter
Run Code Online (Sandbox Code Playgroud)

Dagger 2.0-SNAPSHOT:

Caused …
Run Code Online (Sandbox Code Playgroud)

java dependency-injection guice dagger

23
推荐指数
1
解决办法
1671
查看次数

如何使用Dagger 2注入Servlet?

我问(回答)对匕首1同样的问题在这里.我如何为Dagger 2做类似的事情,现在ObjectGraph.inject不再存在了.

这个问题可以概括为:

如果对象必须由不同的框架创建,那么如何进行成员注入?(在这种情况下,是一个Servlet容器).

java servlets dagger dagger-2

22
推荐指数
1
解决办法
1575
查看次数

Java依赖注入:Dagger 1 vs Dagger 2,哪个更好?

Dagger 2Dagger 1有什么优势?

到目前为止我发现(只)2:

  • Dagger 2允许您使用proguard进行代码混淆
  • Dagger 2更快(这对于Android应用程序使用时没有多大优势,但如果你将它用于某种服务器,这肯定是一件很重要的事情)

与此同时,我发现了一个很大的缺点:你不能@Module(overrides = true)在Dagger 2中使用模块覆盖(),这至少对我来说很烦人 - 它对于单元测试非常有用.

还有其他优点/缺点吗?

java android dependency-injection dagger dagger-2

22
推荐指数
1
解决办法
7351
查看次数

在Android上使用DI的具体好处是什么?

使用Android依赖注入框架的具体优势或优势是什么,如Dagger,TransfuseRoboGuice

例如,什么样的应用程序从使用DI中受益最多?是否有更多的性能优势,或者更多的是扩展应用程序的简易性,还是更多关于使其可测试?

问这个问题的原因之一是衡量我正在开发的应用程序是否真的会从中受益或不多.由于我打算在某些方面认真对待应用程序,可测试性和易于扩展性将是很好的,即使第一版本使用成本高(更多时间设置,学习曲线等).

谢谢!

android dependency-injection roboguice dagger transfuse

21
推荐指数
1
解决办法
7080
查看次数

使用KClass类型绑定到映射

我试图ViewModel通过它们的KClass类型将子类绑定到地图中:

@Module abstract class ViewModelModule {

    @Binds @IntoMap @ViewModelKey(MyViewModel::class)
    abstract fun bindsMyViewModel(viewModel: MyViewModel): ViewModel

    @Binds abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory

}
Run Code Online (Sandbox Code Playgroud)

但我得到Dagger编译错误:

e: ~/Example/app/build/tmp/kapt3/stubs/debug/com/example/app/injection/AppComponent.java:5: error: [dagger.android.AndroidInjector.inject(T)] java.util.Map<kotlin.reflect.KClass<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method.
e: 

e: public abstract interface AppComponent {
e:                 ^
e:       java.util.Map<kotlin.reflect.KClass<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> is injected at
e:           com.example.app.ui.ViewModelFactory.<init>(creators)
e:       com.example.app.ui.ViewModelFactory is injected at
e:           com.example.app.injection.ViewModelModule.bindViewModelFactory(p0)
e:       android.arch.lifecycle.ViewModelProvider.Factory is injected at
e:           com.example.app.ui.MyFragment.setViewModelFactory(p0)
e:       com.example.app.ui.MyFragment is injected …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection kotlin dagger dagger-2

20
推荐指数
1
解决办法
2042
查看次数

如何在自定义视图或其他Android类中使用AndroidInjection类?

我对Android特定模式的问题是,如果你使用他们的AndroidInjection类,除了使用Application Component之外,除了Activities/ Fragments/自定义视图/适配器之外,成员无法注入其他对象.这是因为你无法获得用于注入/ 的Subcomponent(AndroidInjector)的引用.这使得注入Dialogs(如果你使用).ActivitiesFragmentsDialogFragments

AndroidInjection级似乎只支持Android核心类型.

android dependency-injection dagger dagger-2

20
推荐指数
3
解决办法
3430
查看次数

应用程序在启动时由android.content.Context.getString中的NPE导致崩溃

我们有一个非常奇怪的崩溃,它指向系统类.它出现在应用程序启动时.

致命异常:java.lang.RuntimeException:无法启动活动ComponentInfo {com.myapp.android/com.myapp.android.main.BaseMainActivity}:java.lang.RuntimeException:无法创建应用程序com.myapp.android.main. MyApp的:在显示java.lang.NullPointerException android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429)在android.app.ActivityThread.access $ 800(ActivityThread.java :151)在Android.app.Loper.loop(Looper.java:193)的android.app.Handler.dispatchMessage(Handler.java:110)上的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1342)在android.app.ActivityThread.main(ActivityThread.java:5333)的java.lang.reflect.Method.invokeNative(Method.java),位于com的java.lang.reflect.Method.invoke(Method.java:515). android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:828)位于dalvik.system.NativeStart.mai的com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)n(NativeStart.java)由java.lang.RuntimeException引起:无法在android.app.LoadedApk.makeApplication(LoadedApk.java:529)上创建应用程序com.myapp.android.main.MyApp:java.lang.NullPointerException .app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429)在android.app.ActivityThread.access $ 800(ActivityThread.java:151)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1342)位于android.app.AtoT.Thread.main的android.os.Handler.dispatchMessage(Handler.java:110)android.os.Looper.loop(Looper.java:193) ActivityThread.java:5333)at java.lang.reflect.Method.invokeNative(Method.java)at java.lang.reflect.Method.invoke(Method.java:515)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller位于dalvik.system.NativeStart.main(NativeStart.java)的com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)中的.run(ZygoteInit.java:828)由java.lang.NullPointerEx引起 知识在android.content.Context.getString(Context.java:343)的com.myapp.android.api.singletons.AppTrackingInstance.initAdjust(AppTrackingInstance.java:114)com.myapp.android.api.singletons.AppTrackingInstance. (AppTrackingInstance.java:92)在com.myapp.android.injection.modules.ApplicationScopeModule.provideAppTrackingInstance(ApplicationScopeModule.java:326)在com.myapp.android.injection.modules.ApplicationScopeModule $$ ModuleAdapter $ ProvideAppTrackingInstanceProvidesAdapter.get(ApplicationScopeModule $ $ ModuleAdapter.java:1618)在com.myapp.android.injection.modules.ApplicationScopeModule $$ ModuleAdapter $ ProvideAppTrackingInstanceProvidesAdapter.get(ApplicationScopeModule $$ ModuleAdapter.java:1552)在dagger.internal.Linker $ SingletonBinding.get(Linker.java :364)com.myapp.android.main.MyApp $$ InjectAdapter.injectMembers(MyApp $$ InjectAdapter.java:70)at com.myapp.android.main.MyApp $$ InjectAdapter.injectMembers(MyApp $$ InjectAdapter.java :23)在dagger.ObjectGraph $ DaggerObjectGraph.in ject(ObjectGraph.java:281)位于com.myapp.android.main.MyApp $ 1.run(MyApp.java:57),位于android的com.myapp.android.main.MyApp.onCreate(MyApp.java:51). app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)在android.app.LoadedApk.makeApplication(LoadedApk.java:526)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)在android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2429)在Android.app.Handler.dispatchMessage(Handler)上的android.app.ActivityThread.access $ 800(ActivityThread.java:151)android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1342) .java:110)在android.os.Looper.loop(Looper.java:193)的android.app.ActivityThread.main(ActivityThread.java:5333)at java.lang.reflect.Method.invokeNative(Method.java)在java.lang.reflect.Method.invoke(Method.java:515)在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:828)在com.android.internal.os.ZygoteInit.main (ZygoteInit.java:644)在dalvik.syste m.NativeStart.main(NativeStart.java)

我们使用Dagger 1,我们的应用程序是multidex-ed.

匕首模块:

@Module(
  library = true, …
Run Code Online (Sandbox Code Playgroud)

crash android dagger android-multidex

19
推荐指数
1
解决办法
1155
查看次数