在调用super.onCreate()之前将Hilt注入到Activity中

6

我在一个独立的模块中定义了自己的 LayoutInflater.Factory2 类,希望将其注入到我应用的每个活动中。但问题是,在活动的 super.onCreate() 方法之前设置这个工厂。

使用 Hilt 后,它会在 super.onCreate() 之后进行注射。因此,我遇到了 UninitializedPropertyAccessException 的问题。

有没有机会在 Hilt 执行 super.onCreate() 之前进行注射呢?

下面是我模块的依赖注入示例。

@Module
@InstallIn(SingletonComponent::class)
object DynamicThemeModule {
    @FlowPreview
    @Singleton
    @Provides
    fun provideDynamicThemeConfigurator(
        repository: AttrRepository
    ): DynamicTheme<AttrInfo> {
        return DynamicThemeConfigurator(repository)
    }
}

你回答了自己的问题。Hilt 在 supe.onCreate() 之后注入,所以你不能在它之前注入任何东西。 - Andrew
好吧,我猜在这里使用 di 是不合适的。所以唯一的解决方案是在 App 类中手动实例化 Factory2 实现。 - garcian
1个回答

3
你可以使用入口点在onCreate之前注入类,如下所示。
@AndroidEntryPoint
class MainActivity: AppCompatActivity() {
   
   @EntryPoint
   @InstallIn(SingletonComponent::class)
   interface DynamicThemeFactory {
      fun getDynamicTheme() : DynamicTheme<AttrInfo>
   }

   override fun onCreate(savedInstanceState: Bundle?) {
      val factory = EntryPointAccessors.fromApplication(this, DynamicThemeFactory::class.java)
      val dynamicTheme = factory.getDynamicTheme()
      super.onCreate(savedInstanceState)
   }
}

如果您需要经常使用这样的东西,我建议在应用程序启动时(onCreate)在您的Application类的伴生对象中创建一个实例。在任何视图被创建之前。因此,您不需要一次又一次地跳过这些步骤,而可以直接访问已经存在的实例。当您需要在attachBaseContext中使用上述代码时,它将不可用,您需要在应用程序类中创建它。请注意保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接