gpt4 book ai didi

android - 如何将 Activity 注入(inject)另一个类(class)

转载 作者:行者123 更新时间:2023-11-29 02:28:04 25 4
gpt4 key购买 nike

我需要将 @Inject 构造函数 activityfragmentManager 放入我的 Navigator.class 中。但是我收到了这个错误:

AppCompatActivity cannot be provided without an @Inject constructor or from an @Provides-annotated method.

我在 Stackoverflow 上阅读了所有类似的问题。我做了他们建议的所有事情,但没有找到答案。

Navigator.class

@Singleton
class Navigator @Inject constructor(private val activity: AppCompatActivity,
private val fragmentManager: FragmentManager)

BaseActivity.class

abstract class BaseActivity: AppCompatActivity(), HasSupportFragmentInjector{
@Inject
lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>
@Inject
lateinit var navigator: Navigator
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
}
override fun supportFragmentInjector() = fragmentInjector

BaseModule.class

@Module
abstract class BaseActivityModule {
@Module
companion object {

@JvmStatic
@Provides
@Named(ACTIVITY_FRAGMENT_MANAGER)
@PerActivity
fun activityFragmentManager(activity: AppCompatActivity): FragmentManager =
activity.supportFragmentManager
}

@Binds
@PerActivity
abstract fun activity(appCompatActivity: AppCompatActivity): Activity

@Binds
@PerActivity
abstract fun activityContext(activity: Activity): Context

MainActivityModule.class

@Module(includes = [
BaseActivityModule::class

])
abstract class MainActivityModule {

@Binds
@PerActivity
abstract fun appCompatActivity(mainActivity: MainActivity): AppCompatActivity

AppModule.class

    @Module(includes = [AndroidSupportInjectionModule::class])
abstract class AppModule {
@Binds
@Singleton
abstract fun application(app: App): Application

@PerActivity
@ContributesAndroidInjector(modules = [MainActivityModule::class])
abstract fun mainActivityInjector(): MainActivity

最佳答案

首先,请确认understand what the error means .您正在尝试注入(inject) AppCompatActivity,但 Dagger 提示说无法提供。到目前为止,一切都很好。请始终确保包含链接中显示的完整错误,以便我们可以更轻松地了解发生了什么。在您的情况下,这似乎是一个范围界定问题。

您通过构造函数注入(inject)提供一个 Navigator 作为 @Singleton...

@Singleton
class Navigator @Inject constructor(private val activity: AppCompatActivity,
private val fragmentManager: FragmentManager)

并且您从具有 @PerActivity 范围的模块提供/绑定(bind) AppCompatActivity

@Binds
@PerActivity
abstract fun appCompatActivity(mainActivity: MainActivity): AppCompatActivity

所以除非你有一个非常疯狂的设置,否则 @Singleton 将无法访问 @PerActivity。如果可能的话,你至少会有内存泄漏,因为你会让你的 Activity 实例保持比它的生命周期更长的时间(onCreate -> onDestroy)


要解决您的问题,您必须将 Navigator 的范围向下移动到 @PerActivity 并共享它引用的 Activity 的生命周期(这样它就不会t 泄漏)或者你必须在你的构造函数中删除对你的 Activity 的依赖。如果您确实需要它是 @Singleton 并引用一个 Activity,您可以为当前 Activity 设置一个 setter,但同样要注意泄漏。

关于android - 如何将 Activity 注入(inject)另一个类(class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51084665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com