ant*_*009 5 android dagger dagger-2
我的软件规格如下:
Android Studio 3.4
dagger-android 2.16
Run Code Online (Sandbox Code Playgroud)
我有以下类传递一个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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,它MapboxGeocoder是在编译时在匕首模块中生成的.所以我必须为地址指定字符串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)
Run Code Online (Sandbox Code Playgroud)
我的component班级:
interface TMDispatchMobileUIComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: TMDispatchMobileUIApplication): Builder
fun build(): TMDispatchMobileUIComponent
}
fun inject(application: TMDispatchMobileUIApplication)
}
Run Code Online (Sandbox Code Playgroud)
在主要活动中,我会像这样使用它,因为用户可以输入不同的地址或将标准更改为其他地址.但是在编译模块时,我无法在运行时将任何参数传递给它们:
presenter.getAddressCoordinates("this should be the actual address", GeocoderCriteria.TYPE_ADDRESS)
Run Code Online (Sandbox Code Playgroud)
为了注入Activity,我使用以下内容:
AndroidInjection.inject(this)
Run Code Online (Sandbox Code Playgroud)
有没有解决这个问题的方法?
您可以使用"辅助注射"方法解决您遇到的问题.
这意味着您需要使用现有作用域提供的依赖项以及实例创建者(在本例中为主要活动)的某些依赖项来构建类.谷歌的Guice很好地描述了它是什么以及为什么需要它
不幸的是,Dagger 2没有这个功能.然而,杰克沃顿正在建立一个可以附加到Dagger 的独立图书馆.此外,你可以在他关于Droidcon London 2018的演讲中找到更多细节,在那里他为这个问题专门讨论了整个讨论部分:https://jakewharton.com/helping-dagger-help-you/
| 归档时间: |
|
| 查看次数: |
970 次 |
| 最近记录: |