问题是创建计时器会创建必须处置的资源,因此您的小部件实际上是有状态的,而不是无状态的。具体来说,该
build方法可以每秒调用60次(如果平台为120fps
,则可以调用更多次)。少就是优化。
您的代码中有一个非常关键的错误-该
build方法每次调用都会创建一个新的Timer。而且由于您的计时器永远不会取消,因此您可以将数百个或数千个事件调度到商店。
为了避免出现这种情况,该框架提供了一个
State类,并带有
initStateand
dispose生命周期。该框架承诺,如果它重建您的小部件,它将不会调用
initState多次,并且会始终调用
dispose。这样,您就可以一次创建一个计时器,并在随后的调用中重新使用它
build。
例如,您可以将您的大部分逻辑移至“州”,如下所示。将refreshRate保留在小部件上,您甚至还可以使用
didUpdateWidget生命周期取消和更新计时器。
class AnniversaryHomePage extends StatefulWidget { @override State createState() => new AnniversaryHomePageState();}class AnniversaryHomePageState extends State<AnniversaryHomePage> { Timer _timer; @override void initState() { _timer = new Timer.periodic(widget.refreshRate, (Timer timer) => _updateDisplayTime(inheritedWidget)); super.initState(); } @override void dispose() { _timer.cancel(); super.dispose(); } @override Widget build(BuildContext context) { ... }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)