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

能否在Flutter消息应用的共享屏幕表单中显示常用联系人?

实现Flutter共享屏幕表单的常用联系人展示

完全可以实现类似WhatsApp、Messenger这类应用的常用联系人展示效果,以下是具体实现方案:

1. 定义常用联系人数据模型

首先创建联系人实体类,包含判断常用程度的核心字段:

class Contact {
  final String id;
  final String name;
  final String avatarUrl;
  final DateTime lastInteractionTime; // 最近互动时间
  final int interactionCount; // 互动次数

  Contact({
    required this.id,
    required this.name,
    required this.avatarUrl,
    required this.lastInteractionTime,
    required this.interactionCount,
  });
}

2. 筛选排序常用联系人

通过互动频率和最近互动时间加权排序,筛选出高频联系人:

List<Contact> getTopUsedContacts(List<Contact> allContacts) {
  // 过滤近30天有互动的联系人
  final recentContacts = allContacts.where((contact) {
    final timeDiff = DateTime.now().difference(contact.lastInteractionTime);
    return timeDiff.inDays <= 30;
  }).toList();

  // 先按互动次数降序,次数相同则按最近互动时间排序
  recentContacts.sort((a, b) {
    if (a.interactionCount != b.interactionCount) {
      return b.interactionCount.compareTo(a.interactionCount);
    }
    return b.lastInteractionTime.compareTo(a.lastInteractionTime);
  });

  // 取前10个作为常用联系人展示
  return recentContacts.take(10).toList();
}

3. 实现横向滚动的常用联系人UI

用SingleChildScrollView配合Row实现横向滚动的头像列表,贴合主流应用的交互样式:

Widget buildFavoriteContactsBar(List<Contact> favoriteContacts) {
  return Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: [
      const Padding(
        padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
        child: Text(
          '常用联系人',
          style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600),
        ),
      ),
      SizedBox(
        height: 85,
        child: SingleChildScrollView(
          scrollDirection: Axis.horizontal,
          padding: const EdgeInsets.symmetric(horizontal: 12),
          child: Row(
            children: favoriteContacts.map((contact) {
              return GestureDetector(
                onTap: () => _handleShareToContact(contact),
                child: Padding(
                  padding: const EdgeInsets.symmetric(horizontal: 8),
                  child: Column(
                    children: [
                      CircleAvatar(
                        radius: 28,
                        backgroundImage: NetworkImage(contact.avatarUrl),
                        child: contact.avatarUrl.isEmpty
                            ? Text(contact.name[0].toUpperCase())
                            : null,
                      ),
                      const SizedBox(height: 4),
                      SizedBox(
                        width: 60,
                        child: Text(
                          contact.name,
                          overflow: TextOverflow.ellipsis,
                          textAlign: TextAlign.center,
                          style: const TextStyle(fontSize: 12),
                        ),
                      ),
                    ],
                  ),
                ),
              );
            }).toList(),
          ),
        ),
      ),
    ],
  );
}

4. 整合到共享表单

将上述组件嵌入到共享屏幕表单的合适位置(比如输入框上方),和其他共享选项(相册、文件等)配合使用即可。

补充提示

  • 若需读取系统通讯录的常用联系人,可使用contacts_service插件获取系统联系人列表,再结合应用内的互动数据排序
  • 可添加「查看全部」按钮,点击后跳转至完整联系人选择页面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:24:51