如何在非组合函数中获取字符串资源(stringResource)?

10

我有一个使用了Jetpack Compose的应用程序,到处都使用了stringResource,并且为本地化工作得很好。

但是,我有一些不是Composable函数的功能,我想从资源中检索字符串。当我尝试在这些函数中使用stringResource时,它告诉我它只能在可组合函数中使用。

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


类似于 context.resources.getString(R.string.myString) - Gabriele Mariotti
是的,但是在不可组合的情况下如何获取上下文? - LilMoke
只是将它作为参数传递,例如。 - Gabriele Mariotti
是的,但是调用函数也不是可组合的,所以我无法获取上下文。实际上,我有一个类,我调用了一个实用函数来获取字符串,但是这个实用函数是可组合的,所以我无法从类中调用它。我想我可以将上下文传递给该类,但所有这些看起来都很混乱。 - LilMoke
1个回答

10

我不确定是否理解正确,但是是这样吗?

@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,其中可以提供您想要的字符串参数,一个实际的Stringvalue和一个Stringresource,您可以指定如何解决它们。 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中提供字符串资源时不会出现任何问题。


是的,这就是我现在正在做的事情。我之前没有上下文,因为它是从另一个不可组合的地方调用的。所以,我添加了变量并将其全部传递。我想我一直在寻找一种不必到处传递上下文的方法。无论如何,感谢您的回复。 - LilMoke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接