我正在学习作曲,下面的代码来自文章
作者只用var toolbarTitle by remember { mutableStateOf("Home") }
作为标题,有必要吗?
我认为var toolbarTitle= mutableStateOf("Home")
是足够的,对吗?
<源代码/strong>
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
JetpackComposeScaffoldLayoutTheme {
// A surface container using the 'background' color from the theme
Surface(color = MaterialTheme.colors.background) {
var toolbarTitle by remember {
mutableStateOf("Home")
}
val scaffoldState =
rememberScaffoldState(rememberDrawerState(initialValue = DrawerValue.Closed))
val scope = rememberCoroutineScope()
Scaffold(
modifier = Modifier.background(Color.White),
scaffoldState = scaffoldState,
topBar = {
AppToolbar(
scaffoldState = scaffoldState,
scope = scope,
toolbarTitle = toolbarTitle
)
}, drawerContent = {
DrawerContent(scaffoldState = scaffoldState, scope = scope)
},
...
)
}
}
}
}
}
如果您不使用remember
,该值将在每次重组时再次重置为Home
,使用remember
,即使在重组后,该值也将持续存在
顺便说一下,重组是指当可组合内容再次呈现时,当屏幕上的内容发生变化并需要再次呈现时,这种情况会发生很多次
我认为,如果文章来自知名来源,该变量可能在项目中有一些进一步的用途。将变量初始化为MutableState
的真正原因是开发人员希望在更改此值时发生重组。
如果不是这样,可以直接使用var title = "Home"
,或者直接使用"Home"在参数中,根本不需要变量。您可以看到,如果要创建MutableState
,在大多数情况下,不使用remember
来声明它是没有用的。事实上,我能想到的唯一的场景,声明一个MutableState
而不记得是手动触发重组使用var
作为触发器。
无论如何,大多数情况下,您希望读取声明为MutableState
的var
的值。如果对var
的值进行了任何修改,则触发重组。现在,如果您在没有任何remember
的情况下声明它,那么该值将被重新初始化为您提供的初始值。更新后的值是一去不复返了。
因此,在最新版本的编译器中,我认为它甚至不允许您在不使用remember的情况下创建MutableState
var。如果不是编译时错误,我相信它至少会给出一个警告(尽管我几乎可以肯定它不会允许您编译,这让我认为Compose Developers不希望我们触发假的重组!)
PS:重组也可以通过使用remember
手动触发,所以我猜这不是他们的座右铭。
如果你想在以后的代码中更改toolbarTitle
,你将不得不使用remember { mutableStateOf("Home") }
如果它总是应该是"Home"你可以直接使用val toolbarTitle = "Home"
或者使用"Home"直接在AppToolbar()