Можно ли выборочно установить модули для компонентов в кинжале 2?

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

Я создаю библиотеку, которая использует инициализацию в стиле шаблона. Пользователь может выборочно устанавливать модули для проекта с помощью этой библиотеки. Он использует Dagger 2 для DI.

Но Dagger 2, похоже, не позволяет использовать дополнительные модули. Невозможно просто игнорировать модули?

Возможно, вам стоит рассмотреть возможность использования Multibindings, которая позволяет пользователям дополнительно добавлять зависимости в Set<T> или Map<K,V> . Вот пример:

 interface Plugin { void install(Application application); } @Component({ModuleA.class, ModuleB.class}) interface PluginComponent { Set<Plugin> 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<Plugin> plugins(); } @Module class ModuleA { private final Set<Plugin> plugins; ModuleA(Set<Plugin> 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<Plugin> plugins = new HashSet<>(); plugins.add(new AwesomePlugin()); plugins.add(new BoringPlugin()); DaggerPluginComponent.builder() .moduleA(new ModuleA(plugins) .build(); 
Intereting Posts
Используйте Parcelable для передачи объекта из одной активности Android в другую Как вызвать метод, определенный в другом действии / классе onClick () элемента ellement? Как получить цвета по умолчанию на Android Как получить доступ к базе данных SQLite в zip-файле – андроид Дублирующиеся файлы, скопированные в APK Android. Могут ли они быть объединены? Android Virtual Device супер медленный – компьютер слишком медленный? Android – UI, как скользящая панель уведомлений Инструмент для создания Splash Screen & Wallpaper для всех размеров и устройств с использованием Single Click Знайте, когда показывать блокировку паролей Что делать, когда – java.io.FileNotFoundException: Нет контент-провайдера? В чем разница между android.R.layout.simple_list_item_1 и android.R.layout.simple_list_item_2 Использовать офлайн-голос в текст в Android 4.1 (Jelly Bean) из моего приложения? Context.getPackageName () vs BuildConfig.APPLICATION_ID Android espresso maven и настройка градиента Определение и предотвращение задержки Android Scheduling