请添加图片描述

关于我们页面是App的"名片",展示App的基本信息、主要功能、相关链接等。今天来实现家具购买记录App的关于我们页面,这也是这个系列的最后一篇文章。

做关于页面的时候,我想的是怎么让用户快速了解这个App是干什么的。所以把App图标、名称、版本号放在最显眼的位置,下面再列出主要功能和相关链接。

页面整体结构

关于我们页面用 StatelessWidget 实现,因为这个页面只是展示信息,不需要管理状态。

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';

class AboutPage extends StatelessWidget {
  const AboutPage({super.key});

导入了三个依赖:Material 组件库、屏幕适配工具、GetX。这个页面不需要路由跳转,所以没有导入路由常量。

GetX 在这里主要是为了以后可能用到的功能,比如点击链接后的提示。目前代码里没有用到,但保留导入也没关系。

页面主体布局

build 方法里用 SingleChildScrollView 包裹内容,设置页面背景和 AppBar。

  
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: const Color(0xFFFAF8F5),
      appBar: AppBar(
        title: const Text('关于我们'), 
        backgroundColor: const Color(0xFF8B4513), 
        foregroundColor: Colors.white
      ),

AppBar 样式和其他页面一致,棕色背景白色文字。标题"关于我们"简洁明了。

背景色用统一的米白色,整个App的背景色都是这个,保持视觉一致性。

内容区域结构

内容区域用 Column 垂直排列四个模块:App信息、功能介绍、链接列表、版权信息。

      body: SingleChildScrollView(
        padding: EdgeInsets.all(16.w),
        child: Column(
          children: [
            _buildAppInfo(),
            SizedBox(height: 20.h),
            _buildFeatures(),
            SizedBox(height: 20.h),
            _buildLinks(),
            SizedBox(height: 20.h),
            _buildCopyright(),
          ],
        ),
      ),
    );
  }

每个模块之间用 20 的间距隔开,比其他页面的 16 稍大一点,让页面看起来更舒展。

四个模块各有分工:App信息是核心展示,功能介绍让用户了解App能做什么,链接列表提供更多入口,版权信息是法律要求。

App信息卡片

_buildAppInfo 方法构建App信息卡片,包含图标、名称、版本号、简介。

  Widget _buildAppInfo() {
    return Container(
      padding: EdgeInsets.all(24.w),
      decoration: BoxDecoration(
        color: Colors.white, 
        borderRadius: BorderRadius.circular(16.r)
      ),
      child: Column(
        children: [
          Container(
            padding: EdgeInsets.all(16.w),
            decoration: BoxDecoration(
              color: const Color(0xFF8B4513).withOpacity(0.1), 
              shape: BoxShape.circle
            ),
            child: Icon(Icons.chair, color: const Color(0xFF8B4513), size: 48.sp),
          ),

App图标用椅子图标,外面套一个圆形浅棕色背景。这个设计和首页的快捷按钮类似,但尺寸更大,更醒目。

BoxShape.circle 让容器变成圆形,不用设置 borderRadius。圆形图标是App图标的常见形式。

padding 设置为 24,比其他卡片的 16 大一些,让内容有更多呼吸空间。

App名称和版本

图标下面是App名称和版本号。

          SizedBox(height: 16.h),
          Text('家具购买记录', style: TextStyle(
            fontSize: 22.sp, 
            fontWeight: FontWeight.bold, 
            color: const Color(0xFF5D4037)
          )),
          SizedBox(height: 8.h),
          Text('版本 1.0.0', style: TextStyle(
            color: Colors.grey[600], 
            fontSize: 14.sp
          )),

App名称用深棕色加粗,字号 22,是整个卡片的视觉焦点。版本号用灰色小字,作为补充信息。

版本号格式用"版本 1.0.0",比单独的"1.0.0"更易读。实际项目中版本号应该从 pubspec.yaml 读取。

App简介

版本号下面是一句简短的App介绍。

          SizedBox(height: 16.h),
          Text(
            '记录您的每一件家具,管理家居生活', 
            textAlign: TextAlign.center, 
            style: TextStyle(color: Colors.grey[600], fontSize: 14.sp)
          ),
        ],
      ),
    );
  }

简介用灰色文字居中显示,一句话说明App的核心功能。文字不要太长,用户扫一眼就能看完。

textAlign: TextAlign.center 让文字居中,和上面的图标、名称对齐。

功能介绍卡片

