如何通过Hilt/Dagger为GlanceAppWidget注入Context?
解决方案:通过Hilt为GlanceAppWidget注入Context
要解决这个问题,核心是避免给BroadcastReceiver添加构造注入,改用字段注入获取MyWidget实例,具体实现如下:
- 保持MyWidget的注入配置不变
@Singleton class MyWidget @Inject constructor( @ApplicationContext val context: Context ) : GlanceAppWidget() { // 直接使用注入的context完成glanceId获取、小组件状态更新等操作 }
- 修改MyWidgetReceiver,改用字段注入获取MyWidget实例
@AndroidEntryPoint class MyWidgetReceiver : GlanceAppWidgetReceiver() { @Inject lateinit var myWidget: MyWidget override val glanceAppWidget: GlanceAppWidget get() = myWidget }
关键说明
- BroadcastReceiver由系统负责实例化,只能调用无参构造,因此不能给它添加带参数的构造注入,否则会触发
InstantiationException。 @AndroidEntryPoint注解会让Hilt接管Receiver的依赖注入流程,系统创建Receiver实例后,Hilt会自动初始化标记了@Inject的lateinit字段。- 不要给MyWidget添加默认参数构造函数,这会导致类存在多个构造方法,触发Hilt的「Type may only contain one injected constructor」错误——保持唯一的
@Inject构造即可,实例完全由Hilt提供。 - 确保你的Application类已经添加了
@HiltAndroidApp注解,这是Hilt正常工作的基础。
内容的提问来源于stack exchange,提问作者mars8
相关产品推荐
相关产品推荐

