好的,我正在用flutter做一个媒体播放器应用。现在当我按下播放按钮时,它变成了暂停按钮。(只有按钮上的图标改变)
按钮的onPressed函数改变布尔值,并调用 setState()
方法。
它是这样的。
bool _playing = false;
void _onPlayButtonPressed() {
setState () {
if (_playing)
_playing = false;
else
_playing = true;
}
}
我还有一个函数,它基于 _playing
.
Widget _playButtonIcon() {
//This function has no setState() call
if (_playing)
//return pause icon
else
//return play icon
}
一切正常。每当我按下按钮时,图标就会改变。然而,正如文档中提到的,也在Flutter Demo App中提到的。setState()
方法调用构建方法。这将重绘整个部件树,包括完全不变的子部件。
这种方法是合理的还是矫枉过正?
我是否必须将按钮放在不同的有状态的widget类上,然后再通过 setState()
每当我点击这个playButton的时候?
如果我有其他的widgets也会改变UI的状态,怎么办?可能会改变不同的小部件?
怎样才能在不影响性能的情况下做到这一点呢?
创建一个播放按钮,它是一个自己的小部件,有一个保持它是否在播放的状态,这绝对是有意义的。现在,当你在父部件上调用setState时,它确实会调用构建方法,但据我所知,它不一定会从头开始重新绘制一切。如果在一些嵌入的widget中没有发现变化,它不会重新绘制它们,因为它们已经在widget树中了。最后,调用setstate是可以的,但是如果你的应用程序开始变得更大,你发现自己在太多地方调用set state,并且想要使用全局键,我建议研究一下Provider包,并利用ChangeNotifierConsumer模式。