Flutter如何使用GlobalKey保存Widget状态?当前场景为何不生效?
问题原因
你当前写法的核心问题是,当_showTimer为false时,TimerWidget被完全从组件树中移除,对应的组件State会触发dispose生命周期被销毁,下次切换为显示时是重新创建的新组件实例,自然会重置计时。
GlobalKey能复用组件状态的前提是对应组件始终存在于组件树中,仅在树内变更挂载位置,它没法保留已经被销毁的组件实例的状态。你之前用Opacity的方案能生效,本质是组件始终留在树内,只是透明度为0不可见,没有触发销毁逻辑。
修复方案
方案1:用
Offstage/Opacity控制显隐,保留组件在树中
把你父组件build里的条件渲染代码替换为:Offstage( offstage: !_showTimer, child: TimerWidget(key: _key), )Offstage相比Opacity性能更好,不可见时不会参与绘制流程,也不会响应点击事件,更适合显隐切换的场景。方案2:状态上移到父组件
如果不想让计时器组件常驻内存,可以把计时逻辑、剩余时间变量都放到父组件的State中管理,TimerWidget仅作为展示组件接收参数渲染,这样不管子组件是否销毁重建,数据都保存在父级不会丢失。
内容的提问来源于stack exchange,提问作者thanhbinh84
相关产品推荐
相关产品推荐

