使用Hilt/Dagger将上下文注入广播接收机



我在GlanceAppWidget()中使用context()执行检索glanceId和更新应用程序小部件状态等任务。我对如何注入context对象有问题。

我想使用dagger/hilt框架将上下文注入到我的GlanceAppWidget()构造函数中。见下文MyWidget()

然而,通过将上下文注入MyWidget,我需要将上下文作为MyWidgetReceiver()val glanceAppWidget的构造函数参数传递。广播接收器不应该有构造函数参数,所以这给了我一个实例化异常。

如何将上下文注入GlanceAppWidget?任何帮助都将不胜感激。

注意:我还尝试在MyWidget()中使用默认参数来避免在MyWidgetReceiver中提供上下文;类型只能包含一个注入的构造函数";。

@Singleton
class MyWidget @Inject constructor(
@ApplicationContext val context: Context
) : GlanceAppWidget() 
@AndroidEntryPoint
@Singleton
class MyWidgetReceiver @Inject constructor(
@ApplicationContext val context: Context /*<-java.lang.InstantiationException when trying to inject into BroadcastReceiver*/
) : GlanceAppWidgetReceiver() {
override val glanceAppWidget: GlanceAppWidget
get() = MyWidget(context)
}

两件事:

  1. GlanceAppWidgetReceiverBroadcastReceiver,因此不能有构造函数参数。而且它不应该是一个单例。BroadcastReceivers是短期生活课程。

  2. 您可以通过调用LocalContext.current来检索@Composable函数内的上下文。您也可以通过调用LocalGlanceId.current来检索glanceId

因此,您不需要首先注入上下文。

class MyWidget: GlanceAppWidget() {
@Composable
override fun Content() {
val context = LocalContext.current
val glanceId = LocalGlanceId.current
//...
}
}
@AndroidEntryPoint
class MyWidgetReceiver: GlanceAppWidgetReceiver() {
override val glanceAppWidget = MyWidget()
}
BroadcastReceiver的

onReceive方法将上下文作为其参数。您可能想将您的小部件创建逻辑绑定到此方法

fun onReceive(context: Context, intent: Intent)

编辑:

我没注意到你在用Glance。既然如此,我建议停止在构造函数中使用上下文,而是在通过某种方法实际访问上下文时更新glanceId和小部件状态。

override fun onReceive(context: Context, intent: Intent) {
glanceAppWidget.update(context)
}

MyWidget:

fun update(context: Context) {
// do some work
}

如果您需要更新,您只需发送匹配意向,接收方就会收到该意向。

最新更新