我刚刚开始尝试在我非常简单的项目中使用 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/