использовать условие @ContributesAndroidInjector на основе (уровень API) - PullRequest
0 голосов
/ 10 марта 2020

У меня есть ServiceBinderModule в моем приложении Android, которое отвечает за добавление всех моих Service s в граф DI, например:

@ContributesAndroidInjector
@ServiceScope
internal abstract fun myAutofillService(): MyAutofillService

Моя проблема в том, что у меня есть Сервис это расширяет android.service.autofill.AutofillService, который доступен только от Android O. На устройствах ниже этого уровня API у меня есть другое решение, но поскольку у меня уже есть MyAutofillService на графике, приложение аварийно завершает работу при запуске (MyAutofillService уже находится в DaggerAppComponent, но AutofillService не присутствует в Android Framework).

Я видел эту тему об этой топи c: https://github.com/google/dagger/issues/1064

Он предлагает использовать dagger.android.experimentalUseStringKeys и @RequiresApi , но у него есть предупреждение: Keep in mind that enabling this also breaks incremental annotation processor support on Dagger 5.+, который я считаю нарушителем. Мне также неудобно помещать experimental... вещи в производственное приложение.

Любой совет, что я мог бы сделать? Я хотел бы поставить MyAutofillService на графике на основе уровня API устройства.

1 Ответ

0 голосов
/ 11 марта 2020

Если вы не хотите использовать experimentalUseStringKeys, мне нравится в этом потоке вариант: сделать подкомпонент для более высокого уровня API . Этот подкомпонент должен содержать только привязку MyAutofillService.

@RequiresApi(Build.VERSION_CODES.O)
@Subcomponent(modules = [MyApi26Module::class])
interface MyApi26Subcomponent : AndroidInjector<MyApplication>

@RequiresApi(Build.VERSION_CODES.O)
@Module
abstract class MyApi26Module {
    @ContributesAndroidInjector
    @ServiceScope
    internal abstract fun myAutofillService(): MyAutofillService
}

Когда вы создаете свой основной компонент, вы можете проверить SDK_INT, чтобы решить, устанавливать ли его напрямую или создать MyApi26Subcomponent и установить его. вместо этого.

...