栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Android @Singleton注释类上的Dagger 2未注入

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android @Singleton注释类上的Dagger 2未注入

您正在使用中而犯了一个错误

DaggerBootstrap.create().initialize(this);

在您的活动中,因为范围不在多个组件实例之间共享。我建议使用自定义应用程序类

public class CustomApplication extends Application {    @Override    public void onCreate() {         super.onCreate();         Bootstrap.INSTANCE.setup();    }}@Component@Singletonpublic interface _Bootstrap {    void initialize(ActivityA activityA);    //void initiali...}public enum Bootstrap {    INSTANCE;    private _Bootstrap bootstrap;    void setup() {        bootstrap = Dagger_Bootstrap.create();    }    public _Bootstrap getBootstrap() {        return bootstrap;    }}

然后你可以称它为

Bootstrap.INSTANCE.getBootstrap().initialize(this);

这样,您可以在各个类之间共享组件。我个人将其命名

Bootstrap
injector
,并将
_Bootstrap
其命名为,
ApplicationComponent
因此它看起来像这样:

Injector.INSTANCE.getApplicationComponent().inject(this);

但这只是我的典型设置。名称并不重要。

编辑:对于您的最后一个问题,您可以通过子范围和组件依赖关系解决此问题。

您的图书馆项目应该只能看到图书馆的类,对吗?在这种情况下,您要做的就是

@Scope@Retention(RetentionPolicy.RUNTIME)public @interface LibraryScope {}@Component(modules={LibraryModule.class})@LibraryScopepublic interface LibraryComponent {    LibraryClass libraryClass(); //provision method for `MyManager`}@Modulepublic class LibraryModule {    @LibraryScope    @Provides    public LibraryClass libraryClass() { //in your example, LibraryClass is `MyManager`        return new LibraryClass(); //this is instantiation of `MyManager`    }}public enum LibraryBootstrap {    INSTANCE;    private LibraryComponent libraryComponent;    static {        INSTANCE.libraryComponent = DaggerLibraryComponent.create();    }    public LibraryComponent getLibraryComponent() {        return libraryComponent;    }}@Scope@Retention(RetentionPolicy.RUNTIME)public @interface ApplicationScope {}@Component(dependencies={LibraryComponent.class}, modules={AdditionalAppModule.class})@ApplicationScopepublic interface ApplicationComponent extends LibraryComponent {    AdditionalAppClass additionalAppClass();    void inject(InjectableAppClass1 injectableAppClass1);    void inject(InjectableAppClass2 injectableAppClass2);    void inject(InjectableAppClass3 injectableAppClass3);}@Modulepublic class AdditionalAppModule {    @ApplicationScope    @Provides    public AdditionalAppClass additionalAppClass() { //something your app shares as a dependency, and not the library        return new AdditionalAppClass();    }}public enum ApplicationBootstrap {    INSTANCE;    private ApplicationComponent applicationComponent;    void setup() {        this.applicationComponent = DaggerApplicationComponent.builder()       .libraryComponent(LibraryBootstrap.INSTANCE.getLibraryComponent())       .build();    }    public ApplicationComponent getApplicationComponent() {        return applicationComponent;    }}

然后

@InjectLibraryClass libraryClass; //MyManager myManager;...    ApplicationBootstrap.INSTANCE.getApplicationComponent().inject(this);


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496784.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号