Android Dagger2-库使用

Android Dagger2-库使用,android,dagger-2,dagger,Android,Dagger 2,Dagger,我对新的android dagger2 v2.11有问题。 这只是我试图做的简单问题。我计划制作一个共享库,它将在不同的应用程序中大量使用,并将所有库di(dagger stuff)逻辑放在其中,这样我就可以将应用程序挂在它上面 我会尽力解释我到目前为止的情况 我有名为app的应用程序模块和名为依赖注入的android库。(lib) 应用程序内我已使用di实施了MainActivity。 在lib中我用di实现了一个活动和一个类 我试图使用@Inject将lib中的这两个元素用于应用程序中的Ma

我对新的android dagger2 v2.11有问题。 这只是我试图做的简单问题。我计划制作一个共享库,它将在不同的应用程序中大量使用,并将所有库di(dagger stuff)逻辑放在其中,这样我就可以将应用程序挂在它上面

我会尽力解释我到目前为止的情况

我有名为app的应用程序模块和名为依赖注入的android库。(lib) 应用程序内我已使用di实施了MainActivity。 在lib中我用di实现了一个活动和一个类

我试图使用@Inject将lib中的这两个元素用于应用程序中的MainActivity

我试着用几种方法来完成它。 1.实现lib中的所有di和app中的所有di,然后在MainActivity中使用@Inject。 2.在应用程序中实现AppComponent和ActivityBuilder,并从其中的库扩展BaseAppComponent和BaseAppActivityBuilder。 3.从应用程序类中分别实现di和调用库匕首设置

每次都有其他错误。我真的不确定是什么问题,所以无法更好地说明它。但我已经把我的简化项目放在了底部,这样你就可以看一看,如果你更容易解释的话,甚至可以做出贡献

过去几天我一直在试图理解为什么它不起作用,所以如果你能给我一些提示,我将不胜感激


这是我所有尝试的git repo:

在将Gradle版本降级到2.3.3之后,我能够用Android Studio 2.3.3运行你的应用程序。以下是变化:

buildToolsVersion "25.0.1" 
targetSdkVersion 23 
classpath 'com.android.tools.build:gradle:2.3.3'
另外,我用compile替换了实现


在将Gradle版本降级到2.3.3之后,我可以用Android Studio 2.3.3运行你的应用程序。以下是变化:

buildToolsVersion "25.0.1" 
targetSdkVersion 23 
classpath 'com.android.tools.build:gradle:2.3.3'
另外,我用compile替换了实现


经过多次尝试,我终于让它运行起来了。 但毕竟对新匕首还是有一些奇怪的感觉,我仍然不确定为什么有些东西不起作用,尽管它们应该起作用

在DuckModule中,我需要添加ProviderActivity(),尽管在单模块应用程序中,dagger自己处理它

@Module 
public class DuckModule {

@Provides
DuckActivity provideActivity() {
    return new DuckActivity();   <--
}

@Provides
DuckContract.View providesLibActivity( DuckActivity duckActivity ) {
    return duckActivity;
}
}

所以我的lib组件得到了useles

@Component(modules = {
    PlantActivityBuilder.class,
    SharedPrefsModule.class
})
public interface PlantComponent {

}
为了使其正常工作,我需要将lib组件中的所有模块放入app组件:

@Component(modules = {
    AndroidInjectionModule.class,
    AppModule.class,
    ActivityBuilder.class,
    SharedPrefsModule.class,  <--
    DuckModule.class  <--
 })
 public interface AppComponent {

@Component.Builder
interface Builder {
    @BindsInstance
    Builder application( Application application );

    AppComponent build();
}

void inject( App app );

}

如果您找到了其他更快更干净的方法,请与我们分享。

经过多次尝试,我终于让它运行起来了。 但毕竟对新匕首还是有一些奇怪的感觉,我仍然不确定为什么有些东西不起作用,尽管它们应该起作用

在DuckModule中,我需要添加ProviderActivity(),尽管在单模块应用程序中,dagger自己处理它

@Module 
public class DuckModule {

@Provides
DuckActivity provideActivity() {
    return new DuckActivity();   <--
}

@Provides
DuckContract.View providesLibActivity( DuckActivity duckActivity ) {
    return duckActivity;
}
}

所以我的lib组件得到了useles

@Component(modules = {
    PlantActivityBuilder.class,
    SharedPrefsModule.class
})
public interface PlantComponent {

}
为了使其正常工作,我需要将lib组件中的所有模块放入app组件:

@Component(modules = {
    AndroidInjectionModule.class,
    AppModule.class,
    ActivityBuilder.class,
    SharedPrefsModule.class,  <--
    DuckModule.class  <--
 })
 public interface AppComponent {

@Component.Builder
interface Builder {
    @BindsInstance
    Builder application( Application application );

    AppComponent build();
}

void inject( App app );

}

如果您找到其他更快更干净的方法,请与我们分享。

您好,谢谢您的回答。如果不解释它为什么起作用,你就不能接受这个答案吗?此外,我认为,无论何时需要降级smth,这都不是一个真正令人满意的解决方案。尤其是Gradle版本。我不知道原因是什么。但我建议你不要使用不稳定的构建。如果你使用-beta6 gradle插件,这可能就是问题所在。此外,大多数文档没有反映这些更改,因此您使用的功能在新版本中可能已经更改。您好,感谢您的回答。如果不解释它为什么起作用,你就不能接受这个答案吗?此外,我认为,无论何时需要降级smth,这都不是一个真正令人满意的解决方案。尤其是Gradle版本。我不知道原因是什么。但我建议你不要使用不稳定的构建。如果你使用-beta6 gradle插件,这可能就是问题所在。此外,大多数文档没有反映这些更改,因此您使用的功能在新版本中可能已经更改。您有一个模块是com.android.library。一个库模块怎么能有活动和应用程序?你有一个模块是com.android.library。库模块如何具有活动和应用程序?