我遇到了一个问题:我有一个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
值实例化。