朋友圈应用


欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1 应用简介

朋友圈应用是一款模拟社交动态分享的移动应用,借鉴了主流社交平台的核心交互设计,为用户提供发布动态、浏览好友动态、点赞评论等社交功能。应用采用清新简洁的视觉风格,以绿色为主色调,营造轻松愉悦的社交氛围。

应用支持发布文字和图片动态,图片采用九宫格布局展示,最多支持9张图片。用户可以浏览好友发布的动态,对感兴趣的动态进行点赞和评论互动。时间显示采用智能格式化,根据发布时间自动显示"刚刚"、“几分钟前”、"几小时前"等友好提示。

1.2 核心功能

功能模块 功能描述 实现方式
动态列表 好友动态流展示 CustomScrollView + SliverList
个人封面 用户封面头像展示 SliverAppBar + FlexibleSpaceBar
九宫格图片 多图自适应布局 Wrap + 条件判断
点赞功能 动态点赞/取消 状态管理 + 动画反馈
评论功能 发布评论内容 Dialog + TextField
发布动态 文字+图片发布 新页面 + 表情选择器
图片预览 全屏图片浏览 PageView + Dialog
时间格式化 智能时间显示 时间差计算

1.3 数据模型

模型 属性 说明
User name, avatar, cover 用户信息模型
Moment id, user, content, images, time, likes, comments 动态内容模型
Comment user, content, time 评论数据模型

1.4 技术栈

技术领域 技术选型 版本要求
开发框架 Flutter >= 3.0.0
编程语言 Dart >= 2.17.0
设计规范 Material Design 3 -
滚动组件 CustomScrollView -
状态管理 setState -
目标平台 鸿蒙OS / Web API 21+

1.5 项目结构

lib/
└── main_moments.dart
    ├── MomentsApp              # 应用入口
    ├── User                    # 用户数据模型
    ├── Comment                 # 评论数据模型
    ├── Moment                  # 动态数据模型
    ├── MomentsPage             # 朋友圈主页面
    └── PublishPage             # 发布动态页面

二、系统架构

2.1 整体架构图

Interaction Layer

Data Layer

Presentation Layer

MomentsPage
朋友圈主页

动态列表

个人封面

发布入口

PublishPage
发布页

文字输入

表情选择

图片添加

User
用户模型

Moment
动态模型

Comment
评论模型

点赞功能

评论功能

图片预览

2.2 类图设计

manages

uses

uses

contains

contains

references

MomentsApp

+Widget build()

User

+String name

+String avatar

+String? cover

Comment

+User user

+String content

+DateTime time

Moment

+String id

+User user

+String content

+List<String> images

+DateTime time

+List<User> likes

+List<Comment> comments

MomentsPage

-User _currentUser

-List<Moment> _moments

+Widget build()

-void _toggleLike()

-void _addComment()

-void _showPublishPage()

PublishPage

+User currentUser

+Function onPublish

-TextEditingController _contentController

-List<String> _selectedEmojis

+Widget build()

-void _addEmoji()

-void _publish()

2.3 页面导航流程

点击发布

点击点赞

点击评论

点击图片

应用启动

朋友圈主页

用户操作

发布动态页

输入文字

选择表情图片

点击发表

返回主页

更新点赞状态

弹出评论框

输入评论内容

发送评论

图片预览页

滑动浏览

关闭预览

2.4 数据流向图

发布页 数据模型 主页 用户 发布页 数据模型 主页 用户 浏览动态列表 加载Moment数据 返回动态列表 点击点赞 更新likes列表 刷新UI 点击发布 跳转发布页 输入内容 回传新动态 插入新Moment 刷新列表

三、核心模块设计

3.1 数据模型设计

3.1.1 用户模型 (User)
class User {
  final String name;      // 用户昵称
  final String avatar;    // 用户头像(Emoji表示)
  final String? cover;    // 个人封面

  const User({
    required this.name,
    required this.avatar,
    this.cover,
  });
}
3.1.2 动态模型 (Moment)
class Moment {
  final String id;              // 动态唯一标识
  final User user;              // 发布者
  final String content;         // 文字内容
  final List<String> images;    // 图片列表
  final DateTime time;          // 发布时间
  final List<User> likes;       // 点赞用户列表
  final List<Comment> comments; // 评论列表
}
3.1.3 评论模型 (Comment)
class Comment {
  final User user;        // 评论者
  final String content;   // 评论内容
  final DateTime time;    // 评论时间
}

