Provider状态更新后UI不刷新是怎么回事?

上官景源 阅读 5

我在用Flutter的Provider做状态管理,修改了数据但页面没重新构建,明明调用了notifyListeners()啊。

我的模型类是这样写的:

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

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

在Widget里用Consumer包裹了Text,但点击按钮后数字就是不更新,是不是哪里漏了?

我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
Prog.佳沫
这个坑我也踩过,Provider不刷新最常见的有三个原因,你挨个检查下:

第一个是Consumer的位置不对,必须包裹需要更新的widget,不能只包父组件。比如这样写是对的:
Consumer<CounterModel>(
builder: (context, model, child) {
return Text('${model.count}');
},
)


第二个是没在顶层用ChangeNotifierProvider。你得确保widget树顶层有这样的代码:
ChangeNotifierProvider(
create: (_) => CounterModel(),
child: MyApp(),
)


第三个是用了context不对。如果在回调里调用notifyListeners(),得确保context是同一个。可以试试把context存成成员变量或者用Provider.of(context, listen: false)来调用方法。

另外检查下是不是在build方法里创建了新的model实例,这样每次都会覆盖状态。Provider应该在widget树顶层初始化一次就行。
点赞
2026-03-09 18:22