当前位置: 首页 > 知识库问答 >
问题:

用HILT注入抽象类(基本活动)

寇宏义
2023-03-14

我只是开始尝试在我非常简单的项目上使用Hilt。现在它都是在Dagger2上,但我想迁移到Hilt。

我有一个活动:

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

和下面这样的基本活动:

abstract class BaseActivity : AppCompatActivity() {
    // SOME STUFF
}
@FragmentScoped
class TestComponentImpl @Inject constructor(
    private val baseActivity: BaseActivity
) : TestComponent {

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

或者(就像我用匕首那样):

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

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

感谢您的时间和回答:)

@Singleton
@Provides
fun provideBaseActivity(baseActivity: BaseActivity): AppCompatActivity {
    return baseActivity
}
open class BaseActivity Inject constructor() : AppCompatActivity() 
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()”

所以我不认为我的基础活动注射做得很好。我在继续调查;)

共有1个答案

燕承安
2023-03-14

有点怪(类型转换),但应该可以工作(未经测试,写掉了我的头顶,所以如果有些东西不像预期的那样工作,请告诉我):

创建这样的模块:

@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  
  }
}

最后一次将强制转换为baseActivity可能是不必要的。Kotlin编译器应该处理这个。

 类似资料:
  • 如何在扩展Activity而不是AppCompatActivity的类中注入改装实例?这是模块: 这是我的主要活动: 这导致 用@AndroidEntryPoint注释的活动必须是 androidx.activity.ComponentActivity 的子类。(例如 FragmentActivity、AppCompatActivity 等)[剑柄]处理未完成。有关详细信息,请参阅上面的错误。 我

  • 大家好,我正在尝试使用Dagger-Hilt,我想知道如何实现这个代码? Gradle返回此错误: 这是生成的Java类: 非常感谢您的帮助。

  • 抽象路由类 aiohttp使用抽象类来管理web接口。 aiohttp.web中大部分类都不打算是可以继承的,只有几个是可以继承的。 aiohttp.web建立在这几个概念之上: 应用(application),路由(router),请求(request)和响应(response)。 路由(router)是一个可插拔的部分: 用户可以从头开始创建一个新的路由库,不过其他的部分必须与这个新路由无缝契

  • 本文向大家介绍PHP抽象类基本用法示例,包括了PHP抽象类基本用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP抽象类基本用法。分享给大家供大家参考,具体如下: 运行上述代码,会提示如下错误信息: Fatal error: Class Managers contains 1 abstract method and must therefore be declared abstr

  • How ABCs Work # abc_base.py import abc class PluginBase(metaclass=abc.ABCMeta): @abc.abstractmethod def load(self, input): """Retrieve data from the input source and return

  • 我有一个问题是将EJB注入到抽象类中,抽象类是我JSF CDI bean的父类。在我的项目中,我使用MyFaces CODI 1.0.5(ViewScope),Omniface 1.3,PrimeFaces 3.4.2和GlassFish3.1.2。 应用程序是一个EAR,抽象类位于EJB模块中,JSF CDI bean位于WAR模块中: 我的抽象类: 我的CDIBean: 当我部署应用程序并访问