3.2 页面结构设计

3.2.1 主页面布局

MomentsPage

CustomScrollView

SliverAppBar
个人封面

SliverList
动态列表

渐变背景

用户头像

用户昵称

动态卡片1

动态卡片2

动态卡片N

FloatingActionButton
发布按钮

3.2.2 动态卡片结构

动态卡片

头像区域

内容区域

方形头像

用户昵称

文字内容

图片网格

时间显示

操作栏

点赞评论区域

1张: 单图大图

2-4张: 2列布局

5-9张: 3列布局

点赞按钮

评论按钮

3.2.3 发布页面结构

点击表情区

选择Emoji

未满9张

已满9张

直接发表

发布成功

文字输入

选择表情

添加图片

继续添加

点击发表

3.3 九宫格布局逻辑

图片数量判断

count == 1?

单图模式
尺寸180x180

count <= 4?

双列模式
尺寸100x100

三列模式
尺寸80x80

居中显示

Wrap布局

最多显示9张


四、UI设计规范

4.1 配色方案

应用采用微信风格的绿色主题,营造清新自然的社交氛围:

颜色类型 色值 用途
主色 #4CAF50 (Green) 导航、按钮、用户名
背景色 #EDEDED 页面背景
卡片背景 #FFFFFF 动态卡片
用户名 #2E7D32 (Green 800) 用户昵称文字
时间文字 #9E9E9E (Grey 500) 时间显示
点赞红心 #E53935 (Red 600) 点赞图标

4.2 字体规范

元素 字号 字重 颜色
用户昵称 16px Medium Green 700
动态内容 15px Regular #000000
时间显示 12px Regular Grey 500
点赞列表 14px Regular Green 700
评论内容 14px Regular #000000
操作按钮 13px Regular Grey 600

4.3 组件规范

4.3.1 动态卡片布局
┌─────────────────────────────────────────────────┐
│ ┌────┐  张三                                     │
│ │ 👨 │  今天天气真好,出去走走~                   │
│ └────┘                                           │
│        ┌─────┐ ┌─────┐ ┌─────┐                  │
│        │ 🌸  │ │ 🌺  │ │ 🌻  │                  │
│        └─────┘ └─────┘ └─────┘                  │
│        30分钟前                                   │
│                        [♡ 赞] │ [💬 评论]        │
│        ┌─────────────────────────────────────┐  │
│        │ ❤ 李四, 王五                        │  │
│        │ 李四:好美啊!                       │  │
│        └─────────────────────────────────────┘  │
└─────────────────────────────────────────────────┘
4.3.2 个人封面布局
┌─────────────────────────────────────────────────┐
│                                                 │
│              🌄                                 │
│           (封面图)                               │
│                                                 │
│                                    ┌──────┐     │
│                              我    │  👤  │     │
│                                    └──────┘     │
└─────────────────────────────────────────────────┘
4.3.3 发布页面布局
┌─────────────────────────────────────────────────┐
│  ✕          发表动态                    [发表]  │
├─────────────────────────────────────────────────┤
│                                                 │
│  这一刻的想法...                                 │
│                                                 │
│                                                 │
│                                                 │
├─────────────────────────────────────────────────┤
│  ┌────┐ ┌────┐ ┌────┐                          │
│  │ 😀 │ │ 😃 │ │ 😄 │ ...                      │
│  └────┘ └────┘ └────┘                          │
├─────────────────────────────────────────────────┤
│  😀 😃 😄 😁 😅 😂 🤣 😊 😇 🙂                    │
│  😍 🥰 😘 😗 😙 😚 😋 😛 😜 🤪                    │
│  ...                                            │
└─────────────────────────────────────────────────┘

五、核心功能实现

5.1 动态列表渲染

Widget _buildMomentsList() {
  return SliverList(
    delegate: SliverChildBuilderDelegate(
      (context, index) => _buildMomentCard(_moments[index]),
      childCount: _moments.length,
    ),
  );
}

5.2 九宫格图片布局

