我只需要在脚手架的标题中使用remember吗?



我正在学习作曲,下面的代码来自文章

作者只用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作为触发器。

无论如何,大多数情况下,您希望读取声明为MutableStatevar的值。如果对var的值进行了任何修改,则触发重组。现在,如果您在没有任何remember的情况下声明它,那么该值将被重新初始化为您提供的初始值。更新后的值是一去不复返了。

因此,在最新版本的编译器中,我认为它甚至不允许您在不使用remember的情况下创建MutableStatevar。如果不是编译时错误,我相信它至少会给出一个警告(尽管我几乎可以肯定它不会允许您编译,这让我认为Compose Developers不希望我们触发假的重组!)

PS:重组也可以通过使用remember手动触发,所以我猜这不是他们的座右铭。

如果你想在以后的代码中更改toolbarTitle,你将不得不使用remember { mutableStateOf("Home") }

如果它总是应该是"Home"你可以直接使用val toolbarTitle = "Home"或者使用"Home"直接在AppToolbar()

最新更新