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

Flutter中如何保存阅读状态并修改已点击ListTile的显示颜色?

Flutter ListTile点击后标记已读变色实现方案

你当前代码的问题是使用了全局的temp和temp_color变量,所有列表条目共用同一个状态,无法单独控制每个条目的已读样式。可按以下步骤修改:

1. 上层列表页维护已读标识集合

在存放ListView的页面State中,定义Set存储已点击过的通知的唯一标识:

// 上层ListView所在的State类中
// 存储已读通知的唯一标识,优先用通知id,没有的话用title+date组合
Set<String> readNotificationIds = {};

2. 修改NotificationTiles组件定义

新增isRead状态参数和点击回调参数,直接根据传入的已读状态设置背景色:

class NotificationTiles extends StatelessWidget {
  final String title, content, date;
  final bool enable;
  final bool isRead; // 新增:当前条目是否已读
  final VoidCallback onMarkRead; // 新增:点击后标记已读的回调

  const NotificationTiles({
    Key? key,
    required this.title,
    required this.content,
    required this.date,
    required this.enable,
    required this.isRead,
    required this.onMarkRead,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      // 已读显示灰色,未读显示白色
      color: isRead ? Colors.grey : Colors.white,
      child: ListTile(
        title: Column(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(title, style: TextStyle(color: Color(0xFF303030), fontSize:17, fontWeight: FontWeight.bold)),
            SizedBox(height: 5),
            Text(date, style: TextStyle(color: Colors.grey, fontSize:14,)),
          ],
        ),
        trailing: Icon(Icons.arrow_forward_ios, color: Colors.black,size: 15,),
        onTap: () {
          // 先标记为已读
          onMarkRead();
          // 再跳转详情页
          Navigator.of(context).push(MaterialPageRoute(
              builder: (context) => NotificationPage(
                  title: title, content: content, date: date)));
        },
        enabled: enable,
      )
    );
  }
}

3. 列表构建时传入对应参数

在ListView的itemBuilder中构建每个条目时,判断当前条目是否已读,同时传入标记已读的回调:

//  ListView的itemBuilder逻辑示例
itemBuilder: (context, index) {
  final item = notificationList[index];
  final uniqueId = '${item.title}_${item.date}'; // 没有唯一id时用组合标识
  return NotificationTiles(
    title: item.title,
    content: item.content,
    date: item.date,
    enable: true,
    isRead: readNotificationIds.contains(uniqueId),
    onMarkRead: () {
      // 点击后更新已读集合,刷新页面
      setState(() {
        readNotificationIds.add(uniqueId);
      });
    },
  );
}

如果需要APP重启后仍保留已读状态,可以把readNotificationIds集合序列化后存储到SharedPreferences中,APP启动时读取恢复即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:45:02