Widget _buildImageGrid(List<String> images) {
  final count = images.length;
  int columns;
  if (count == 1) {
    columns = 1;
  } else if (count <= 4) {
    columns = 2;
  } else {
    columns = 3;
  }

  final itemSize = columns == 1 ? 180.0 : (columns == 2 ? 100.0 : 80.0);

  return Wrap(
    spacing: 4,
    runSpacing: 4,
    children: images.take(9).map((img) {
      return GestureDetector(
        onTap: () => _showImagePreview(images, images.indexOf(img)),
        child: Container(
          width: itemSize,
          height: itemSize,
          decoration: BoxDecoration(
            color: Colors.grey.shade200,
            borderRadius: BorderRadius.circular(4),
          ),
          child: Center(
            child: Text(img, style: TextStyle(fontSize: itemSize * 0.5)),
          ),
        ),
      );
    }).toList(),
  );
}

5.3 点赞功能实现

void _toggleLike(String momentId) {
  setState(() {
    final index = _moments.indexWhere((m) => m.id == momentId);
    if (index != -1) {
      final moment = _moments[index];
      final hasLiked = moment.likes.any((u) => u.name == _currentUser.name);
      if (hasLiked) {
        moment.likes.removeWhere((u) => u.name == _currentUser.name);
      } else {
        moment.likes.add(_currentUser);
      }
    }
  });
}

5.4 评论功能实现

void _showCommentDialog(String momentId) {
  final controller = TextEditingController();
  showDialog(
    context: context,
    builder: (context) => AlertDialog(
      title: const Text('评论'),
      content: TextField(
        controller: controller,
        autofocus: true,
        decoration: const InputDecoration(
          hintText: '说点什么...',
          border: OutlineInputBorder(),
        ),
        maxLines: 3,
      ),
      actions: [
        TextButton(
          onPressed: () => Navigator.pop(context),
          child: const Text('取消'),
        ),
        TextButton(
          onPressed: () {
            if (controller.text.trim().isNotEmpty) {
              _addComment(momentId, controller.text.trim());
              Navigator.pop(context);
            }
          },
          child: const Text('发送'),
        ),
      ],
    ),
  );
}

5.5 时间格式化

String _formatTime(DateTime time) {
  final now = DateTime.now();
  final diff = now.difference(time);

  if (diff.inMinutes < 1) {
    return '刚刚';
  } else if (diff.inMinutes < 60) {
    return '${diff.inMinutes}分钟前';
  } else if (diff.inHours < 24) {
    return '${diff.inHours}小时前';
  } else if (diff.inDays < 7) {
    return '${diff.inDays}天前';
  } else {
    return '${time.month}${time.day}日';
  }
}

5.6 图片预览功能

void _showImagePreview(List<String> images, int initialIndex) {
  showDialog(
    context: context,
    builder: (context) => Dialog(
      backgroundColor: Colors.transparent,
      insetPadding: EdgeInsets.zero,
      child: Stack(
        children: [
          PageView.builder(
            itemCount: images.length,
            controller: PageController(initialPage: initialIndex),
            itemBuilder: (context, index) {
              return Center(
                child: Text(images[index], style: const TextStyle(fontSize: 200)),
              );
            },
          ),
          Positioned(
            top: 40,
            right: 16,
            child: IconButton(
              icon: const Icon(Icons.close, color: Colors.white, size: 32),
              onPressed: () => Navigator.pop(context),
            ),
          ),
        ],
      ),
    ),
  );
}

六、发布功能详解

6.1 发布页面结构

PublishPage

AppBar

内容输入区

已选图片区

表情选择器

关闭按钮

标题

发表按钮

分类标签

表情网格

表情

爱心

花朵

食物

音乐

心形

6.2 表情分类

分类 图标 包含表情
表情 😀 😀😃😄😁😅😂🤣😊😇🙂
爱心 😍 😍🥰😘😗😙😚😋😛😜🤪
花朵 🌸 🌸🌺🌻🌹🌷💐🌾🍀🌵🌴
食物 🍕 🍕🍔🍟🌭🥪🌮🌯🥗🍝🍜
音乐 📷 📷🎬🎵🎶🎹🎸🎺🎻🥁🎤
心形 ❤️ ❤️🧡💛💚💙💜🖤🤍🤎💔

