android - 使用 HILT 注入(inject)抽象类(基本 Activity )

标签 android kotlin dependency-injection dagger-hilt

我刚刚开始尝试在我非常简单的项目中使用 Hilt。现在一切都在 Dagger2 上,但我想迁移到 Hilt。

我有一个 Activity :

@AndroidEntryPoint
class MainActivity : BaseActivity() { 
    // SOME STUFF
}

还有一个像这样的 BaseActivity:

abstract class BaseActivity : AppCompatActivity() {
    // SOME STUFF
}

此外,我还有一个使用 baseActivity 来显示对话框的类。例如:

@FragmentScoped
class TestComponentImpl @Inject constructor(
    private val baseActivity: BaseActivity
) : TestComponent {

    override fun displayDialog() {
        MaterialDialog(baseActivity).show { ... 
    }
}

但是,当我尝试编译时,出现了这个错误:

BaseActivity cannot be provided without an @Provides-annotated method.

所以,我的问题是:如何构造函数注入(inject)抽象类。我尝试了很多东西但没有成功,比如在 Hilt 模块中:

    @Provides
    @Singleton
    fun provideBaseActivity(): BaseActivity{
        return BaseActivity() // Of course, it can't work cause it's an abstract class
    } 

或者(就像我对 Dagger 所做的那样):

    @Provides
    @PerActivity
    fun appCompatActivity(baseActivity: BaseActivity) = baseActivity as AppCompatActivity

另外,我只是 Hilt 的初学者,所以,也许我错过了什么。我会继续搜索:)

感谢您的宝贵时间和回答:)

编辑:

我自己搜索了几天,这似乎有效,但似乎不太好......

@Singleton
@Provides
fun provideBaseActivity(baseActivity: BaseActivity): AppCompatActivity {
    return baseActivity
}

但只有当我像这样放置我的 baseActivity 时:

open class BaseActivity Inject constructor() : AppCompatActivity() 

但是,在那之后,如果我尝试像这样在我的 TestComponentImpl 中使用注入(inject)的 baseActivity(就像我在 Hilt 之前使用 Dagger 所做的那样):

override fun displayError() {
    Snackbar.make(
        baseActivity.findViewById(android.R.id.content),
        "My error text",
        Snackbar.LENGTH_LONG
    ).apply {
        show()
    }

我有另一个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference

所以我不认为我的 baseActivity 注入(inject)做得很好。我会继续调查 ;)

最佳答案

有点 hacky(类型转换)但应该可以工作(未经测试,从我的头顶上写下来,所以如果有什么地方没有按预期工作,请随时告诉我):

创建这样的模块:

@Module
@InstallIn(ActivityComponent::class)
object BaseActivityModule {

  @Provides
  fun provideBaseActivity(activity: Activity): BaseActivity {
    check(activity is BaseActivity) { "Every Activity is expected to extend BaseActivity" }
    return activity as BaseActivity  
  }
}

最后一个 as BaseActivity 可能是不必要的。 Kotlin 编译器应该处理这个问题。

关于android - 使用 HILT 注入(inject)抽象类(基本 Activity ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63217280/

相关文章:

android - Facebook 身份验证对话框立即消失

android - 应用程序更新时文件会被删除吗?

java - 解析具有不同键的 JSON 对象

casting - 在 Kotlin 中可以进行交叉转换吗?

android - Firebase 分析查找自定义事件参数

java - Mockito - 什么规则管理类似 Collection 类的模拟注入(inject)?

java - 配置注入(inject)框架

Android:Tabs + Swipe:如何知道页面导航的上一个屏幕?

arrays - Kotlin 观察数组变化

dependency-injection - JAX-WS & JSR 330 (Spring) - 不能注入(inject)依赖