如何为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
相关产品推荐
相关产品推荐

