我只是开始尝试在我非常简单的项目中使用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 { ...
    }
}
但是,当我尝试编译时,出现此错误:

因此,我的问题是:如何构造函数注入(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()
    }
我还有另一个错误:

因此,我认为我的baseActivity注入(inject)不能完全完成。我一直在调查;)

最佳答案

有点hacky(类型转换),但是应该可以工作(没试过,写下我的头顶,所以随时让我知道某些事情是否无法正常工作):
创建这样的Module:

@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编译器应处理此问题。

10-06 03:45