我已经重构了用Kotlin编写的代码的某些部分,并且倾向于将url放在strings.xml中,但是当我想在翻新的注释部分中指向strings.xml文件中的字符串时,我得到了以下错误。
注释参数必须是编译时常量
这是我的代码:
interface SampleApiService {
@GET(Resources.getSystem().getString(R.string.sample_url))
fun getSamples(){
}
}
谁能告诉我出什么问题了吗?
在以下帖子中找到了答案。
答案 0 :(得分:1)
如文档所述,它将在构建时编译您的应用程序资源。注释处理在编译时进行。因此,您看到无法将资源字符串传递给注释
Android SDK工具将您的应用程序资源编译为 应用程序二进制文件在构建时。
相反,创建静态字符串变量并将其传递给注释
答案 1 :(得分:0)
基于提供的示例-最好只使用静态URL。为了避免使用任何运行时值并能够在运行时对其进行更改,将需要对此进行类似的注释:
@GET("{path}")
fun getSamples(@Path("path") path: String) {}
然后可以在运行时从字符串资源加载任何String path
。当基本URL发生更改时,可能需要重新配置客户端。这是因为注释处理器正在使用此interface
定义从其生成抽象层-在编译时,而不是在运行时...采用投诉文字时,它必须看起来像这个:
@GET(Constants.SOME_PATH)
fun getSamples() {}
但是与String
的硬编码相比并没有什么进步,因为以后无法更改。
答案 2 :(得分:0)
问题解决了, Tnx到Retrofit 2 - Dynamic URL
我不得不使用另一个改型的注释标记。
新功能:@Url参数注释允许传递端点的完整URL。
这是结果:
interface SampleApiService {
@GET
fun getSamples(
@Url url: String =
Resources.getSystem().getString(R.string.sample_url)
)
: Deferred<ArrayList<Sample>>
}