kotlin 是否可以通过从密封类调用字符串资源来获取它的实际值?

j1dl9f46  于 2022-11-16  发布在  Kotlin
关注(0)|答案(1)|浏览(117)

我想在顶栏中向我的应用添加字符串资源,但当我调用它时,出现了一个数字,并且由于它是一个密封类,因此不允许我实现stringResourcegetString
第一个

我没有直接输入字符串,因为在浏览窗口时顶栏会更改名称,我希望它是个性化的。
这是一段通过窗口改变标题的代码,如果它能工作,但是它得到了窗口路径的名称,我看到的唯一解决方案是给路径分配一个字符串资源来定制它。

zkure5ic

zkure5ic1#

您可以从backStackEntry捕获返回值,并使用它通过when检查Destination的route参数,然后让它返回显式String

var title by remember {
    mutableStateOf("")
}

LaunchedEffect(Unit){
     navController.currentBackStackEntryFlow.collect {
        title = it.destination.route.let { route ->
            when (route) {
                Destinations.Translate.route -> {
                     "Translate"
                }
                Destinations.Words.route -> {
                     "Words"
                }
                Destinations.Numbers.route -> {
                    "Numbers"
                } else -> {
                    "" // empty or your default title bar
                }
            }
        }
    }
}

TopAppBar(
    title = {
        Text(text = title)
    }
)

也可以向Destination密封类添加一个附加参数

sealed class Destinations(
    @StringRes val stringRes: Int,
    val route: String,
    val title: String,
    val icon: ImageVector
) {
    object Translate: Destinations(R.string.translate_title, ...)
    object Words: Destinations(R.string.words_title, ...)
    object Numbers: Destinations(R.string.numbers_title, ...)
}

在LaunchEffect调用中

...

val context = LocalContext.current

LaunchedEffect(Unit){
    navController.currentBackStackEntryFlow.collect {
        title = context.getString(it.destination.route.let { route ->
            when (route) {
                Destinations.Translate.route -> {
                    Destinations.Translate.stringRes
                }
                Destinations.Words.route -> {
                    Destinations.Words.stringRes
                }
                Destinations.Numbers.route -> {
                    Destinations.Numbers.stringRes
                }
                else -> {
                    // empty or your default/initial title
                    Destinations.Translate.stringRes
                }
            }
        })
    }
}

...

相关问题