You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为mutableStateOf变量设置strings.xml中的默认文本?

问题:Jetpack Compose中为可变状态设置字符串资源默认值

我开发了一款Android应用,希望将硬编码文本提取到strings.xml中实现国际化。以下是初始可正常运行的代码,但文本为硬编码形式:

@Composable
fun MainMenu(buttons: List<MenuButtonMessage>, modifier: Modifier = Modifier) {
    var currentTab = rememberSaveable { mutableStateOf("Nothing Selected") }

    Column{
        Row{
            LazyRow(horizontalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.weight(1f))
            {
                items(buttons)
                {
                    b ->
                    MenuButton(b, currentTab)
                }
            }
            Spacer(modifier = Modifier.width(8.dp))
            Text("Select a project")
        }
        Spacer(modifier = Modifier.height(8.dp))

        Text(currentTab.value)
    }
}

将"Select a project"提取为字符串资源的操作正常,但对"Nothing Selected"执行相同操作时,Android Studio自动添加的context在mutableStateOf中出现“未解析引用”错误:

@Composable
fun MainMenu(buttons: List<MenuButtonMessage>, modifier: Modifier = Modifier) {
    var currentTab = rememberSaveable { mutableStateOf(context.getString(R.string.nothing_selected)) }

    Column{
        Row{
            LazyRow(horizontalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.weight(1f))
            {
                items(buttons)
                {
                    b ->
                    MenuButton(b, currentTab)
                }
            }
            Spacer(modifier = Modifier.width(8.dp))
            Text(stringResource(R.string.select_a_project))
        }
        Spacer(modifier = Modifier.height(8.dp))

        Text(currentTab.value)
    }
}

请问如何将该可变字符串的默认值设置为strings.xml中的内容?


解决方案

方法1:在rememberSaveable外部获取字符串资源

rememberSaveable的初始化lambda不属于Composable作用域,无法直接调用stringResource或访问context。可以先在Composable作用域内获取字符串资源,再传入rememberSaveable:

@Composable
fun MainMenu(buttons: List<MenuButtonMessage>, modifier: Modifier = Modifier) {
    // 在Composable作用域内获取字符串资源
    val defaultTabText = stringResource(R.string.nothing_selected)
    var currentTab = rememberSaveable { mutableStateOf(defaultTabText) }

    Column{
        Row{
            LazyRow(horizontalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.weight(1f))
            {
                items(buttons) { b ->
                    MenuButton(b, currentTab)
                }
            }
            Spacer(modifier = Modifier.width(8.dp))
            Text(stringResource(R.string.select_a_project))
        }
        Spacer(modifier = Modifier.height(8.dp))

        Text(currentTab.value)
    }
}

方法2:使用LocalContext.current获取上下文

如果需要直接在rememberSaveable的初始化块中访问上下文,需先通过LocalContext.current获取上下文实例(需在Composable作用域内执行此操作):

@Composable
fun MainMenu(buttons: List<MenuButtonMessage>, modifier: Modifier = Modifier) {
    val context = LocalContext.current
    var currentTab = rememberSaveable { 
        mutableStateOf(context.getString(R.string.nothing_selected)) 
    }

    // 后续布局代码与原代码一致
}

注意事项

  • rememberSaveable的初始化lambda是普通函数,不是Composable函数,因此不能在其中直接调用stringResource这类Composable API。
  • 确保strings.xml中已正确添加对应的字符串资源:
    <string name="nothing_selected">Nothing Selected</string>
    <string name="select_a_project">Select a project</string>
    

内容的提问来源于stack exchange,提问作者Brian Heward

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:05:11