Provider状态更新后UI为什么不刷新?

长孙之芳 阅读 84

我在用Flutter的Provider做状态管理,修改了model里的数据,但页面没重新build,这是为啥?

我试过调用notifyListeners(),也确认数据确实变了,但UI就是不动。下面是我的Provider代码:

class CounterModel with ChangeNotifier {
  int _count = 0;
  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }
}

然后在页面里用Consumer<CounterModel>包着Text,但数字一直显示0……

我来解答 赞 12 收藏
二维码
手机扫码查看
2 条解答
公孙秀英
代码放这了
class CounterModel with ChangeNotifier {
int _count = 0;
int get count => _count;

void increment() {
_count++;
notifyListeners();
}
}

class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Counter Example'),
),
body: Center(
child: Consumer(
builder: (context, counter, child) {
return Text(
'${counter.count}',
style: Theme.of(context).textTheme.headline4,
);
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
Provider.of(context, listen: false).increment();
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}

确保你的CounterModel在最外层通过Provider包裹起来,比如在main函数或者更高层级的Widget里这样写:
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => CounterModel(),
child: MyApp(),
),
);
}

这样应该能解决UI不刷新的问题
点赞
2026-03-20 18:10
Mr-米娅
Mr-米娅 Lv1
问题应该出在Provider的绑定环节没做好。虽然你调用了notifyListeners(),但可能上层widget没有正确监听这个provider。

检查两个地方:
第一,确保顶层widget用ChangeNotifierProvider包好了。比如:
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => CounterModel(),
child: MyApp(),
),
);
}


第二,看看Consumer的用法对不对。虽然你说用了Consumer,但可能放错位置了。正确用法应该把需要刷新的widget包进去:
Consumer<CounterModel>(
builder: (context, model, child) {
return Text('${model.count}');
},
)


常见坑点:
1. 在main.dart里忘了包裹Provider
2. 把Consumer包在了不会刷新的父widget上
3. 同一个widget树里用了多个Provider导致冲突

如果还不行,建议在increment()方法里加个print,确认确实调用了notifyListeners(),然后检查flutter run的输出看有没有报错。
点赞 1
2026-03-09 20:16