作者:手机用户2502881927 | 来源:互联网 | 2023-01-27 15:29
引起:java.lang.IllegalStateException:必须设置analyticsModule我正在构建一个使用模板样式初始化的库.用户可以使用该库有选择地为项目设置
引起:java.lang.IllegalStateException:必须设置analyticsModule
我正在构建一个使用模板样式初始化的库.用户可以使用该库有选择地为项目设置模块.它使用Dagger 2进行DI.
但是Dagger 2似乎不允许使用可选模块.不能简单地忽略未设置的模块?
解决方法:
您可能想要考虑使用Multibindings,它允许用户可选地将依赖项添加到Set中.或地图.这是一个例子:
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();