Jetpack Compose的Scaffold中仅用作标题的变量是否需要加remember?
你的想法是不正确的,两个写法的差异和注意事项如下:
核心差异说明
1. 你提到的var toolbarTitle= mutableStateOf("Home")是错误写法
Composable 函数每次触发重组时,函数体内的所有代码都会重新执行。如果没有用remember包裹mutableStateOf,每次重组都会生成新的MutableState实例,之前保存的状态会直接丢失。就算你完全不需要修改标题值,这种写法也会造成不必要的对象创建,存在性能损耗。
2. by是Kotlin属性委托语法糖,非强制但推荐使用
如果不用by,正确的无语法糖写法是:
// 注意这里是val,因为MutableState实例本身不需要被修改,变化的是它内部的value属性 val toolbarTitle = remember { mutableStateOf("Home") }
这种写法下,你读取值必须显式调用.value,赋值也需要写.value:
- 取值:
Text(text = toolbarTitle.value) - 赋值:
toolbarTitle.value = "新标题"
而用by的写法,编译器会自动帮你处理.value的读写逻辑,你可以直接把toolbarTitle当成普通String变量操作,代码更简洁易读:
var toolbarTitle by remember { mutableStateOf("Home") }
- 取值:
Text(text = toolbarTitle) - 赋值:
toolbarTitle = "新标题"
两种写法运行效果完全一致,差异仅在代码书写形式上。
3. 静态标题场景的优化
如果你确定这个工具栏标题全程都不会修改,其实连mutableStateOf都不需要用,直接写val toolbarTitle = "Home"即可,不需要状态包裹,性能最优。
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

