setState在initState上声明时没有更新变量



我遇到了一个问题:我有一个navbar,根据所选的项目,返回给我一个称为索引的整数。然后通过List传递该索引以获得Scaffold (Widget()类的对象)的主体内容。

默认主体是HomePage()的一个对象,它有一个名为rpm的整数参数。默认情况下,HomePage()应该是显示的主体,因此,由于它取决于rpm参数,我在initState上声明了rpm参数。我也有一个setState,动态地改变rpm

奇怪的是:如果我在initState中声明List<Widgets> bodyList,setState似乎不起作用。然而,如果我在构建方法中声明List<Widgets> bodyList,我可以看到HomePage()的内容随着rpm动态变化。

代码的摘录。不工作:

class _ScreenTreeState extends State<ScreenTree> {
int _index;
int _rpm;
List<Widget> bodyList;
@override
void initState() {
_isPlaying = false;
_rpm = 0;
_index = 0;
bodyList = [
HomePage(rpm: _rpm),
StatisticsScreen(),
WeightScreen(),
SettingsPage()
];
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(...

工作:

class _ScreenTreeState extends State<ScreenTree> {
int _index;
int _rpm;
List<Widget> bodyList;
@override
void initState() {
_isPlaying = false;
_rpm = 0;
_index =
0;
super.initState();
}
@override
Widget build(BuildContext context) {
bodyList = [
HomePage(rpm: _rpm),
StatisticsScreen(),
WeightScreen(),
SettingsPage()
];

return Scaffold(...

我的理论是,这可能与以下事实有关:如果_rpm被声明为整数,Dart将其读取为原语而不是整数类的对象,因此,如果在initState上声明,我实际上不是传递对象,而是传递原语。但是我不明白为什么它在build方法中声明时工作。

我觉得这是无关紧要的,但如果有人需要它,这里是更新_rpm值的代码。请不要读太多,因为我觉得这实际上是不相关的,可能会分散注意力和混淆,而不是帮助:

onPressed: () {
if (_isPlaying) {
setState(() {
_isPlaying = false;
});
Provider.of<MicrophoneEngine>(context, listen: false)
.stopRecording();
} else {
setState(() {
_isPlaying = true;
});
Provider.of<MicrophoneEngine>(context, listen: false)
.startRecording((rpmCall) {
setState(() {
_rpm = rpmCall;
});
});
}
},

保留小部件的引用(如第一个示例)是一个不好的做法,实际上,您根本不需要那个List。

每次使用setState时,您都会重新构建小部件并传递新值。在第一个例子中,您每次都从init传递HomePage(rpm: _rpm),这就是为什么它没有更新。这意味着,你不重建HomePage与更新的值,你只是传递HomePage从initState与0的初始_rpm值实例化。

最新更新