Инъекция поля в AppWidgetProvider в kotlin с использованием кинжала 2 - PullRequest
0 голосов
/ 25 февраля 2020

Я использую dagger2 и kotlin в своем проекте. Я ввел активность и viewmodels, и теперь я хочу внедрить класс appwidgetprovider для виджетов приложения. Я не могу найти способ вставить поля в класс appwidgetprovider. Вот моя реализация dagger2.

это класс компонента приложения

@Singleton
@Component(
    modules = [
        UserInformationModule::class,
        AndroidInjectionModule::class,
        AppModule::class,
        MainActivityModule::class,
        ServiceBuilderModule::class]
)

interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder

          fun build(): AppComponent
        }

    fun inject(application: BaseClass)
}

Это класс AppModule

@Module(includes = [ViewModelModule::class, CoreDataModule::class])
class AppModule {

    @Singleton
    @Provides
    fun provideMyMyAppService(
        @MyAppAPI okHttpClient: OkHttpClient,
        converterFactory: MoshiConverterFactory
    ) = provideService(okHttpClient, converterFactory, MyMyAppApi::class.java)

@MyAppAPI
@Provides
fun providePrivateOkHttpClient(
    upstreamClient: OkHttpClient
): OkHttpClient {
    return upstreamClient.newBuilder().build()
}

@Singleton
@Provides
fun provideRemoteDataSource(myMyAppService: MyMyAppApi) = RemoteDataSource(myMyAppService)

@Singleton
@Provides
fun provideDb(app: Application) = AppDatabase.getInstance(app)

//other code

Это модуль построителя фрагментов

@Suppress("unused")
@Module
abstract class FragmentBuildersModule {
    @ContributesAndroidInjector
    abstract fun homeFragment(): HomeFragment

    @ContributesAndroidInjector
    abstract fun fragHome(): FragHome

    //other code
}

это мой Модуль основной деятельности

@Suppress("unused")
@Module
abstract class MainActivityModule {
    @ContributesAndroidInjector(modules = [FragmentBuildersModule::class])
    abstract fun contributeMainActivity(): HomeActivity

    @ContributesAndroidInjector(modules = [FragmentBuildersModule::class])
    abstract fun contributeSplashActivity(): SplashActivity
}

Это мой модуль ViewModel

@Suppress("unused")
@Module
abstract class ViewModelModule {
    @Binds
    @IntoMap
    @ViewModelKey(HomeViewModel::class)
    abstract fun bindHomeViewModel(viewModel: HomeViewModel): ViewModel

        ///other code
}

Я пытался внедрить класс appwidgetprivider, используя

AndroidInjection.inject(this)

, как я это делал в Service. Но этот метод исключает только активность, фрагмент, сервис, широковещательный приемник и контент-провайдеров. Любая помощь, пожалуйста.

Я использую кинжал 2.23.2 и kotlin 1.3.41

1 Ответ

1 голос
/ 25 февраля 2020

Провайдер Appwidget может быть введен так же, как и получатель широковещания. Посмотрев на предоставленный вами код, вы можете сделать что-то вроде этого. Создайте абстрактную функцию

@ContributesAndroidInjector
internal abstract fun contributeWidget(): YourWidgetClass

, расширьте свой базовый класс с помощью HasBroadcastReceiverInjector и внедрите broadcastReceiverInjector

@Inject
    lateinit var broadcastReceiverInjector: DispatchingAndroidInjector<BroadcastReceiver>

     override fun broadcastReceiverInjector(): AndroidInjector<BroadcastReceiver> {
        return broadcastReceiverInjector
    }

и вставьте fillany в класс widgetprovider в onreceive перед супер вызовом

    AndroidInjection.inject(this, context)
...