如何使用新的`dagger-android`将活动传递给Dagger模块

时间:2019-04-20 07:22:38

标签: android dagger-2 dagger

Android Studio 3.4
dagger-android 2.21

如何使用通过新的activitydagger-android传递给dagger模块

在使用较早版本的dagger之前,我们可以在构造函数中传递Activity并在provider方法中返回它。但我不确定如何使用Dagger-android

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

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

RetryListenerForecastActivity实现的接口。我希望能够将此RetryListener注入我的RetryFragment,即

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时,如何将RetryListener注入RetryFragment是由RetryListener实现的ForecastActivity中?

非常感谢

1 个答案:

答案 0 :(得分:1)

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

@ContributesAndroidInjector
abstract fun forecastActivity(): ForecastActivity

Activity将需要实现HasSupportFragmentInjector,并提供一个DispatchingAndroidInjector<Fragment>