我的软件规范如下:
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)
我的
component
类: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 ·沃顿(Jake Wharton)正在研究可附加到Dagger的separate library。此外,您可以在他关于Droidcon London 2018的演讲中找到更多详细信息,在该演讲中他专门讨论了这个问题:
https://jakewharton.com/helping-dagger-help-you/
关于android - 如何在运行时将参数从 Activity 或 fragment 传递到Dagger模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53962758/