_buildFeatures 方法构建功能介绍卡片,列出App的四个主要功能。

  Widget _buildFeatures() {
    final features = [
      {'icon': Icons.chair, 'title': '家具管理', 'desc': '记录家具信息、购买详情'},
      {'icon': Icons.room, 'title': '房间分类', 'desc': '按房间管理家具'},
      {'icon': Icons.security, 'title': '保修追踪', 'desc': '保修到期提醒'},
      {'icon': Icons.bar_chart, 'title': '数据统计', 'desc': '支出分析报告'},
    ];

用一个 List 存储功能数据,每个功能有图标、标题、描述三个字段。这种数据驱动的写法方便维护。

选了四个最核心的功能:家具管理是基础功能,房间分类是组织方式,保修追踪是特色功能,数据统计是增值功能。

功能列表渲染

用 map 方法遍历功能列表,生成功能项。

    return Container(
      padding: EdgeInsets.all(16.w),
      decoration: BoxDecoration(
        color: Colors.white, 
        borderRadius: BorderRadius.circular(16.r)
      ),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Text('主要功能', style: TextStyle(
            fontSize: 16.sp, 
            fontWeight: FontWeight.bold, 
            color: const Color(0xFF5D4037)
          )),
          SizedBox(height: 16.h),

标题"主要功能"用深棕色加粗,和其他页面的分组标题样式一致。

crossAxisAlignment: CrossAxisAlignment.start 让内容靠左对齐,标题不会居中。

单个功能项

每个功能项是左边图标、右边文字的布局。

          ...features.map((f) => Padding(
            padding: EdgeInsets.only(bottom: 12.h),
            child: Row(
              children: [
                Container(
                  padding: EdgeInsets.all(8.w),
                  decoration: BoxDecoration(
                    color: const Color(0xFF8B4513).withOpacity(0.1), 
                    borderRadius: BorderRadius.circular(8.r)
                  ),
                  child: Icon(f['icon'] as IconData, color: const Color(0xFF8B4513), size: 20.sp),
                ),
                SizedBox(width: 12.w),
                Expanded(
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start, 
                    children: [
                      Text(f['title'] as String, style: TextStyle(
                        fontWeight: FontWeight.w600, 
                        fontSize: 14.sp
                      )),
                      Text(f['desc'] as String, style: TextStyle(
                        color: Colors.grey[500], 
                        fontSize: 12.sp
                      )),
                    ]
                  )
                ),
              ],
            ),
          )).toList(),
        ],
      ),
    );
  }

图标外面套一个浅棕色圆角方块,和首页的快捷按钮样式类似。圆角用 8 而不是圆形,看起来更现代。

标题用半粗体,描述用灰色小字。Expanded 包裹文字区域,防止文字太长溢出。

... 展开运算符把 map 结果展开成多个 Widget,不用再套一层 Column。

链接列表卡片

_buildLinks 方法构建链接列表,包含评分、分享、反馈、协议、隐私五个入口。

  Widget _buildLinks() {
    return Container(
      padding: EdgeInsets.all(16.w),
      decoration: BoxDecoration(
        color: Colors.white, 
        borderRadius: BorderRadius.circular(16.r)
      ),
      child: Column(
        children: [
          _buildLinkTile(Icons.star, '给我们评分', () {}),
          _buildLinkTile(Icons.share, '分享给朋友', () {}),
          _buildLinkTile(Icons.feedback, '意见反馈', () {}),
          _buildLinkTile(Icons.description, '用户协议', () {}),
          _buildLinkTile(Icons.privacy_tip, '隐私政策', () {}),
        ],
      ),
    );
  }

这些链接目前都是空实现,点击没有反应。实际项目中应该跳转到对应页面或打开外部链接。

给我们评分应该跳转到应用商店,分享给朋友应该调用系统分享,意见反馈可以跳转到反馈页面或发邮件,用户协议和隐私政策应该显示对应的文档。

单个链接项

_buildLinkTile 方法构建单个链接项,和个人中心的菜单项样式类似。

  Widget _buildLinkTile(IconData icon, String title, VoidCallback onTap) {
    return InkWell(
      onTap: onTap,
      child: Padding(
        padding: EdgeInsets.symmetric(vertical: 12.h),
        child: Row(
          children: [
            Icon(icon, color: const Color(0xFF8B4513), size: 22.sp),
            SizedBox(width: 12.w),
            Expanded(child: Text(title, style: TextStyle(fontSize: 14.sp))),
            Icon(Icons.chevron_right, color: Colors.grey[400]),
          ],
        ),
      ),
    );
  }

InkWell 提供点击反馈,Padding 设置垂直间距让点击区域足够大。

左边图标用主题棕色,右边箭头用灰色,中间标题用默认黑色。这种三段式布局是列表项的标准样式。

版权信息

_buildCopyright 方法构建底部的版权信息。

  Widget _buildCopyright() {
    return Column(
      children: [
        Text(
          '© 2024 家具购买记录', 
          style: TextStyle(color: Colors.grey[500], fontSize: 12.sp)
        ),
        SizedBox(height: 4.h),
        Text(
          'Made with ❤️ for OpenHarmony', 
          style: TextStyle(color: Colors.grey[400], fontSize: 11.sp)
        ),
      ],
    );
  }
}