6.3 发布流程

数据列表 主页 发布页 用户 数据列表 主页 发布页 用户 alt [内容为空] [内容有效] 点击发布按钮 显示发布页面 输入文字内容 选择表情图片 验证内容非空 提示"请输入内容" 点击发表 回调onPublish 插入新动态 刷新列表 返回主页

七、交互设计

7.1 点赞交互流程

点击点赞

点击取消

显示空心爱心♡

从likes列表移除用户

显示实心爱心♥

添加用户到likes列表

7.2 图片预览交互

左右滑动

点击关闭

点击图片

全屏预览

用户操作

切换图片

退出预览

返回动态列表

7.3 评论交互

输入内容

点击取消

点击评论按钮

弹出评论对话框

自动聚焦输入框

用户操作

文字输入

点击发送

添加评论

关闭对话框

刷新评论列表

关闭对话框


八、扩展功能规划

8.1 后续版本规划

2024-01-07 2024-01-14 2024-01-21 2024-01-28 2024-02-04 2024-02-11 2024-02-18 2024-02-25 2024-03-03 2024-03-10 2024-03-17 2024-03-24 动态列表展示 点赞评论功能 发布动态功能 真实图片上传 定位功能 表情键盘优化 视频动态支持 隐私设置 消息通知 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 朋友圈应用开发计划

8.2 功能扩展建议

8.2.1 图片上传功能

增强图片处理能力:

  • 支持相机拍照
  • 支持相册选择
  • 图片压缩处理
  • 图片裁剪功能
8.2.2 社交功能增强

丰富社交互动:

  • 回复评论功能
  • @好友功能
  • 分享动态功能
  • 私信功能
8.2.3 隐私设置

用户隐私保护:

  • 动态可见范围设置
  • 屏蔽用户功能
  • 评论权限设置

九、注意事项

9.1 开发注意事项

  1. 数据可变性:Moment模型中的likes和comments需要可变,使用late初始化

  2. 图片数量限制:九宫格最多显示9张图片,需要截取处理

  3. 时间格式化:注意时间差计算的边界情况

  4. 状态刷新:点赞、评论后需要及时刷新UI

9.2 常见问题

问题 原因 解决方案
图片布局错乱 列数计算错误 根据数量动态计算columns
点赞状态不同步 状态未正确更新 使用setState刷新
时间显示异常 时区问题 使用本地时间计算
评论不显示 列表未刷新 添加后调用setState

9.3 使用提示

📱 朋友圈小贴士 📱

点击右下角按钮可以发布新动态。
点击图片可以全屏预览。
点赞后心形会变成红色。
评论内容会实时显示在动态下方。
发布动态支持文字和表情图片组合。


十、运行说明

10.1 环境要求

环境 版本要求
Flutter SDK >= 3.0.0
Dart SDK >= 2.17.0
鸿蒙OS API 21+

10.2 运行命令

# 查看可用设备
flutter devices

# 运行到Web服务器
flutter run -d web-server -t lib/main_moments.dart --web-port 8088

# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_moments.dart

# 运行到Windows
flutter run -d windows -t lib/main_moments.dart

# 代码分析
flutter analyze lib/main_moments.dart

十一、总结

朋友圈应用通过模拟主流社交平台的核心功能,为用户提供了一个完整的社交动态体验。应用采用Material Design 3设计规范,以清新的绿色为主题色调,营造轻松愉悦的社交氛围。

核心功能涵盖动态浏览、点赞评论、发布动态三大模块。动态列表采用CustomScrollView实现流畅的滚动体验,个人封面通过SliverAppBar实现沉浸式展示。九宫格图片布局根据图片数量智能调整,提供最佳的视觉效果。点赞和评论功能支持实时交互,用户可以与好友动态进行即时互动。

发布动态页面支持文字输入和表情图片选择,表情分为6大类别共60个表情可供选择。图片预览功能支持全屏浏览和左右滑动切换,提供沉浸式的图片查看体验。

通过本应用,希望能够帮助开发者理解社交应用的核心交互设计,掌握Flutter中列表渲染、状态管理、页面导航等关键技术,为开发更复杂的社交应用奠定基础。

分享生活,记录美好

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