在我所看到的有限示例之外,我很难理解如何使用Dagger2.0。以阅读应用程序为例。在这个阅读应用程序中,有一个用户故事库和登录功能。在本例中,感兴趣的类别包括:
MainApplication.java-扩展应用程序
LibraryManager.java-负责在用户库中添加/删除故事的管理器。这是从MainApplication调用的。
AccountManager.java-负责保存所有用户登录信息的管理器。可以从图书馆经理那里打电话
我仍在努力思考应该创建哪些组件和模块。到目前为止,我可以收集到以下信息:
创建提供HelperModuleAccountManager实例的LibraryManager

@Module
public class HelperModule {

    @Provides
    @Singleton
    AccountManager provideAccountManager() {
        return new AccountManager();
    }

    @Provides
    @Singleton
    LibraryManager provideLibraryManager() {
        return new LibraryManager();
    }

}

创建一个在其模块列表中列出MainApplicationComponentHelperModule
@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,你需要以某种方式捕捉组件。有很多方法可以实现。这只是一个说明,让你知道它是如何工作的。
现在你可以摧毁火星了:)

07-23 13:17