我有一个Jetpack Compose
应用程序,它在任何地方都使用stringResource
,它在localization
上运行得很好.
但是,我有几个不是Composable
的函数,我想从resources
中检索字符串.当我try 在这些函数中使用stringResource
时,它告诉我它只能在Composable中使用.
那么,如果我不是一个可组合的函数,如何从资源中获取字符串呢?
我有一个Jetpack Compose
应用程序,它在任何地方都使用stringResource
,它在localization
上运行得很好.
但是,我有几个不是Composable
的函数,我想从resources
中检索字符串.当我try 在这些函数中使用stringResource
时,它告诉我它只能在Composable中使用.
那么,如果我不是一个可组合的函数,如何从资源中获取字符串呢?
不知道我是不是理解对了,是这样的吗?
@Composable
fun Composable() {
val context = LocalContext.current
NonComposable(context)
}
fun NonComposable(context: Context) {
context.resources.getString(R.id.someStringResource)
}
建议:您还可以定义一个sealed class
,它有两种类型,您可以在其中提供您想要的字符串参数,一个实际的String
value
和一个String
resource
,您可以在其中指定它们将如何被解析.这是我从一位YouTube Android开发人员那里得到的
UiText
个
sealed class UiText {
data class StringValue(val str: String): UiText()
class StringResource(
@StringRes val resourceId: Int,
vararg val args: Any
): UiText()
@Composable
fun asString(): String {
return when (this) {
is StringValue -> {
str
}
is StringResource -> {
stringResource(id = resourceId, formatArgs = args)
}
}
}
示例使用范围:
在您的ViewModel
中,您可以简单地提供字符串资源的id
var stringResourceVariable = UiText.StringResource(R.string.some_string_resource)
然后在你的Composable
viewModel.stringResourceVariable.asString()
you can simply invoke asString
and it will be resolved depending on what type of UiText
个 string you supplied.
使用这种方法的好处是,在您的ViewModel
中提供字符串资源不会有任何问题.