我遇到了新的android dagger2 v2.11的问题。 这只是我想要做的简化问题。我计划制作共享库,它将在不同的应用程序中使用很多,并将所有库di(dagger stuff)逻辑放入其中,这样我就可以将应用程序挂钩了。
我会尝试解释到目前为止我所拥有的。
我有名为 app 的应用程序模块和名为依赖注入的android库。 (IIb)的 在应用中我已经使用di实现了MainActivity。 在lib中我已经实现了一个活动和一个带有di。
的类我正在尝试使用@Inject在lib中将这两个元素用于应用程序中的MainActivity。
我试图以几种方式完成它。 1.在lib中实现所有di和app中的所有di,然后在MainActivity中使用@Inject。 2.在app中创建AppComponent和ActivityBuilder,并从lib中扩展BaseAppComponent和BaseActivityBuilder。 3.单独实现di并从app application class调用lib dagger设置。
每次都有其他错误。我不确定是什么问题因此无法更好地指定它。但是我把简化的项目放在了最底层,这样你就可以看一下,如果你更容易解释,你可以做出贡献。
我花了几天的时间试图理解为什么它不起作用所以如果你能给我一些暗示我会很感激。
这是我的所有尝试的git repo:https://github.com/MatejVukosav/Dagger2Composition
答案 0 :(得分:0)
在将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
替换了 implementation答案 1 :(得分:0)
经过多次尝试,我设法让它运行。 但毕竟对于新匕首仍有一些奇怪的感觉,但我仍然不确定为什么有些东西虽然应该不起作用。
在DuckModule中我需要添加provideActivity(),虽然在单模块应用程序中,dagger由他自己处理。
@Module
public class DuckModule {
@Provides
DuckActivity provideActivity() {
return new DuckActivity(); <--
}
@Provides
DuckContract.View providesLibActivity( DuckActivity duckActivity ) {
return duckActivity;
}
}
其次,看起来lib活动构建器根本不起作用。它不会将模块与活动连接起来并提供其功能。
@Module
public abstract class PlantActivityBuilder {
@ContributesAndroidInjector(modules = DuckModule.class)
abstract DuckActivity bindLibActivity();
}
所以我的lib组件得到uselles
@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 );
}
现在我可以@Inject lib对象进入我的app活动并使用它们:
@Inject
DuckContract.View view;
@Inject
SharedPrefsInterface prefs;
ActivityMainBinding binding;
@Override
protected void onCreate( Bundle savedInstanceState ) {
AndroidInjection.inject( this );
super.onCreate( savedInstanceState );
binding = DataBindingUtil.setContentView( this, R.layout.activity_main );
...
prefs.save();
view.hashCode();
}
如果您找到其他更快,更清洁的方式,请分享。