当前位置: 首页 > 知识库问答 >
问题:

flutter中,有一个集合,改变集合对象的某一个属性后,为什么列表未更新?

邹祺
2025-04-14

有一个List<Goods>Goods只有两个属性,一个isCollection表示是否收藏,一个goodsName表示名称。

业务场景是,前端有一个List<Goods>是配置好的,只是商品的isCollection是否收藏需要通过后端接口返回,我在initState()里面调用api接口,在接口中修改某一行的isCollection但是页面没有刷新,请问怎么回事?

代码如下:

/// 商品类
class Goods {
  Goods(this.isCollection, this.goodsName);
  bool isCollection;
  String goodsName;
}

/// 需要提供状态管理的对象
class GoodsListProvider with ChangeNotifier {
  final List<Goods> _goodsList = List.generate(
    10,
    (index) => Goods(false, 'Goods No. $index'),
  );

  get goodsList => _goodsList;
  get total => _goodsList.length;
    
  /// 修改商品的 isCollection 属性;
  collect(int index) {
    var goods = _goodsList[index];
    _goodsList[index] = Goods(!goods.isCollection, goods.goodsName);
    notifyListeners();
  }
}

/// 页面组件
class GoodsListScreen extends StatefulWidget {
  const GoodsListScreen({super.key});

  @override
  State<GoodsListScreen> createState() => _GoodsListScreenState();
}

class _GoodsListScreenState extends State<GoodsListScreen> {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (_) => GoodsListProvider(), // 需要共享的数据资源
      child: Scaffold(
        appBar: AppBar(title: Text('Selector demo 页面')),
        body: Center(child: ListPage()),
      ),
    );
  }
}

class ListPage extends StatefulWidget {
  const ListPage({super.key});

  @override
  State<ListPage> createState() => _ListPageState();
}

class _ListPageState extends State<ListPage> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    
    /// 调用api接口
    Future.microtask(() {
      getSideBarSummary();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Selector<GoodsListProvider, List<Goods>>(
      selector: (context, provider) => provider.goodsList,
      builder: (context, list, child) {
        return Column(
          children:
              list
                  .map(
                    (item) => Row(
                      children: [
                        Text(item.goodsName),
                        Icon(
                          item.isCollection ? Icons.star : Icons.star_border,
                        ),
                      ],
                    ),
                  )
                  .toList(),
        );
      },
    );
  }
  
  /// api接口,延迟2s,模拟修改数据
  Future<void> getSideBarSummary() async {
    /// 请求api接口,更新统计数据
    try {
      // 模拟网络延迟
      await Future.delayed(Duration(seconds: 2));

      if (!mounted) return;

      print(111);
      Provider.of<GoodsListProvider>(context, listen: false).collect(2);
      print(111222);
    } catch (e) {
      print('Error in mock network data: $e');
    }
  }
}

共有1个答案

隗星驰
2025-04-14
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (_) => GoodsListProvider(),
      child: MaterialApp(
        home: GoodsListScreen(),
      ),
    );
  }
}

// GoodsListScreen不再创建Provider
class GoodsListScreen extends StatefulWidget {
  @override
  State<GoodsListScreen> createState() => _GoodsListScreenState();
}

class _GoodsListScreenState extends State<GoodsListScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Selector demo 页面')),
      body: Center(child: ListPage()),
    );
  }
}

或者:

collect(int index) {
  _goodsList[index].isCollection = !_goodsList[index].isCollection;
  notifyListeners();
}
 类似资料:
  • 我想使用JaVers来跟踪我的Java对象的更改。基本示例工作正常,但我无法让它检测存储在集合中的对象的更改。 如果我扩展ChangeLogExample。更改例如其中一个子坐标的课堂示例: 这是打印的更改日志: 因此,第一个下属的年龄变化不会显示在变更日志中。 使用withChildValueObjects()没有什么不同。 当我单独将更改提交给员工实例时,我会得到学员年龄的更改,但这不是我想要

  • 我正在评估javers,以便将其用于审计实体。我有一个嵌套的ValueObject集合的实体。我希望值对象上的每个属性更改都会生成实体的快照。只有在将值对象添加到集合中时才会创建快照。在我的例子中,我向集合添加了两个值对象,创建了实体的两个快照。第三次,我只是改变了value对象的一个属性,javers没有意识到这是对实体的改变,而是为内部value对象创建了一个快照。 我的问题是我的假设是否有效

  • 我所处的情况是,当用户付款时,存储在Firestore集合(CartProducts)中的购物车产品应移动到名为SuccessFullOrders的新集合。 因此,我的基本问题是如何在Flutter中将所有文档从一个集合移动到Firestore的另一个集合 我不知道如何在flutter中编写代码。谢谢你的回答 这是我的代码

  • 我只是问是否有一个替代的方式为下面的更新。 更新test_table集 col 1=trim(col1), col 2=trim(col2), col 3=trim(col3), col 4=trim(col4), col 5=trim(col5), 在我的真实表中,大约有20列,也许更多。有没有一个快速的方法,我可以修剪所有的柱子在一个镜头? 查找类似查询(如果存在): update test_

  • 本文向大家介绍写一个方法js将数组对象中某个属性值相同的对象合并成一个新对象相关面试题,主要包含被问及写一个方法js将数组对象中某个属性值相同的对象合并成一个新对象时的应答技巧和注意事项,需要的朋友参考一下 function Dog(name,age){ this.name=name; this.age=age; };

  • 我有一个像这样的对象: 我需要从转换为,所以我尝试了以下方法: 这显然是在上给了我一个错误,因为在类上没有具有单个的构造函数 如何映射的两个属性来创建新的,然后将所有这些属性收集到

  • 问题内容: 我想使用Java 8技巧在一行中执行以下操作。 给定此对象定义: 和a ,我想得到a ,它是第一个列表中所有s对象的列表- 顺序相同。 我可以使用Java中的循环来做到这一点,但我相信Java8中应该有一个单行lambda可以做到这一点。我无法在线找到解决方案。也许我没有使用正确的搜索词。 有人可以为这种转换建议一个lambda或另一种线吗? 问题答案: 这应该可以解决问题: 也就是说

  • 我可以在Java中使用循环来实现这一点,但我认为在Java8中应该有一个一行程序lambda来实现这一点。我无法在网上找到解决方案。也许我没有使用正确的搜索词。 有人能为这个转换提出一个lambda或另一个一行程序吗?