我遇到了Flutter的一个问题:我有一个问题navbar
,根据选择的项目,它会给我返回一个称为Index的整数。然后,该索引通过List传递,以获取Scaffold主体(Widget()
类的对象)的内容。
默认主体是的对象HomePage()
,具有一个名为的整数参数rpm
。默认情况下,HomePage()
应该是显示的正文,因此,由于它取决于rpm
参数,因此我在rpm
上声明了该参数initState
。我也有一个setState
动态变化的rpm
。
奇怪的是:如果我List<Widgets> bodyList
在initState中声明in,那setState
似乎就不起作用了。但是,如果List<Widgets> bodyList
在build方法中声明,则可以使用来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
,您都会重建小部件并传递新值。在第一个示例中HomePage(rpm: _rpm)
,每次都从init传递,这就是为什么它不更新的原因。意思是,您不必HomePage
使用更新后的值进行重建,而只是通过HomePage
initState传递了实例化,该实例化的初始_rpm
值为0
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句