如果不在可组合函数中,如何获取 stringResource

Lil*_*oke 12 kotlin android-jetpack-compose android-compose-textfield

我有一个可以在任何地方Jetpack Compose使用的应用程序stringResource,并且非常适合localization.

但是,我有一些不是Composable函数的函数,我想从resources. 当我尝试stringResource在这些函数中使用时,它告诉我它只能在可组合项中使用。

那么,如果我不是可组合函数,如何从资源中获取字符串?

z.g*_*g.y 11

不知道我理解是否正确,但是是这样的吗?

@Composable
fun Composable() {

    val context = LocalContext.current
    val someString = NonComposable(context)
}

fun NonComposable(context: Context): String =
    context.resources.getString(R.string.app_name)
Run Code Online (Sandbox Code Playgroud)

建议:您还可以定义sealed class具有 2 种类型的 ,您可以在其中提供所需的字符串参数,一个是实际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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用范围示例:

在你的ViewModel位置你可以简单地提供字符串资源的id

var stringResourceVariable = UiText.StringResource(R.string.some_string_resource)
Run Code Online (Sandbox Code Playgroud)

然后在你的Composable

viewModel.stringResourceVariable.asString()
Run Code Online (Sandbox Code Playgroud)

您可以简单地调用asString,它将根据您提供的字符串类型进行解析UiText

采用这种方法的好处是,您在ViewModel.