我有一个使用了Jetpack Compose
的应用程序,到处都使用了stringResource
,并且为本地化
工作得很好。
但是,我有一些不是Composable
函数的功能,我想从资源
中检索字符串。当我尝试在这些函数中使用stringResource
时,它告诉我它只能在可组合函数中使用。
那么,如果我不是可组合函数,如何从资源中获取字符串呢?
我有一个使用了Jetpack Compose
的应用程序,到处都使用了stringResource
,并且为本地化
工作得很好。
但是,我有一些不是Composable
函数的功能,我想从资源
中检索字符串。当我尝试在这些函数中使用stringResource
时,它告诉我它只能在可组合函数中使用。
那么,如果我不是可组合函数,如何从资源中获取字符串呢?
我不确定是否理解正确,但是是这样吗?
@Composable
fun Composable() {
val context = LocalContext.current
val someString = NonComposable(context)
}
fun NonComposable(context: Context): String =
context.resources.getString(R.string.app_name)
sealed class
,其中可以提供您想要的字符串参数,一个实际的String
value
和一个String
resource
,您可以指定如何解决它们。
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()
您可以简单地调用asString
,它将根据您提供的UiText
字符串类型进行解析。
采用这种方法的好处是,在ViewModel
中提供字符串资源时不会出现任何问题。
context.resources.getString(R.string.myString)
。 - Gabriele Mariotti