标签: dagger

Dagger2 Maven Eclipse 集成

我尝试将一个更大的 Maven 项目从 guice 迁移到 dagger2。注释处理是使用 m2e-apt 插件集成的。如果可以提供所有注入的依赖项,则代码生成工作正常。

如果无法提供依赖项,我只会在 eclipse 中的组件接口上遇到一般编译问题。如果我在终端上使用 maven 进行编译,则会收到指向该类的详细错误,但无法提供该错误。

有没有什么技巧可以在eclipse中显示注释处理器的这个错误?如果没有这样的错误,我就没有机会找到无法提供的类。

eclipse maven annotation-processing dagger dagger-2

5
推荐指数
0
解决办法
164
查看次数

java.lang.NoClassDefFoundError:解析失败:Lretrofit2/GsonConverterFactory;

我在自定义库中包含了改造,我在 com.mmt.commoncore.rssupport.modules.AppModule.provideRetrofit(AppModule.java:97) at com.mmt.commoncore.rssupport.modules.AppModule_ProvideRetrofitFactory.get(AppModule_ProvideRetrofitFactory.get(AppModule_ProvideRetrofitFactory. java:27) 在 com.mmt.commoncore.rssupport.modules.AppModule_ProvideRetrofitFactory.get(AppModule_ProvideRetrofitFactory.java:10) 在 dagger.internal.ScopedProvider.get(ScopedProvider.java:46) 在 com.mmt.commoncore.rssupport.modules .AppModule_ProvideYipstayApiInterfaceFactory。get(AppModule_ProvideYipstayApiInterfaceFactory.java:23) at com.mmt.commoncore.rssupport.modules.AppModule_ProvideYipstayApiInterfaceFactory.get(AppModule_ProvideYipstayApiInterfaceFactory.java:9) at dagger.internal.ScopedProvider.common.get(6mmtProvider.common) .notificationModule.gcm.GCMRegistrationService_MembersInjector.injectMembers(GCMRegistrationService_MembersInjector.java:27) 在 com.mmt.commoncore.notificationModule.gcm.GCMRegistrationService_MembersInjector.injectMembers(GCMRegistrationService_MembersInjector.java:27)9) 在 com.mmt.commoncore.rssupport.components.DaggerRsComponent.inject(DaggerRsComponent.java:76) 在 com.mmt.commoncore.notificationModule.gcm.GCMRegistrationService.onHandleIntent(GCMRegistrationService.java:46) 在 android.app.IntentService $ServiceHandler.handleMessage(IntentService.java:65) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android。os.HandlerThread.run(HandlerThread.java:61) 引起:java.lang.ClassNotFoundException:在路径上没有找到类“retrofit2.GsonConverterFactory”:DexPathList[[dex file”/data/data/com.mmt.rightstay_host /files/instant-run/dex/slice-uk.co.chrisjenx-calligraphy-2.1.0_3d857cf3e39e24fe75c5e1fc0649101f8c786b4b-classes.dex”,dex文件“/data/data/com.mmt/fileruns/dexinstay/com.host/fileruns/dexinstay slice-support-annotations-23.2.0_368c85ce5b387877b354d725ac6f688f6bf6140f-classes.dex", dex 文件 "/data/data/com.mmt.rightstay_host/files/instant-run/dex/slice-stetho.dex25091bc5070595c5095c5095c5095c5095c5095c507050915c505c507050915c50705c85c50705075c85c502015070507018200f-classes.dex", dex 文件"/data/data/com.mmt.rightstay_host ", dex 文件 "/data/data/com.mmt.rightstay_host/files/instant-run/dex/slice-stetho-1.3.1_f60927bf861572c3ecd9ae19dfc0eb4820e4ba72-classes.dex", dex 文件"/data/data/com.mmt.rightstay_host/files/instant-run/dex/slice-sqlite-annotations-1.8.0_1580dex70d300_1580dex702d3fc080200000000000000c数据/com.mmt.rightstay_host/files/instant-run/dex/slice-sqlite-1.8.0_bbbd74ff221b96cc900c974ea9131a52d563d2f2-classes.dex", dex文件"/data/data/com.mmt.rightstay_run /slice-slice_9-classes.dex", dex 文件 "/data/data/com.mmt.rightstay_host/files/instant-run/dex/slice-slice_8-classes.dex", dex 文件 "/data/data/com .mmt.rightstay_host/files/instant-run/dex/slice-slice_7-classes.dex”,dex 文件“/data/data/com.mmt.rightstay_host/files/instant-run/dex/slice-slice_6-classes。 dex", dex 文件 "/data/data/com.mmt.rightstay_host/files/instant-run/dex/slice-slice_5-classes.dex", dex 文件 "/data/data/com.mmt.rightstay_host/files/instant-run/dex/slice-slice_4-classes.dex", dex 文件“/data/data/com.mmt.rightstay_host/files/instant-run/dex/slice-slice_3-classes.dex”,dex 文件“/data/data/com.mmt.rightstay_host/files/instant-run /dex/slice-slice_2-classes.dex”,dex文件“/data/data/com.mmt.rightstay_host/files/instant-run/dex/slice-slice_1-classes.dex”,dex文件“/data/data /com.mmt.rightstay_host/files/instant-run/dex/slice-slice_0-classes.dex", dex 文件 "/data/data/com.mmt.rightstay_host/files/instant-run/dex/slice-rxjava- 1.1.1_ce6be595c06b6845e7802dcf578b87593d3c6f26-classes.dex”,dex文件“/data/data/com.mmt.rightstay_host/files/instant-run/dex/slice-retrofit-2.0.0_8ef69f394c73c1478d01ea2227c2299c0aa5302f-classes.dex", dex 文件 "/data/data/com.mmt.rightstay_host/files/instant-run/dex/slice-replaying-share-1.0.0381816e7ae-replaying-share-1.0.0_81816dexe-aaa5302f-classes.dex", dex 文件"

android dagger retrofit

5
推荐指数
0
解决办法
2192
查看次数

Dagger 2 Android 应用程序组件缺少注入方法

我尝试了一个带有 dagger.android 包的新发布的 Dagger 2.10 的小型 Android 项目。只有这个MainApplication类应该被 Dagger 注入,其他任何东西都没有任何依赖:

构建.gradle

dependencies {
  ...
  // Dagger
  compile 'com.google.dagger:dagger:2.10'
  compile 'com.google.dagger:dagger-android:2.10'
  annotationProcessor 'com.google.dagger:dagger-compiler:2.10'

  // Fix for incompatible library versions when adding dagger-android and having espresso-core:2.2.2 in tests
  androidTestCompile 'com.google.code.findbugs:jsr305:3.0.1'
}
Run Code Online (Sandbox Code Playgroud)

主应用程序

public class MainApplication extends Application implements HasDispatchingActivityInjector {

  @Inject DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;

  @Override
  public void onCreate() {
      super.onCreate();
      DaggerMainApplicationComponent.create();
   // DaggerMainApplicationComponent.create().inject(this); does not work - no inject(...) method!
  }

  @Override
  public DispatchingAndroidInjector<Activity> activityInjector() {
      return dispatchingAndroidInjector;
  }
}
Run Code Online (Sandbox Code Playgroud)

主应用组件.java …

android dagger dagger-2

5
推荐指数
1
解决办法
1900
查看次数

跨 Gradle 模块使用 Dagger 多重绑定

其他Dagger用户……我是在尝试做一些不可能的事情吗?下面是我的应用程序的degraph生成的 Gradle 模块视图。

模块化-android-app

想象一下我的应用程序有一个导航抽屉。我希望基于通过多重绑定填充的集合添加抽屉中的列表项。这种多重绑定的贡献者跨越 > 1 个 Gradle 模块。例如,从user模块中添加了一个名为“帐户”的列表项,从模块中添加了一个名为“条款和条件”的第二项,legal并从searchGradle 模块中添加了一个“搜索”导航条目。这些模块可以被认为是独立的应用程序,捆绑在一起形成完整的应用程序体验。它们可以自己运行。

关于此的 Dagger 文档看起来像是 Guice 的复制粘贴,但有一个很大的复杂性。它指出;

“Dagger 允许您将多个对象绑定到一个集合中,即使这些对象使用多重绑定绑定在不同的模块中。”

...但这意味着 Dagger @Modules,对吗?是否可以跨 Gradle 模块填充多重绑定?我已经尝试过类似的东西,但这不是我所期望的(并非所有的贡献都被收集了);

父应用

@Module
abstract class PluginModule {
  @Multibinds @NavigationContribution abstract Set<NavigationEntry> navigables();
}
Run Code Online (Sandbox Code Playgroud)

legal 包含 Dagger @Module 的 Gradle 模块

@Module
class LegalModule {
  @Provides
  @NavigationContribution 
  @IntoSet
  static NavigationEntry provideLegalNavigation() {
    return ...;
  }
}
Run Code Online (Sandbox Code Playgroud)

user 包含 Dagger @Module 的 Gradle 模块

@Module
class AccountModule {
  @Provides
  @NavigationContribution 
  @IntoSet …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection guice gradle dagger

5
推荐指数
1
解决办法
772
查看次数

Kotlin + Dagger 注入问题取决于设备的 Android 版本/SDK (?)

上周,在我当前的 Kotlin MVP 项目中实施 Dagger 时,由于主要手机的维护,我在带有KitKat 4.4.2 的旧手机上测试它(是的,它仍然支持所有主要的材料功能和东西 :))。所以那一周我遇到了典型的问题,而不是一些不寻常的问题,并通过调查提供的错误或多或少地修复了它们。最后,代码已编译,当前项目版本的构建没有问题,并且在 KitKat 与 UI 交互时没有重大错误。

但是当我从维修中心拿起带有Nougat 7.1.2 的主手机并在其上启动应用程序时,我遇到了与 DI 相关的奇怪问题。在那之后,我还在 mate 的Marshmallow 6.0上启动了应用程序,然后又抓到了一个,一模一样。问题简要描述如下:

  • 应用程序(成功)启动;

  • 我能够操作通过上下文和片段管理器注入提供的 ViewPager/DrawerLayout/etc ui 功能;

  • 所有服务也都可用并按预期通过注入运行;

  • 当我抽动 Activity 的演示者时,应用程序崩溃。

现在最有趣的部分让我发疯:所有不会带来任何问题的可访问类都是通过构造函数注入注入的。

但是,演示实例,这是使用注射字段注入,是没有初始化需要的时候。

当然,我尝试不使用 lateinit 修饰符,而是像使用 @JvmField 或不使用它的可空字段一样注入它:结果是相同的 - 它根本没有注入。

由于问题与 相关Activity,我有“自然约束”不使用主构造函数进行注入。

这是一个例外,除了第一个字符串外,它对我来说信息量不大:

kotlin.UninitializedPropertyAccessException: lateinit property presenter has not been initialized
    at .ui.common.view.BaseViewActivity.getPresenter(BaseViewActivity.kt:14)
    at .ui.main.view.MainActivity.onPlaceTypeClick(MainActivity.kt:143)
    at .ui.types.nearby.view.NearbyPlaceTypeItemViewHolder$bind$1.onClick(NearbyPlaceTypeItemViewHolder.kt:32)
    at android.view.View.performClick(View.java:5647)
    at android.view.View$PerformClick.run(View.java:22462)
    at android.os.Handler.handleCallback(Handler.java:754)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:163)
    at android.app.ActivityThread.main(ActivityThread.java:6205)
    at java.lang.reflect.Method.invoke(Native Method) …
Run Code Online (Sandbox Code Playgroud)

android kotlin dagger dagger-2 kapt

5
推荐指数
0
解决办法
522
查看次数

通过组件依赖公开多重绑定

我目前正在开发一个多模块应用程序。基本上有4个模块:

  • 带有 UI 的应用模块
  • 带有模型/接口的合同模块
  • 具有实际业务逻辑的实现模块
  • 依赖注入模块,它允许为应用程序提供实现

这意味着应用程序不直接依赖于 implementations 模块。

我基本上有以下设置:

应用程序组件

@Component(
        dependencies = {
                BaseComponent.class
        },
        modules = {
                AndroidInjectionModule.class,
                AndroidSupportInjectionModule.class,
                ContributesAndroidInjectorModule.class
        }
)
@ApplicationScope
public interface ApplicationComponent extends AndroidInjector<MyApplication> {
    @Component.Builder
    interface Builder {

        Builder baseComponent(BaseComponent baseComponent);

        ApplicationComponent build();
    }
}
Run Code Online (Sandbox Code Playgroud)

基础组件

@Component(
        modules = {
                ...
        }
)
@Singleton
public interface BaseComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder context(@ApplicationContext Context context);

        @BindsInstance
        Builder configuration(AppConfiguration configuration);

        BaseComponent build();
    }

    ExposedDependency exposedDependency();
}
Run Code Online (Sandbox Code Playgroud)

