You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter长按收藏图标后列表需二次交互才更新问题求助

问题解决:长按收藏项后列表需二次交互才更新

问题出在嵌套的ListView结构上:你在FavouritesPage里用了外层ListView包裹内层ListView.builder,这种嵌套搭配shrinkWrap: true会导致状态更新时,内层列表无法立即感知到数据变化,需要二次交互触发重建。

修改方案

直接移除内层的ListView.builder,将收藏项通过map转换为ListTile,直接作为外层ListView的子项:

class FavouritesPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var appState = context.watch<MyAppState>();
    var favourites = appState.favourites;

    if (favourites.isEmpty) {
      return Center(
        child: Text('No favourites yet.'),
      );
    }

    return ListView(
      children: [
        Padding(
          padding: const EdgeInsets.all(20),
          child: Text('You have '
              '${favourites.length} favourites:'),
        ),
        // 直接生成ListTile,无需嵌套ListView
        ...favourites.map((pair) {
          return ListTile(
            leading: GestureDetector(
              child: Icon(Icons.favorite),
              behavior: HitTestBehavior.translucent,
              onLongPress: () {
                appState.toggleFavorite(pair);
              },
            ),
            title: Text(pair.asLowerCase),
          );
        }).toList(),
      ],
    );
  }
}

额外说明

你的toggleFavorite方法逻辑是正确的,notifyListeners()也正确触发了状态更新,但嵌套ListView的渲染机制导致列表没有即时刷新。移除嵌套后,外层ListView会直接响应Provider的状态变化,长按删除后列表会立刻更新。

内容的提问来源于stack exchange,提问作者RabbitRun47

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:22:51