[英]Use Dagger2 in android library project throws `NoClassDefFoundError` at runtime
[英]How to use dagger in a android library project
我正在尝试将Dagger添加到我的android项目中。 对于应用程序项目,我很容易清楚,如何构建ObjectGraph。 但我不知道在我的android库项目中最好的方法是什么。
我应该继续在应用程序的Application类中构建ObjectGraph并将OG传递给LibraryModule - 将库的OG插入到Apps OG中吗? 或者我应该在库中构建整个ObjectGraph?
如果我需要通过ObjectGraph.inject(this)
在库中注入一个类怎么办? 在我的Apps项目中,我可以从Application类中获取OG。 但是如何在图书馆处理这个? 我应该为ObjectGraph添加@Provides方法吗?
非常感谢你的帮助。
编辑:简而言之:如何在我的库项目中调用ObjectGraph.inject(this)
,因为它是在Application类中构建的?
如果有人使用Dagger 2来到这里,这就是我在我的应用程序中所做的方式:
在库模块中,我创建了以下模块和组件:
@Module
public class ModuleUtil {
@Provides
public RestTemplate provideRestTemplate() {
return new RestTemplate();
}
}
@Singleton
@Component(
modules = {
ModuleUtil.class
})
public interface MainComponent {
void inject(Postman postman);
}
然后我在下面创建了Singleton以管理注射:
public class DaggerWrapper {
private static MainComponent mComponent;
public static MainComponent getComponent() {
if (mComponent == null) {
initComponent();
}
return mComponent;
}
private static void initComponent () {
mComponent = DaggerMainComponent
.builder()
.utilModule(new ModuleUtil())
.build();
}
}
当库模块中的某个类需要注入其成员时,我只需调用DaggerWrapper.getComponent().inject(this);
那就是它。
我是这样做的:
@Module类属于主项目,它们提供了向库元素注入的实现,因此库项目中没有@Module类
期望依赖的库元素必须能够访问ObjectGraph并自己调用.inject(),但主项目应该使用提供的@Module依赖项将ObjectGraph实例赋予库
如何将ObjectGraph从主项目导入库中? 你可以有这样的界面:
interface Injector { void inject(Object object); public ObjectGraph getObjectGraph(); }
像Activity或Application类这样的Context对象实现了这个接口(ObjectGraph对象的持有者)。
如果你在库模块中有Activity的例子,它需要从主项目中注入一些东西,它将如下所示:
class LibraryActivity extends Activity {
@Inject ActivationModule instance;
void onCreate(... ) {
Injector injector = (Injector)getApplicationContext();
injector.inject(this)
}
}
ActivationModule是库项目中的类/接口。
主项目具有应用程序类,该类实现Injector接口并创建ObjectGraph,并为库项目中的ActivationModule提供依赖性。
class MyApplicationInTheMainProject extends Application implements Injector {
ObjectGraph graph;
@Override
public void onCreate() {
super.onCreate();
graph = ObjectGraph.create(new ActivationModuleImpl(this));
}
@Override public void inject(Object object) {
graph.inject(object);
}
@Override public ObjectGraph getObjectGraph() {
return graph;
}
}
@Module(injects = {
LibraryActivity.class
}, library = true)
class ActivationModuleImpl implements ActivationModule {
....
}
如果您将这个图书馆提供给人们并且他们对您的场景一无所知,那么您必须以您的Dagger完美工作的方式编写它,而无需用户的任何帮助。 (使用更好的练习更容易)
我刚刚为你写了一些图书馆来展示如何做到这一点。 我以一种你甚至可以独立运行它的方式编写库,并在消息选项卡中查看结果。 你的图书馆的用户不需要对匕首一无所知,也不做任何他只是使用图书馆和匕首的配置:
https://github.com/amirziaratii/libraryUsingDagger.git
如果这个库是您自己使用的,对于您自己的项目,最好的做法就是在我的朋友的这个项目中这样做:
https://github.com/mmirhoseini/trakt.tv
您在这两个项目中回答了所有问题。 在评论中提出任何疑问和错误答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.