使用匕首2在kotlin的AppWidgetProvider中进行字段注入

Field injection in AppWidgetProvider in kotlin using dagger 2

我在我的项目中使用了 dagger2 和 kotlin。我已经注入 activity 和 viewmodels,现在我想为应用小部件注入 appwidgetprovider class。我找不到将字段注入 appwidgetprovider class 的方法。这是我的 dagger2 实现。

这是应用组件class

@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 class

@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
}

这是我的主要 Activity 模块

@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 class
AndroidInjection.inject(this)

就像我在服务中所做的那样。但是这个方法只排除Activity、Fragment、service、broadcast receiver和contentproviders。请任何帮助。

我正在使用 dagger 2.23.2 和 kotlin 1.3.41

可以像注入广播接收器一样注入 Appwidget provicer。 通过查看您提供的代码,您可以做这样的事情。 创建抽象函数

@ContributesAndroidInjector
internal abstract fun contributeWidget(): YourWidgetClass

使用 HasBroadcastReceiverInjector 扩展您的 Baseclass 并实施 broadcastReceiverInjector

@Inject
    lateinit var broadcastReceiverInjector: DispatchingAndroidInjector<BroadcastReceiver>

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

并在 onreceive 的 widgetprovider class 中注入 fillany 在超级调用之前

    AndroidInjection.inject(this, context)