如何在Avatar类属性变化时刷新Flutter Widget组件?
解决Avatar静态属性变更时刷新Widget的直接方法
要让Info1和Info2感知到Avatar.val的变化并自动刷新,最直接的方式是用Flutter自带的ValueNotifier来管理状态,它能在值变更时主动通知监听者,触发Widget重建。
具体改造步骤:
- 重构Avatar类,用ValueNotifier管理状态
把原来的静态int属性替换为ValueNotifier<int>,周期性任务更新其value属性:
import 'dart:async'; import 'package:flutter/material.dart'; class Avatar { static final ValueNotifier<int> valNotifier = ValueNotifier(0); static void periodicTendencyValueChange() { Timer.periodic(const Duration(seconds: 90), (timer) { valNotifier.value++; }); } }
- 修改Info1和Info2的State类,添加状态监听
在State的生命周期中注册valNotifier的监听,值变化时调用setState触发Widget重建,同时在销毁时移除监听避免内存泄漏:
Info1改造后代码:
class Info1 extends StatefulWidget { Info1({super.key }); @override Info1Impl createState() => Info1Impl(); } class Info1Impl extends State<Info1> { late final VoidCallback _valueChangeListener; @override void initState() { super.initState(); // 注册监听:值变化时触发setState _valueChangeListener = () => setState(() {}); Avatar.valNotifier.addListener(_valueChangeListener); } @override void dispose() { // 移除监听,释放资源 Avatar.valNotifier.removeListener(_valueChangeListener); super.dispose(); } @override Widget build(BuildContext context) { return Text(Avatar.valNotifier.value.toString()); } }
Info2改造后代码:
class Info2 extends StatefulWidget { Info2({super.key }); @override Info2Impl createState() => Info2Impl(); } class Info2Impl extends State<Info2> { late final VoidCallback _valueChangeListener; @override void initState() { super.initState(); _valueChangeListener = () => setState(() {}); Avatar.valNotifier.addListener(_valueChangeListener); } @override void dispose() { Avatar.valNotifier.removeListener(_valueChangeListener); super.dispose(); } @override Widget build(BuildContext context) { return Text((Avatar.valNotifier.value + 1).toString()); } }
说明
这种方案完全基于Flutter核心API实现,无需引入第三方状态管理库,逻辑简洁直接。每当valNotifier.value更新时,所有注册了监听的State都会收到通知,通过setState触发对应Widget的重建,确保显示内容与最新值同步。
内容的提问来源于stack exchange,提问作者user21161308
相关产品推荐
相关产品推荐

