我有一个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中提供字符串资源不会有任何问题.

Kotlin相关问答推荐

来自SnapshotFlow的单元测试StateFlow仅发出initialValue

用浮点数或十进制数给出错误答案的阶乘计算

导入org.gradle.jvm.toolchain.internal.JavaToolchainFactory未解析引用:Java工具链工厂

Kotlin异步不并行运行任务

如何定义一个函数来接受任何具有特定字段的数据类

列表在 android WebView 中没有正确迭代

为什么在 Kotlin 中调用私有构造函数会导致错误为无法访问 是什么?

T except one class

如何在 IntelliJ 中更改 Kotlin 的this property has a backing field代码编辑器突出显示?

无法删除部分子项.这可能是因为进程打开了文件或将其工作目录设置在目标目录中

如何在 Kotlin 中使用 volatile

调用单元测试验证伴随对象方法

在 Scaffold Jetpack Compose 内的特定屏幕上隐藏顶部和底部导航器

使用 clear() 删除 EncryptedSharedPreferences 不起作用

如何在 Android Studio 3.1.3 中查看 Kotlin 中有趣的源代码?

在用Kotlin编写的Android库公共API中处理R8+JvmStatic Annotation+Lambda

如何将 Kotlin 日期中的字符串或时间戳格式化为指定的首选格式?

通过在 kotlin-gradle 中使用子项目Unresolved reference: implementation

Kotlin反射不可用

Kotlin - 为什么我会得到 KotlinNullPointerException