除了使用安装在 BaseComponent 中的 @ContributesAndroidInjector …

android dagger dagger-2

5
推荐指数
1
解决办法
202
查看次数

错误:[Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] Dagger

我想用一个主要活动和多个片段制作一个简单的项目。在这里,我在一个活动中有两个片段,我想将演示者注入登录片段,但它不起作用。我的错误在哪里?

主应用程序

public class MainApplication extends DaggerApplication{


private static ApplicationComponent component;
@Override
public void onCreate() {
    super.onCreate();
    Utils.init(this);
}
public static ApplicationComponent getComponent() {
    return component;
}


protected AndroidInjector<? extends DaggerApplication> applicationInjector() 
{
    component = 
    DaggerApplicationComponent.builder().application(this).build();
    component.inject(this);
    return component;
  }


}
Run Code Online (Sandbox Code Playgroud)

主活动.java

public class MainActivity extends DaggerAppCompatActivity  {



private Fragment[] mFragments = new Fragment[2];
private int curIndex;

@Inject
HomeFragment homeFragment;

@Inject
LoginFragment loginFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState != null) {
        curIndex = savedInstanceState.getInt("curIndex");
    } …
Run Code Online (Sandbox Code Playgroud)

java android dagger dagger-2 android-mvp

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

dagger-1.2.2.jar 和 dagger-2.22.jar 模块中的重复类

