android - 如何在运行时将参数从 Activity 或 Fragment 传递到 Dagger 模块

标签 android dagger-2 dagger

我的软件规范如下:

Android Studio 3.4
dagger-android 2.16

我有以下传递 MapboxGeocoder 的类,它将执行并返回响应。

class GeocodingImp(private val mapboxGeocoder: MapboxGeocoder) : Geocoding {

    override fun getCoordinates(address: String, criteria: String): AddressCoordinate {
        val response = mapboxGeocoder.execute()

        return if(response.isSuccess && !response.body().features.isEmpty()) {
            AddressCoordinate(
                response.body().features[0].latitude,
                response.body().features[0].longitude)
        }
        else {
            AddressCoordinate(0.0, 0.0)
        }
    }
}

但是,MapboxGeocoder 是在编译时在 dagger 模块中生成的。所以我必须为地址和 TYPE_ADDRESS 指定字符串。

@Reusable
@Named("address")
@Provides
fun provideAddress(): String = "the address to get coordinates from"

@Reusable
@Provides
@Named("geocoder_criteria")
fun provideGeocoderCriteria(): String = GeocoderCriteria.TYPE_ADDRESS

@Reusable
@Provides
fun provideMapboxGeocoder(@Named("address") address: String, @Named("geocoder_criteria") geocoderCriteria: String): MapboxGeocoder =
    MapboxGeocoder.Builder()
        .setAccessToken("api token")
        .setLocation(address)
        .setType(geocoderCriteria)
        .build()

@Reusable
@Provides
fun provideGeocoding(mapboxGeocoder: MapboxGeocoder): Geocoding =
    GeocodingImp(mapboxGeocoder)

我的组件类:

interface TMDispatchMobileUIComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: TMDispatchMobileUIApplication): Builder

        fun build(): TMDispatchMobileUIComponent
    }

    fun inject(application: TMDispatchMobileUIApplication)
}

在主要 Activity 中,我会像这样使用它,因为用户可以输入不同的地址或将标准更改为其他内容。但是随着模块的编译,我无法在运行时向它们传递任何参数:

presenter.getAddressCoordinates("this should be the actual address", GeocoderCriteria.TYPE_ADDRESS)

为了注入(inject) Activity,我使用以下内容:

AndroidInjection.inject(this)

这个问题有什么解决办法吗?

最佳答案

您遇到的问题可以使用“辅助注入(inject)”方法解决。

这意味着您需要使用现有范围提供的依赖项和实例创建者(在本例中为您的主要 Activity )提供的依赖项来构建一个类。 Google 的 Guice 有一个很好的 description of what it is and why it is needed

不幸的是,Dagger 2 没有开箱即用的功能。然而, jack 沃顿正在研究 separate library可以附加到 Dagger。此外,您可以在他关于 Droidcon London 2018 的演讲中找到更多详细信息,他在演讲中专门针对这个问题做了一个完整的演讲部分: https://jakewharton.com/helping-dagger-help-you/

关于android - 如何在运行时将参数从 Activity 或 Fragment 传递到 Dagger 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53962758/

相关文章:

android - Flex 移动 Maven 构建

java - Android ListView 项目太大不知道为什么

android - 添加阴影以滑出导航

android - 将大文件上传到android中的服务器?

java - 如何使用 Dagger 模块和 Robolectric 测试 Activity onResume() 上的模拟交互?

java - 为什么 Dagger 注入(inject)具体类?

java - 如果没有 @Inject 构造函数,则无法提供 Dagger 2 对象

java - 如果没有 @Inject 构造函数,则无法提供 Dagger2

android - 使用 Dagger 时 2 : e: [kapt] An exception occurred: java. lang.IllegalArgumentException: void

Android 使用 Dagger 2 为动态更改 url 实现 HostSelectionInterceptor