未解决的引用:在创建retrofit实例时进行retrofit



我正在开发一个android应用程序,该应用程序请求火星照片并使用它在屏幕上显示。提出请求:提出请求并尝试使用公开惰性初始化Retrofit服务的公共Api对象。下面是错误

的源代码
import retrofit2.Retrofit
import retrofit2.converter.scalars.ScalarsConverterFactory
import retrofit2.http.GET
class MarsApiService {
public val retrofit = Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.baseUrl(Companion.BASE_URL)
.build()
interface MarsApiService{
@GET("photos")
fun getPhotos(): String
}
object MarsApi {
val retrofitService: MarsApiService by lazy { retrofit.create(MarsApiService::class.java) }
}

companion object {
private const val BASE_URL = "https://android-kotlin-fun-mars-server.appspot.com"
}
}

第17行代码中对象MarsApi弹出错误未解决的引用:retrofit。在Retrofit对象上调用create()函数是昂贵的,并且应用程序只需要Retrofit API服务的一个实例。因此,我使用对象声明将服务暴露给了应用程序的其余部分。

我试过了:

如果我把MarsApi对象内的代码带出来,代码是工作的,但这样做可能会导致多个实例的改造。

code1

interface MarsApiService {
@GET("photos")
suspend fun getPhotos(): String
companion object {
private const val BASE_URL = "https://android-kotlin-fun-mars-server.appspot.com"
val marsApiService: MarsApiService by lazy {
Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.baseUrl(BASE_URL)
.build().create(MarsApiService::class.java)
}
}
}

code2

private const val BASE_URL = "https://android-kotlin-fun-mars-server.appspot.com/"
private val retrofit = Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.baseUrl(BASE_URL)
.build()
interface MarsApiService {
@GET("photos")
suspend fun getPhotos(): String
}
object MarsApi {
val marsApiService: MarsApiService by lazy { retrofit.create(MarsApiService::class.java) }
}

运行

fun main() = runBlocking {
val rs = marsApiService.getPhotos()
println(rs)
}

在您的代码中,retrofit通过惰性引用未解决retrofit的原因是propertyclass,全局移动retrofit像使用(Companion) object或像code2(最高层次结构?)

希望这个链接

使您清楚对象和伴随对象之间的区别以及何时使用它们。快乐学习

我也遇到过同样的问题。我解决了它只是排除类MarsApiService我也没有用companion object

右代码低于

import retrofit2.Retrofit
import retrofit2.converter.scalars.ScalarsConverterFactory
import retrofit2.http.GET
private const val BASE_URL = "https://android-kotlin-fun-mars-server.appspot.com"
public val retrofit = Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.baseUrl(Companion.BASE_URL)
.build()
interface MarsApiService{
@GET("photos")
fun getPhotos(): String
}
object MarsApi {
val retrofitService: MarsApiService by lazy { 
retrofit.create(MarsApiService::class.java) 
}
}

最新更新