使用匕首 2 在 Kotlin 中的 AppWidgetProvider 中的字段注入

Posted

技术标签:

【中文标题】使用匕首 2 在 Kotlin 中的 AppWidgetProvider 中的字段注入【英文标题】:Field injection in AppWidgetProvider in kotlin using dagger 2 【发布时间】:2020-06-09 02:49:58 【问题描述】:

我在我的项目中使用 dagger2 和 kotlin。我已经注入了活动和视图模型,现在我想为应用小部件注入 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)

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

我正在使用 dagger 2.23.2 和 kotlin 1.3.41

【问题讨论】:

AppWidgetProvider 是 BroadcastReceiver 的子类,所以这部分看起来不错。您收到什么错误消息? 【参考方案1】:

可以像注入广播接收器一样注入 Appwidget 提供者。 通过查看您提供的代码,您可以执行类似的操作。 创建一个抽象函数

@ContributesAndroidInjector
internal abstract fun contributeWidget(): YourWidgetClass

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

@Inject
    lateinit var broadcastReceiverInjector: DispatchingAndroidInjector<BroadcastReceiver>

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

并且fillany在onreceive的widgetprovider类中注入 在超级通话之前

    AndroidInjection.inject(this, context)

【讨论】:

以上是关于使用匕首 2 在 Kotlin 中的 AppWidgetProvider 中的字段注入的主要内容,如果未能解决你的问题,请参考以下文章

未解决的参考匕首 2 + kotlin + android gradle

为啥匕首图可以在 java 中工作,但在 Kotlin 中却说在我提供时缺少提供?

Kotlin 中的@Named 是啥?

Kotlin 类 NoClassDefFoundError 崩溃

如何使用匕首解决 ViewModel 中的 coroutineScope 依赖关系

从匕首 2 获取空实例