在我所看到的有限示例之外,我很难理解如何使用Dagger2.0。以阅读应用程序为例。在这个阅读应用程序中,有一个用户故事库和登录功能。在本例中,感兴趣的类别包括:MainApplication.java
-扩展应用程序LibraryManager.java
-负责在用户库中添加/删除故事的管理器。这是从MainApplication
调用的。AccountManager.java
-负责保存所有用户登录信息的管理器。可以从图书馆经理那里打电话
我仍在努力思考应该创建哪些组件和模块。到目前为止,我可以收集到以下信息:
创建提供HelperModule
和AccountManager
实例的LibraryManager
:
@Module
public class HelperModule {
@Provides
@Singleton
AccountManager provideAccountManager() {
return new AccountManager();
}
@Provides
@Singleton
LibraryManager provideLibraryManager() {
return new LibraryManager();
}
}
创建一个在其模块列表中列出
MainApplicationComponent
的HelperModule
:@Singleton
@Component(modules = {AppModule.class, HelperModule.class})
public interface MainApplicationComponent {
MainApplication injectApplication(MainApplication application);
}
在
@Injects LibraryManager libraryManager
中包含MainApplication
,并将应用程序注入到图中。最后,它查询注入的LibraryManager
库中的故事数:public class MainApplication extends Application {
@Inject LibraryManager libraryManager;
@Override
public void onCreate() {
super.onCreate();
component = DaggerMainApplicationComponent.builder()
.appModule(new AppModule(this))
.helperModule(new HelperModule())
.build();
component.injectApplication(this);
// Now that we have an injected LibraryManager instance, use it
libraryManager.getLibrary();
}
}
将
AccountManager
注入LibraryManager
public class LibraryManager {
@Inject AccountManager accountManager;
public int getNumStoriesInLibrary() {
String username = accountManager.getLoggedInUserName();
...
}
}
但是问题是当我试图在
AccountManager
中使用LibraryManager
时,MainApplication
是空的,我不知道为什么或者如何解决这个问题。我认为这是因为注入到图中的LibraryManager
没有直接使用accountmanager,但是我需要如何将注入到图中? 最佳答案
按如下所示修改类,它将起作用:
你的POJO:
public class LibraryManager {
@Inject AccountManager accountManager;
public LibraryManager(){
MainApplication.getComponent().inject(this);
}
public int getNumStoriesInLibrary() {
String username = accountManager.getLoggedInUserName();
...
}
...
}
组件接口:
@Singleton
@Component(modules = {AppModule.class, HelperModule.class})
public interface MainApplicationComponent {
void inject(MainApplication application);
void inject(LibraryManager lm);
}
}
你的申请类别:
public class MainApplication extends Application {
private static MainApplicationComponent component;
@Inject LibraryManager libraryManager;
@Override
public void onCreate() {
super.onCreate();
component = DaggerMainApplicationComponent.builder()
.appModule(new AppModule(this))
.helperModule(new HelperModule())
.build();
component.injectApplication(this);
// Now that we have an injected LibraryManager instance, use it
libraryManager.getLibrary();
}
public static MainApplicationComponent getComponent(){return component;}
}
实际上,您需要对所有依赖类执行相同的操作,基本上您可以访问所有活动子类中的应用程序类,因此将get组件作为静态方法也同样如此。但是对于pojo,你需要以某种方式捕捉组件。有很多方法可以实现。这只是一个说明,让你知道它是如何工作的。
现在你可以摧毁火星了:)