版权信息用灰色小字显示,不抢眼但必须有。年份写 2024,实际项目中可以用代码获取当前年份。

“Made with ❤️ for OpenHarmony” 是一句彩蛋,表明这个App是为鸿蒙平台开发的。用爱心 emoji 增加一点温度。

版权信息没有用卡片包裹,直接显示在背景上,和上面的卡片形成区分。

图标选择说明

链接列表的图标选择:

给我们评分用星星图标 Icons.star,表示评分。

分享给朋友用分享图标 Icons.share,这是分享的通用图标。

意见反馈用反馈图标 Icons.feedback,表示用户反馈。

用户协议用文档图标 Icons.description,表示文档/协议。

隐私政策用隐私图标 Icons.privacy_tip,专门表示隐私相关。

这些图标都是 Material Icons 自带的,不需要额外引入图标库。

评分功能实现思路

给我们评分功能需要跳转到应用商店。不同平台的实现方式不同:

// Android 跳转到 Google Play
// iOS 跳转到 App Store
// 鸿蒙跳转到华为应用市场

// 可以用 url_launcher 插件打开应用商店链接
// 或者用 in_app_review 插件调用系统评分弹窗

鸿蒙平台的应用商店跳转可能需要特殊处理,具体要看 Flutter for OpenHarmony 的支持情况。

分享功能实现思路

分享功能需要调用系统分享面板。

// 可以用 share_plus 插件实现分享
// Share.share('推荐一个家具管理App:家具购买记录');

// 也可以分享链接
// Share.share('https://example.com/app');

分享内容可以是一段文字介绍,也可以是App的下载链接。如果有图片,还可以分享图片。

意见反馈实现思路

意见反馈可以有多种实现方式:

// 方式一:跳转到反馈页面,用户填写表单提交
// Get.toNamed(AppRoutes.feedback);

// 方式二:打开邮件客户端,发送邮件
// url_launcher 打开 mailto: 链接

// 方式三:打开在线客服
// 跳转到客服网页或调用客服SDK

对于小型App,用邮件方式最简单。用户点击后打开邮件客户端,预填收件人和主题。

协议和隐私政策

用户协议和隐私政策是App上架必须的内容。可以用以下方式展示:

// 方式一:跳转到新页面显示
// Get.toNamed(AppRoutes.userAgreement);

// 方式二:打开网页显示
// url_launcher 打开协议网页

// 方式三:弹窗显示
// 用 AlertDialog 或 BottomSheet 显示协议内容

协议内容通常比较长,建议用单独页面或网页显示,不要用弹窗。

版本号动态获取

目前版本号是写死的 “1.0.0”,实际项目中应该动态获取。

// 可以用 package_info_plus 插件获取版本信息
// final packageInfo = await PackageInfo.fromPlatform();
// final version = packageInfo.version;
// final buildNumber = packageInfo.buildNumber;

这样每次发版只需要改 pubspec.yaml 里的版本号,关于页面会自动更新。

页面设计要点

关于页面的设计要点:

信息层次要清晰,最重要的App信息放最上面,次要的链接放下面。

内容要简洁,用户来这个页面通常是想快速了解App或找某个链接,不要放太多文字。

风格要统一,卡片样式、颜色、间距都要和其他页面一致。

版权信息必须有,这是法律要求,也是对开发者的尊重。

系列总结

到这里,家具购买记录App的30个页面就全部实现完了。回顾一下这个系列:

从首页仪表盘开始,我们实现了数据展示、快捷入口、列表渲染等基础功能。

家具管理模块包括列表、详情、添加、编辑四个页面,覆盖了增删改查的完整流程。

房间管理、分类管理、品牌管理、商家管理都是类似的列表+详情+添加的结构。

购买记录、预算管理、保修管理、提醒管理是App的核心业务功能。

统计分析、费用报告用图表展示数据,让用户直观了解消费情况。

日历视图、搜索功能、收藏夹是提升用户体验的辅助功能。

数据备份、设置、个人中心、关于我们是App的基础设施页面。

整个App使用 Flutter for OpenHarmony 开发,可以同时运行在鸿蒙设备和其他平台上。用到的主要技术包括:

flutter_screenutil 做屏幕适配,让UI在不同设备上都能正常显示。

GetX 做路由管理和状态管理,代码简洁高效。

fl_chart 做图表展示,支持折线图、柱状图、饼图。

table_calendar 做日历视图,功能完善易于定制。

希望这个系列对你有帮助,如果有问题欢迎在社区讨论。


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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