Flutter for OpenHarmony 家具购买记录App实战:关于我们实现
本文介绍了如何为家具购买记录App实现"关于我们"页面。页面采用简洁明了的设计风格,包含四个核心模块:App信息卡片(展示图标、名称、版本和简介)、功能介绍卡片(列出家具管理、房间分类等四项功能)、链接列表和版权信息。页面使用米白色背景和棕色主题色保持一致性,通过卡片式布局和适当的间距增强可读性。功能模块采用数据驱动的方式渲染,每个功能项包含图标和文字描述。整体设计旨在让用户快
关于我们页面是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
更多推荐

所有评论(0)