ListView.builder以某种方式缓存错误

时间:2019-06-26 18:04:45

标签: flutter

我有一个这样的ListView,但是当“ mats”的值更改时它不会更新。每当有我的垫子列表更新时,都会调用build函数。打印显示正确的数据,但ListView更新不正确。只有项目数更新正确。

颤振:MATS:[[8163b55b-9a4c-44e8-a95e-064b3f5e8a67,,26.06.2019,[],0.00 EUR]] 扑扑:MATS:[[8163b55b-9a4c-44e8-a95e-064b3f5e8a67,未命名,26.06.2019,[],0.00欧元]]

  Widget build(BuildContext context) {
    print('MATS: $mats');
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: mats.length == 0
          ? Center(
              child: Text('Add your first mat to start the party.'),
            )
          : mats != null
              ? ListView.builder(
                  key: Key('matsList'),
                  itemCount: mats?.length ?? 0,
                  itemBuilder: (context, index) {
                    final viewModel = mats[index];
                    return MatCardView(
                      key: Key('viewModel.toString()'),
                      viewModel: viewModel,
                      onSelect: onSelect,
                    );
                  })
              : Container(
                  child: Center(
                    child: Text('No beer mat yet'),
                  ),
                ),
    );
  }


1 个答案:

答案 0 :(得分:2)

每个项目的key都相同。它使Flutter感到困惑,因为它使用key来确定哪个UI元素用于哪个小部件。

尝试将每个列表项的键更改为唯一值。这是朝着这个目标迈进的一步,也许这行得通:

  Widget build(BuildContext context) {
    print('MATS: $mats');
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: mats.length == 0
          ? Center(
              child: Text('Add your first mat to start the party.'),
            )
          : mats != null
              ? ListView.builder(
                  key: Key('matsList'),
                  itemCount: mats?.length ?? 0,
                  itemBuilder: (context, index) {
                    final viewModel = mats[index];
                    return MatCardView(
                      key: Key("item$index"), // THIS LINE CHANGED
                      viewModel: viewModel,
                      onSelect: onSelect,
                    );
                  })
              : Container(
                  child: Center(
                    child: Text('No beer mat yet'),
                  ),
                ),
    );
  }

请注意上面唯一更改的行。也许Key(viewModel.toString())(不带引号)也可以工作,但我不知道您对此的实现。如果这不起作用,您也可以尝试。