Flutter中用Provider更新列表后UI不刷新怎么办?

上官贝贝 阅读 2

我用Provider管理一个商品列表,调用notifyListeners()之后界面没变化,明明数据已经改了啊!

试过把Consumer包到最外层,也检查了是不是在异步回调里忘了setState,但还是不行。这是我的状态类简化版:

class CartModel extends ChangeNotifier {
  List<String> items = ['苹果', '香蕉'];

  void addItem(String item) {
    items.add(item);
    notifyListeners(); // 这里调用了但UI不动
  }
}
我来解答 赞 0 收藏
二维码
手机扫码查看
1 条解答
钰岩
钰岩 Lv1
这问题我遇到过,Provider的坑之一。问题出在你的items是直接修改的数组引用,按照规范应该创建一个新数组。Flutter的widget是通过浅比较来判断是否更新的。

改下你的addItem方法:

void addItem(String item) {
items = [...items, item]; // 创建新数组
notifyListeners();
}


Provider官方文档里有提到这点(虽然藏得比较深),状态更新必须返回新对象而不是修改原对象。这跟React的setState一个道理。

如果还不行,建议检查:
1. 确保整个widget树都被Provider包裹了
2. 确认你用的是ChangeNotifierProvider不是普通的Provider
3. 有时候热重载会抽风,试试完全重启应用

妈的,这种引用问题浪费过我两小时,Flutter的响应式有时候真让人头大。
点赞
2026-03-07 15:19