使用Hilt在BroadcastReceiver
内进行依赖注入无法工作。我试图通过从MainActivity
触发一个闹钟来调用BroadcastReceiver
,但是出现了UninitializedPropertyAccessException
。根据文档,只需将@AndroidEntryPoint
注释添加到接收器中即可,但事实并非如此。
示例代码:
App.kt:
@HiltAndroidApp
class App: Application() {
override fun onCreate() {
super.onCreate()
Log.d(App::class.simpleName, "onCreate: Application")
}
}
TestHiltInjection.kt:
class TestHiltInjection @Inject constructor() {
operator fun invoke() {
Log.d(TestHiltInjection::class.java.simpleName, "invoke called.")
}
}
HiltBroadcastReceiver.kt:
@AndroidEntryPoint
class HiltBroadcastReceiver : BroadcastReceiver() {
@Inject lateinit var testHiltInjection: TestHiltInjection
override fun onReceive(context: Context?, intent: Intent?) {
testHiltInjection()
}
}
MainActivity.kt:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val manager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val pending = PendingIntent
.getBroadcast(this, 0, Intent(this, HiltBroadcastReceiver::class.java), 0)
manager.setInexactRepeating(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
15000, 15000,
pending
)
}
}
输出 Logcat:
kotlin.UninitializedPropertyAccessException: lateinit property testHiltInjection has not been initialized
更新
问题已在2.29.1版本中解决,只需使用@AndroidEntryPoint
即可。
dagger-hilt
标签中有足够的声望来投票支持同义词。你能在这里做到吗:https://stackoverflow.com/tags/dagger-hilt/synonyms?似乎没有任何管理员关心将与`hilt`相关的标签整理好,所以我正在尝试自己协调。 - Bartek Lipinski