【发布时间】:2020-08-02 14:39:27
【问题描述】:
我刚刚开始尝试在我非常简单的项目中使用 Hilt。目前一切都在 Dagger2 上,但我想迁移到 Hilt。
我有一个活动:
@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 { ...
}
}
但是,当我尝试编译时,我遇到了这个错误:
如果没有 @Provides-annotated 方法,则无法提供 BaseActivity。
所以,我的问题是:如何构造函数注入抽象类。我尝试了很多东西,但都没有成功,比如在 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 中使用注入的 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:尝试在空对象引用上调用虚拟方法“android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()”
所以我不认为我的 baseActivity 注入做得很好。我正在继续调查;)
【问题讨论】:
标签: android kotlin dependency-injection dagger-hilt