将所有库升级到 androidx 和最新版本的 Firebase 库后

我在使用 2 个不同版本的 dagger java 文件时出错,错误消息中的链接不起作用。问题发生在步骤:app:checkDebugDuplicateClasses

我不直接在我的代码中使用匕首,使用

./gradlew app:dependencies
Run Code Online (Sandbox Code Playgroud)

我找到了什么com.google.android.gms:play-services-cast-framework:17.1.0用途com.google.dagger:dagger:2.22,但没有关于1.2.2.

Cause 1: java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.RuntimeException: Duplicate class dagger.Lazy found in modules dagger-1.2.2.jar (dagger-1.2.2.jar) and dagger-2.22.jar (com.google.dagger:dagger:2.22)
Duplicate class dagger.MembersInjector found in modules dagger-1.2.2.jar (dagger-1.2.2.jar) and dagger-2.22.jar (com.google.dagger:dagger:2.22)
Duplicate class dagger.Module found in modules dagger-1.2.2.jar (dagger-1.2.2.jar) and dagger-2.22.jar (com.google.dagger:dagger:2.22)
Duplicate class dagger.Provides found in modules dagger-1.2.2.jar (dagger-1.2.2.jar) and dagger-2.22.jar (com.google.dagger:dagger:2.22)
Duplicate class javax.inject.Inject found in modules javax.inject-1.jar (javax.inject-1.jar) …
Run Code Online (Sandbox Code Playgroud)

