使用匕首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)
我在我的项目中使用了 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 classAndroidInjection.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)