我只是开始尝试在我非常简单的项目中使用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编译器应处理此问题。