当前位置:  开发笔记 > 编程语言 > 正文

是否可以在Dagger 2中有选择地为组件设置模块?

如何解决《是否可以在Dagger2中有选择地为组件设置模块?》经验,为你挑选了1个好方法。

Caused by: java.lang.IllegalStateException: analyticsModule must be set

我正在构建一个使用模板样式初始化的库.用户可以使用该库有选择地为项目设置模块.它使用Dagger 2进行DI.

但是Dagger 2似乎不允许使用可选模块.不能简单地忽略未设置的模块?



1> 小智..:

您可能需要考虑使用Multibindings,它允许用户可选地将依赖项添加到Set或中Map.这是一个例子:

interface Plugin {
    void install(Application application);
}

@Component({ModuleA.class, ModuleB.class})
interface PluginComponent {
    Set plugins();
}

@Module
class ModuleA {
    @Provides(type = SET) Plugin providFooPlugin() {
        return new FooPlugin();
    }
}

@Module
class ModuleB {
    @Provides(type = SET) Plugin providBarPlugin() {
        return new BarPlugin();
    }
}

在这种情况下,您仍然需要每个模块的实例,即使它未被使用.解决这个问题的一个选择是使用@Provides(type = SET_VALUES),并且拥有你不会关闭的模块Collections.emptySet().这是一个修改过的例子:

interface Plugin {
    void install(Application application);
}

@Component({ModuleA.class, ModuleB.class})
interface PluginComponent {
    Set plugins();
}

@Module
class ModuleA {
    private final Set plugins;

    ModuleA(Set plugins) {
        this.plugins = plugins;
    }

    @Provides(type = SET_VALUES) Plugin providFooPlugins() {
        return plugins;
    }
}

@Module
class ModuleB {
    @Provides(type = SET) Plugin providBarPlugin() {
        return new BarPlugin();
    }
}

现在,您可以致电:

DaggerPluginComponent.builder()
    .moduleA(new ModuleA(Collections.emptySet())
    .build();

或者:

Set plugins = new HashSet<>();
plugins.add(new AwesomePlugin());
plugins.add(new BoringPlugin());
DaggerPluginComponent.builder()
    .moduleA(new ModuleA(plugins)
    .build();

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有