【问题标题】:Unresolved reference : retrofit while creating retrofit instance未解决的参考:在创建改造实例时改造
【发布时间】:2021-11-11 01:57:48
【问题描述】:

我正在开发一个请求火星照片并使用它在屏幕上显示的 Android 应用程序。 发出请求。并尝试使用公开延迟初始化改造服务的公共 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"
}
}

对象 MarsApi 内的代码第 17 行弹出错误未解决的参考:改造。对 Retrofit 对象的 create() 函数调用成本很高,并且应用程序只需要一个 Retrofit API 服务实例。所以,我使用对象声明将服务暴露给应用程序的其余部分。

我尝试过的:

如果我将对象 MarsApi 中的代码带出,代码就可以工作,但这样做可能会导致多个改造实例。

【问题讨论】:

    标签: android-studio kotlin retrofit


    【解决方案1】:

    代码1

    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)
            }
        }
    }
    

    代码2

    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 bylazy reference notsolved cause of retrofit is property of class,在全局范围内移动 retrofit,就像使用 (Companion) object 或类似 code2 (最高等级?)

    【讨论】:

    • 查看上面的链接,它是关于如何使用改造的官方教程。这是怎么回事。
    • 嘿,谢谢你,我在一个类中编写了整个代码,你的代码 2 帮助我弄清楚了。非常感谢
    【解决方案2】:

    希望this link

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

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2015-12-02
      • 2022-09-23
      • 2019-06-01
      • 1970-01-01
      相关资源
      最近更新 更多