首页 > 解决方案 > 如何使用新的 `dagger-android` 将活动传递给 dagger 模块

问题描述

Android Studio 3.4
dagger-android 2.21

如何使用activity新的传递给匕首模块dagger-android

在使用旧版本的 dagger 之前,我们可以在构造函数中传递 Activity 并在提供程序方法中返回它。但我不知道如何用 dagger-android 做到这一点

我有以下模块。但是,匕首现在不关于ForecastActivity.

@Module
class ActivityModule {
    @Reusable
    @Provides
    fun provideRetryListener(forecastActivity: ForecastActivity): RetryListener {
        return forecastActivity
    }
}

RetryListener是实现的接口ForecastActivity。我希望能够将它RetryListener注入我的RetryFragmentie

class RetryFragment : Fragment() {
    @Inject
    lateinit var retryListener: RetryListener // Inject here

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        AndroidSupportInjection.inject(this)

    super.onCreateView(inflater, container, savedInstanceState)

    retryListener.onRetry() // usage like this
        return inflater.inflate(R.layout.failurecase_layout, container, false)
    }
}

在预测活动中

class ForecastActivity : AppCompatActivity(), RetryListener {

    @Inject
    lateinit var forecastPresenter: ForecastPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)
    }

    override fun onRetry() {
       /* do something here */
    }
}

我的 ActivityBuilder 如下:

@Module
abstract class ActivityBuilder {
    @ContributesAndroidInjector(modules = [ActivityModule::class])
    abstract fun injectIntoRetryFragment(): RetryFragment
}

我的组件是这样的:

@Singleton
@Component(modules = [
    AndroidSupportInjectionModule::class,
    ActivityBuilder::class,
    ActivityModule::class])
interface StockComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: StockApplication): Builder

        fun build(): StockComponent
    }

    fun inject(application: StockApplication)
}

我的申请是:

class StockApplication : Application(), HasActivityInjector, HasSupportFragmentInjector {

    @Inject
    lateinit var dispatchingAndroidActivityInjector: DispatchingAndroidInjector<Activity>

    @Inject
    lateinit var dispatchingAndroidFragmentInjector: DispatchingAndroidInjector<Fragment>

    override fun onCreate() {
        super.onCreate()

        DaggerStockComponent
            .builder()
            .application(this)
            .build()
            .inject(this)
    }

    override fun activityInjector(): AndroidInjector<Activity> {
        return dispatchingAndroidActivityInjector
    }

    override fun supportFragmentInjector(): AndroidInjector<Fragment> {
        return dispatchingAndroidFragmentInjector
    }
}

所以问题是在使用 dagger-android 时如何将 注入RetryListenerRetryFragmentRetryListener实现的ForecastActivity

提前谢谢了

标签: androiddagger-2dagger

解决方案


我看不到提供您的模块ForecastActivity,即:

@ContributesAndroidInjector
abstract fun forecastActivity(): ForecastActivity

Activity遗嘱需要执行并HasSupportFragmentInjector提供DispatchingAndroidInjector<Fragment>


推荐阅读