未解决的参考:在创建改造实例时进行改造

Unresolved reference : retrofit while creating retrofit instance

我正在开发一个 android 应用程序,该应用程序请求火星照片并使用它在屏幕上显示。 使 request.And 尝试使用 A public Api 对象来公开惰性初始化的 Retrofit 服务。 下面是有错误的源代码

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行代码inside object MarsApi弹出错误Unresolved reference: 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 的原因是 classproperty,像使用 [ 一样全局移动 retrofit =18=] 或类似 code2(最高等级?)

希望this link

让你清楚object和companion object的区别以及何时使用它们。快乐学习

我遇到了同样的问题。 我解决了它只是排除了 class 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) 
    }
}