android gradle dagger

5
推荐指数
1
解决办法
1440
查看次数

注入带有活动参考的片段

DashboardActivity在 viewpager 中有一个包含两个片段 A 和 B的类。每个 Fragment 分别有自己的ViewModelAViewModelBViewModel

现在我正在创建一个Subcomponentfor DashboardActivity,它绑定了两个视图模型实例并通过 将它们注入到片段中ContributesAndroidFragment

我如何为每个 Fragment 创建一个子组件,以便NavigationController仍然可以满足需要活动(在这种情况下)的依赖项?即如何通过提供片段所附加的活动来创建此子组件?

考虑到这些片段可以添加到应用程序的其他地方,因此附加活动在运行时可能会有所不同。

这是我如何做到的:

应用组件:

@Singleton
@Component(
        modules = [
            ApplicationModule::class,
            AndroidSupportInjectionModule::class,
            NetModule::class,
            ...
            ActivityBindings::class
        ]
)
interface ApplicationComponent : AndroidInjector<MyApp> {

    @Component.Factory
    interface Factory {
        fun create(@BindsInstance application: Application): ApplicationComponent
    }
}
Run Code Online (Sandbox Code Playgroud)

活动绑定:

@Module
abstract class ActivityBindings {
    @ContributesAndroidInjector(modules = [DashboardModule::class])
    @PerActivity
    abstract fun dashboardModule(): DashboardActivity
    ...
}
Run Code Online (Sandbox Code Playgroud)

仪表板模块:

@Module(includes = [CommonActivityModule::class]) …
Run Code Online (Sandbox Code Playgroud)

android dagger dagger-2

5
推荐指数
0
解决办法
236
查看次数

带有 Hilt 的 Dagger 从模块在适配器中注入 ActivityContext

我正在使用匕首和刀柄,我想将 @ActivityContext 从模块注入到适配器,但出现此错误 -

ANTLR Tool version 4.5.3 used for code generation does not match the current runtime version 4.7.1ANTLR Runtime version 4.5.3 used for parser compilation does not match the current runtime version 4.7.1ANTLR Tool version 4.5.3 used for code generation does not match the current runtime version 4.7.1ANTLR Runtime version 4.5.3 used for parser compilation does not match the current runtime version 4.7.1/mnt/My Projects/app/build/generated/source/kapt/debug/app/myapp/MyApp_HiltComponents.java:156: error: [Dagger/MissingBinding] @dagger.hilt.android.qualifiers.ActivityContext android.content.Context cannot be provided without an @Provides-annotated method.
  public abstract static …
Run Code Online (Sandbox Code Playgroud)

android kotlin dagger dagger-hilt

5
推荐指数
1
解决办法
3121
查看次数