Flutter for OpenHarmony轻量级开源记事本app实战——关于界面
本文介绍了如何实现一个美观且功能完整的Flutter关于页面。页面采用Material Design风格,包含应用图标、名称、版本号等基本信息,以及应用特点、功能列表等详细内容。通过使用Card、ListTile等组件实现结构化布局,配合flutter_screenutil实现屏幕适配。页面设计注重视觉层次和用户体验,通过间距、颜色和图标增强可读性,整体简洁高效,既传达了应用核心价值,又体现了开发
关于界面是应用中展示应用信息、版本号、开源协议等内容的重要页面。一个设计良好的关于页面不仅能够传达应用的基本信息,还能体现应用的品牌形象和开发者的用心。本文将详细介绍如何实现一个美观且功能完整的关于界面。
页面的基础结构
让我们从关于界面的基本代码开始:
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class AboutPage extends StatelessWidget {
const AboutPage({super.key});
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
关于页面是一个无状态Widget,只负责展示静态信息。我们导入flutter_screenutil包来实现屏幕适配,确保页面在不同尺寸的设备上都能正常显示。Scaffold提供了标准的Material Design布局结构,AppBar显示页面标题。
title: const Text('关于'),
),
body: SingleChildScrollView(
padding: EdgeInsets.all(16.w),
child: Column(
children: [
SizedBox(height: 32.h),
Container(
width: 80.w,
height: 80.w,
body使用SingleChildScrollView包裹,确保当内容超过屏幕高度时可以滚动。padding设置为16个逻辑像素,让内容与屏幕边缘保持适当距离。顶部添加32个逻辑像素的间距,然后是应用图标容器。
decoration: BoxDecoration(
color: const Color(0xFF2196F3),
borderRadius: BorderRadius.circular(20),
),
child: Icon(
Icons.note_alt,
size: 48.sp,
color: Colors.white,
),
),
Container的decoration设置了背景色和圆角。背景色使用应用的主题色蓝色,圆角半径为20,让图标容器看起来更加柔和。图标使用note_alt,大小为48sp,颜色为白色,与蓝色背景形成鲜明对比。
SizedBox(height: 16.h),
Text(
'轻记',
style: TextStyle(
fontSize: 24.sp,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: 4.h),
Text(
图标下方是应用名称"轻记",使用24sp的大字号和粗体,让名称更加醒目。名称与图标之间的间距为16个逻辑像素,保持适当的视觉距离。应用名称下方添加4个逻辑像素的小间距。
'v1.0.0',
style: TextStyle(
fontSize: 14.sp,
color: Colors.grey,
),
),
SizedBox(height: 8.h),
Text(
'开源 · 无广告 · 轻量级',
style: TextStyle(
版本号使用14sp的小字号和灰色,让它看起来像是应用名称的补充信息。版本号下方是应用的特点标语,使用中文间隔号分隔三个特点。这种简洁的表达方式让用户能够快速了解应用的核心价值。
fontSize: 14.sp,
color: const Color(0xFF2196F3),
),
),
SizedBox(height: 32.h),
Card(
child: Column(
children: [
ListTile(
leading: const Icon(Icons.description_outlined),
特点标语使用主题色蓝色,让它更加醒目。标语下方添加32个逻辑像素的间距,然后开始展示详细信息。详细信息使用Card包裹,Card会自动提供圆角和阴影效果。第一个ListTile展示应用介绍。
title: const Text('应用介绍'),
subtitle: const Text('一款简洁高效的笔记应用'),
),
const Divider(height: 1),
ListTile(
leading: const Icon(Icons.code),
title: const Text('开源协议'),
subtitle: const Text('MIT License'),
),
ListTile使用description_outlined图标,title是"应用介绍",subtitle是应用的简短描述。ListTile之间使用Divider分隔,高度设置为1。第二个ListTile展示开源协议,使用code图标。
const Divider(height: 1),
ListTile(
leading: const Icon(Icons.flutter_dash),
title: const Text('技术栈'),
subtitle: const Text('Flutter for OpenHarmony'),
),
],
),
),
SizedBox(height: 16.h),
第三个ListTile展示技术栈,使用flutter_dash图标。Flutter for OpenHarmony是应用的核心技术,这个信息让用户了解应用的技术基础。第一个Card结束后,添加16个逻辑像素的间距。
Card(
child: Padding(
padding: EdgeInsets.all(16.w),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'功能特点',
style: TextStyle(
第二个Card展示应用的功能特点,使用Padding添加内边距。Column的crossAxisAlignment设置为start,让内容左对齐。功能特点的标题使用16sp的粗体字,让它看起来像是一个小节标题。
fontSize: 16.sp,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: 12.h),
_FeatureItem(icon: Icons.edit_note, text: '支持文本格式化编辑'),
_FeatureItem(icon: Icons.folder, text: '分类和文件夹管理'),
_FeatureItem(icon: Icons.label, text: '标签系统'),
标题下方添加12个逻辑像素的间距,然后是功能列表。功能列表使用自定义的_FeatureItem组件,每个组件包含一个图标和一段文字。前三个功能分别是文本编辑、文件夹管理和标签系统。
_FeatureItem(icon: Icons.star, text: '收藏和置顶功能'),
_FeatureItem(icon: Icons.search, text: '全文搜索'),
_FeatureItem(icon: Icons.calendar_today, text: '日历视图'),
_FeatureItem(icon: Icons.bar_chart, text: '统计分析'),
_FeatureItem(icon: Icons.dark_mode, text: '深色模式'),
],
),
接下来是其他功能特点,每个功能都有对应的图标。收藏和置顶使用star图标,全文搜索使用search图标,日历视图使用calendar_today图标。统计分析使用bar_chart图标,深色模式使用dark_mode图标。
),
),
SizedBox(height: 32.h),
Text(
'© 2024 轻记',
style: TextStyle(
fontSize: 12.sp,
color: Colors.grey,
),
),
功能特点Card结束后,添加32个逻辑像素的间距,然后是版权信息。版权信息使用12sp的小字号和灰色,让它看起来像是页脚信息。版权符号©和年份2024表明了应用的版权归属。
SizedBox(height: 16.h),
],
),
),
);
}
}
class _FeatureItem extends StatelessWidget {
final IconData icon;
final String text;
最后添加16个逻辑像素的底部间距,确保内容不会紧贴屏幕底部。_FeatureItem是一个自定义组件,用于展示单个功能特点。它是一个私有的无状态Widget,接收图标和文字两个必需参数。
const _FeatureItem({required this.icon, required this.text});
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 4.h),
child: Row(
children: [
Icon(icon, size: 18.sp, color: const Color(0xFF2196F3)),
组件使用Padding包裹,垂直方向上下各添加4个逻辑像素的间距。Row用于水平排列图标和文字。图标大小为18sp,颜色使用主题色蓝色,与应用的整体风格保持一致。
SizedBox(width: 8.w),
Text(text, style: TextStyle(fontSize: 14.sp)),
],
),
);
}
}
图标和文字之间添加8个逻辑像素的间距,让它们不会紧贴在一起。文字使用14sp的字号,与页面中其他正文文字保持一致。这种统一的字号让页面看起来更加协调。
深色模式适配
关于界面需要完美适配深色模式,让我们看看如何实现主题适配:
Widget _buildThemedContent(BuildContext context) {
final isDark = Theme.of(context).brightness == Brightness.dark;
return Container(
padding: EdgeInsets.all(16.w),
decoration: BoxDecoration(
color: isDark ? const Color(0xFF1E1E1E) : Colors.white,
borderRadius: BorderRadius.circular(16),
主题适配的关键是根据当前主题的亮度来调整颜色。我们通过Theme.of(context).brightness获取当前主题的亮度,然后根据是否为深色模式选择不同的颜色。Container的背景色在深色模式下使用深灰色。
boxShadow: [
BoxShadow(
color: isDark
? Colors.black.withOpacity(0.3)
: Colors.grey.withOpacity(0.2),
blurRadius: 8,
offset: const Offset(0, 2),
),
],
),
阴影效果也需要根据主题调整。深色模式下使用黑色的半透明阴影,浅色模式下使用灰色的半透明阴影。blurRadius设置为8,offset设置为(0, 2),创建一个向下的阴影效果。
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'主题适配',
style: TextStyle(
fontSize: 18.sp,
fontWeight: FontWeight.bold,
color: isDark ? Colors.white : Colors.black87,
),
),
文字颜色是主题适配的重点。标题文字在深色模式下使用白色,在浅色模式下使用深灰色。这样可以确保文字在不同背景下都清晰可读。字号和字重保持不变,只调整颜色。
SizedBox(height: 12.h),
Text(
'本应用完美适配深色和浅色主题',
style: TextStyle(
fontSize: 14.sp,
color: isDark ? Colors.grey[400] : Colors.grey[600],
height: 1.4,
),
),
],
),
);
}
正文文字使用不同深浅的灰色。深色模式下使用浅灰色,浅色模式下使用深灰色。这种对比度确保了文字的可读性。行高设置为1.4,让文字之间有适当的间距。
版本信息展示
版本信息是关于界面的重要内容,让我们看看如何展示:
Widget _buildVersionCard(BuildContext context) {
return Card(
elevation: 4,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
child: Padding(
padding: EdgeInsets.all(16.w),
child: Row(
版本信息使用Card包裹,elevation设置为4,提供适当的阴影效果。shape设置圆角半径为16,与其他Card保持一致。Padding添加内边距,Row用于水平排列版本信息和按钮。
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'当前版本',
style: TextStyle(fontSize: 14.sp, color: Colors.grey),
),
mainAxisAlignment设置为spaceBetween,让版本信息和按钮分别位于左右两端。左侧使用Column垂直排列标签和版本号。标签"当前版本"使用14sp的灰色文字。
SizedBox(height: 4.h),
Text(
'v1.0.0',
style: TextStyle(
fontSize: 20.sp,
fontWeight: FontWeight.bold,
color: const Color(0xFF2196F3),
),
),
],
),
标签和版本号之间添加4个逻辑像素的小间距。版本号使用20sp的大字号和粗体,颜色使用主题色蓝色,让它更加醒目。这种层次分明的设计让用户能够快速识别主要信息。
ElevatedButton(
onPressed: () {
// 检查更新逻辑
},
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF2196F3),
foregroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
右侧是检查更新按钮,使用ElevatedButton实现。按钮的背景色使用主题色蓝色,前景色使用白色。shape设置圆角半径为12,与整体风格保持一致。
child: const Text('检查更新'),
),
],
),
),
);
}
按钮的文字是"检查更新",点击后会执行检查更新的逻辑。这种交互设计让关于界面不仅是信息展示,还提供了实用的功能。
开发者信息
开发者信息展示了应用的开发团队和联系方式:
Widget _buildDeveloperCard(BuildContext context) {
return Card(
elevation: 4,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
child: Column(
children: [
ListTile(
开发者信息使用Card和ListTile组合展示。Card提供统一的背景和阴影效果,ListTile提供标准的列表项布局。这种组合让信息展示更加规范和美观。
leading: Container(
width: 40.w,
height: 40.w,
decoration: BoxDecoration(
color: const Color(0xFF4CAF50).withOpacity(0.1),
borderRadius: BorderRadius.circular(12),
),
child: const Icon(
Icons.person_outline,
color: Color(0xFF4CAF50),
),
),
ListTile的leading是一个自定义的图标容器。容器的宽高都设置为40个逻辑像素,背景色使用绿色的半透明版本,圆角半径为12。图标使用person_outline,颜色为绿色。
title: const Text('开发者'),
subtitle: const Text('开源鸿蒙跨平台社区'),
trailing: const Icon(Icons.chevron_right),
onTap: () {
// 跳转到开发者页面
},
),
const Divider(height: 1),
title显示"开发者"标签,subtitle显示社区名称。trailing显示一个右箭头图标,提示用户可以点击。onTap回调处理点击事件,可以跳转到开发者页面或社区网站。
ListTile(
leading: Container(
width: 40.w,
height: 40.w,
decoration: BoxDecoration(
color: const Color(0xFFFF9800).withOpacity(0.1),
borderRadius: BorderRadius.circular(12),
),
child: const Icon(Icons.email_outlined, color: Color(0xFFFF9800)),
),
第二个ListTile展示联系方式。图标容器使用橙色主题,图标使用email_outlined。这种不同颜色的使用让不同类型的信息在视觉上有明显的区分。
title: const Text('联系方式'),
subtitle: const Text('feedback@example.com'),
trailing: const Icon(Icons.chevron_right),
onTap: () {
// 打开邮件应用
},
),
],
),
);
}
title显示"联系方式",subtitle显示邮箱地址。点击后可以打开邮件应用,让用户可以方便地发送反馈邮件。这种交互设计提升了用户体验。
社区链接按钮
社区链接是开源应用的重要组成部分:
Widget _buildCommunityButton(BuildContext context) {
return Container(
width: double.infinity,
margin: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.h),
child: ElevatedButton.icon(
onPressed: () {
// 打开社区链接
},
icon: const Icon(Icons.group),
社区链接使用ElevatedButton实现,包含图标和文字。Container的width设置为double.infinity,让按钮占满整个宽度。margin设置水平和垂直方向的外边距。
label: const Text('加入开源鸿蒙跨平台社区'),
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF2196F3),
foregroundColor: Colors.white,
padding: EdgeInsets.symmetric(vertical: 14.h),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
),
);
}
按钮的背景色使用主题色蓝色,前景色使用白色。padding设置垂直方向14个逻辑像素,让按钮有足够的点击区域。圆角半径为12,与其他元素保持一致。
功能特点详细展示
让我们看看如何更详细地展示应用的功能特点:
Widget _buildFeatureDetailCard(BuildContext context) {
return Card(
elevation: 4,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
child: Padding(
padding: EdgeInsets.all(16.w),
child: Column(
功能特点详细展示使用Card包裹,提供统一的背景和阴影效果。Padding添加内边距,Column用于垂直排列标题和功能列表。
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(Icons.stars, color: const Color(0xFF2196F3), size: 24.sp),
SizedBox(width: 8.w),
Text(
'核心功能',
style: TextStyle(fontSize: 18.sp, fontWeight: FontWeight.bold),
),
],
),
标题行使用Row布局,包含一个星星图标和文字。图标使用主题色蓝色,大小为24sp。图标和文字之间添加8个逻辑像素的间距。标题文字使用18sp的粗体字。
SizedBox(height: 16.h),
_DetailFeatureItem(
icon: Icons.edit,
title: '强大的编辑器',
description: '支持Markdown语法,富文本编辑',
),
_DetailFeatureItem(
icon: Icons.folder_special,
title: '灵活的组织',
description: '分类、文件夹、标签多维度管理',
),
标题下方添加16个逻辑像素的间距,然后是功能列表。使用自定义的_DetailFeatureItem组件展示每个功能。每个功能包含图标、标题和描述,提供更详细的信息。
_DetailFeatureItem(
icon: Icons.cloud_off,
title: '本地存储',
description: '数据完全本地化,保护隐私安全',
),
_DetailFeatureItem(
icon: Icons.speed,
title: '轻量快速',
description: '启动迅速,运行流畅,占用空间小',
),
],
),
),
);
}
后续的功能项继续使用_DetailFeatureItem组件。本地存储功能使用cloud_off图标,强调数据的本地化。轻量快速功能使用speed图标,突出应用的性能优势。
详细功能项组件
_DetailFeatureItem组件用于展示单个功能的详细信息:
class _DetailFeatureItem extends StatelessWidget {
final IconData icon;
final String title;
final String description;
const _DetailFeatureItem({
required this.icon,
required this.title,
required this.description,
});
_DetailFeatureItem接收三个参数:图标、标题和描述。这些参数都是必需的,确保每个功能项都包含完整的信息。组件是无状态的,只负责展示数据。
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.only(bottom: 16.h),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 40.w,
height: 40.w,
组件使用Padding包裹,底部添加16个逻辑像素的间距。Row用于水平排列图标和文字信息。crossAxisAlignment设置为start,让内容顶部对齐。
decoration: BoxDecoration(
color: const Color(0xFF2196F3).withOpacity(0.1),
borderRadius: BorderRadius.circular(12),
),
child: Icon(icon, color: const Color(0xFF2196F3), size: 20.sp),
),
SizedBox(width: 12.w),
图标容器使用主题色的半透明背景,圆角半径为12。图标颜色使用主题色蓝色,大小为20sp。图标容器和文字信息之间添加12个逻辑像素的间距。
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.w600),
),
SizedBox(height: 4.h),
Text(
description,
style: TextStyle(fontSize: 14.sp, color: Colors.grey[600]),
),
],
),
),
],
),
);
}
}
文字信息使用Expanded包裹,确保长文字可以自动换行。Column垂直排列标题和描述。标题使用16sp的半粗体字,描述使用14sp的灰色文字。标题和描述之间添加4个逻辑像素的间距。
总结
关于界面的实现展示了如何创建一个信息丰富、视觉美观、交互友好的页面。通过合理的布局、统一的风格、细致的优化,我们创建了一个高质量的关于界面。页面包含了应用的基本信息、功能特点、版本信息、开发者信息和社区链接,全面展示了应用的各个方面。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐
所有评论(0)