
Flutter for OpenHarmony 家庭相册App实战 - 关于我们页面深度解析
关于我们页面虽然看起来简单,但它承载着应用与用户沟通的重要使命。一个设计精良的关于页面不仅能展示应用信息,还能建立用户信任,提升品牌形象。在家庭相册App中,我们希望通过这个页面让用户感受到产品的温度和团队的用心。
页面设计理念
在开始编码之前,我们需要明确页面的设计目标。关于我们页面要解决三个核心问题:这是什么应用、它能做什么、如何联系开发者。基于这个思路,我们把页面分为几个区域:顶部的应用标识区、版本信息卡片、应用介绍卡片、功能特性展示、操作按钮区和底部的社区信息。
dart
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class AboutScreen extends StatelessWidget {
const AboutScreen({super.key});
这里我们引入了flutter_screenutil包,它能帮助我们实现屏幕适配。在不同尺寸的设备上,UI元素的大小会按比例缩放,保证视觉效果的一致性。StatelessWidget足够满足需求,因为关于页面是纯展示型的,不需要管理状态。
应用标识区的设计
页面顶部是应用的视觉焦点,我们用渐变色背景和阴影效果来打造一个有质感的logo。
dart
Widget _buildAppHeader() {
return Center(
child: Column(
children: [
Container(
width: 100.w,
height: 100.w,
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [
Color(0xFFE91E63),
Color(0xFFF06292),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(24.r),
boxShadow: [
BoxShadow(
color: const Color(0xFFE91E63).withOpacity(0.3),
blurRadius: 20,
offset: const Offset(0, 8),
),
],
),
child: Icon(
Icons.photo_album,
size: 50,
color: Colors.white,
),
),
Container的decoration属性让我们能够实现复杂的视觉效果。LinearGradient创建从左上到右下的渐变,使用粉红色系符合家庭相册的温馨定位。borderRadius设置圆角,24.r表示24个逻辑像素,会根据屏幕密度自动调整。
boxShadow添加阴影效果,让logo有悬浮感。blurRadius控制模糊程度,offset设置阴影偏移,向下偏移8像素让阴影更自然。阴影颜色使用主色的半透明版本,保持视觉统一。
dart
SizedBox(height: 20.h),
Text(
'家庭相册',
style: TextStyle(
fontSize: 28.sp,
fontWeight: FontWeight.bold,
color: Colors.black87,
),
),
SizedBox(height: 8.h),
Text(
'记录家庭美好时光',
style: TextStyle(
fontSize: 15.sp,
color: Colors.grey[600],
letterSpacing: 0.5,
),
),
应用名称用大号加粗字体,28.sp的字号在手机上显示效果很好。Colors.black87是一个稍微透明的黑色,比纯黑色更柔和。副标题用较小的字号和灰色,形成视觉层次。letterSpacing设置字间距,让文字看起来更舒展。
版本信息的呈现
版本卡片用蓝色渐变背景,和顶部的粉色形成对比,让页面更有层次感。
dart
Widget _buildVersionCard() {
return Container(
padding: EdgeInsets.all(16.w),
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [
Color(0xFF2196F3),
Color(0xFF64B5F6),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(16.r),
boxShadow: [
BoxShadow(
color: const Color(0xFF2196F3).withOpacity(0.3),
blurRadius: 10,
offset: const Offset(0, 4),
),
],
),
child: Row(
children: [
Container(
padding: EdgeInsets.all(12.w),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.2),
borderRadius: BorderRadius.circular(12.r),
),
child: const Icon(
Icons.info_outline,
color: Colors.white,
size: 28,
),
),
左侧的图标容器用半透明白色背景,在蓝色渐变上形成玻璃质感的效果。这种设计在iOS和Material Design中都很流行,能够营造出现代感和科技感。
dart
SizedBox(width: 16.w),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'当前版本',
style: TextStyle(
fontSize: 13.sp,
color: Colors.white.withOpacity(0.9),
),
),
SizedBox(height: 4.h),
Text(
'v1.0.0',
style: TextStyle(
fontSize: 24.sp,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
版本号用大号字体突出显示,这是卡片的核心信息。Expanded组件让中间区域占据剩余空间,确保右侧的标签能够靠右对齐。crossAxisAlignment.start让文字左对齐,形成整齐的排版。
应用信息的结构化展示
应用信息卡片采用列表形式,每一行展示一个信息项。
dart
Widget _buildInfoCard() {
return Container(
padding: EdgeInsets.all(16.w),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16.r),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.05),
blurRadius: 10,
offset: const Offset(0, 2),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
padding: EdgeInsets.all(8.w),
decoration: BoxDecoration(
color: const Color(0xFF4CAF50).withOpacity(0.1),
borderRadius: BorderRadius.circular(8.r),
),
child: const Icon(
Icons.apps,
color: Color(0xFF4CAF50),
size: 20,
),
),
卡片标题区域用图标+文字的组合,图标放在带背景色的小容器中。这种设计让标题更醒目,同时通过颜色编码帮助用户快速识别不同的卡片类型。绿色代表应用信息,和后面的功能卡片(粉色)、链接卡片(紫色)形成区分。
dart
SizedBox(height: 16.h),
_buildInfoRow(
Icons.storage,
'应用大小',
'45.2 MB',
const Color(0xFF9C27B0),
),
_buildDivider(),
_buildInfoRow(
Icons.people,
'开发者',
'开源鸿蒙社区',
const Color(0xFF2196F3),
),
每个信息行都调用_buildInfoRow方法,传入图标、标签、值和颜色。这种封装让代码更简洁,也便于后续维护。不同的信息项使用不同的颜色,让页面更生动,避免单调。
功能特性的网格展示
功能特性用2列网格布局,每个功能占据一个格子,这种布局在有限的屏幕空间内能展示更多内容。
dart
Widget _buildFeaturesCard() {
final features = [
{
'icon': Icons.photo_library,
'title': '相册管理',
'desc': '轻松管理家庭照片',
'color': const Color(0xFFE91E63),
},
{
'icon': Icons.family_restroom,
'title': '家人信息',
'desc': '记录家庭成员信息',
'color': const Color(0xFF4CAF50),
},
我们用List来存储功能数据,这样便于维护和扩展。每个功能包含图标、标题、描述和颜色四个属性。在实际项目中,这些数据可能来自配置文件或后端接口,这里为了演示直接硬编码。
dart
GridView.count(
crossAxisCount: 2,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
mainAxisSpacing: 12.w,
crossAxisSpacing: 12.w,
childAspectRatio: 1.3,
children: features.map((feature) {
return Container(
padding: EdgeInsets.all(12.w),
decoration: BoxDecoration(
color: (feature['color'] as Color).withOpacity(0.05),
borderRadius: BorderRadius.circular(12.r),
border: Border.all(
color: (feature['color'] as Color).withOpacity(0.2),
),
),
GridView.count创建固定列数的网格,crossAxisCount设为2表示两列。shrinkWrap让GridView只占用实际需要的高度,而不是填满整个父容器。physics设为NeverScrollableScrollPhysics禁用GridView自己的滚动,因为外层已经有ScrollView了。
childAspectRatio控制格子的宽高比,1.3表示宽度是高度的1.3倍,这个比例让格子看起来比较舒展。每个格子用半透明的背景色和边框,颜色和功能的主题色一致。
操作按钮的交互设计
操作按钮区提供反馈、分享和评分三个功能,每个按钮都有清晰的视觉反馈。
dart
Widget _buildActionButton({
required IconData icon,
required String label,
required Color color,
required VoidCallback onTap,
}) {
return InkWell(
onTap: onTap,
borderRadius: BorderRadius.circular(12.r),
child: Container(
padding: EdgeInsets.all(16.w),
decoration: BoxDecoration(
color: color.withOpacity(0.05),
borderRadius: BorderRadius.circular(12.r),
border: Border.all(
color: color.withOpacity(0.2),
),
),
InkWell提供Material Design的水波纹点击效果,borderRadius参数让水波纹在圆角边界内扩散,不会溢出。这个细节很重要,能让交互效果更精致。
Container的decoration和功能卡片类似,用半透明背景色和边框。这种一致的设计语言让整个页面看起来很统一,用户能够快速理解哪些元素是可点击的。
dart
child: Row(
children: [
Container(
padding: EdgeInsets.all(8.w),
decoration: BoxDecoration(
color: color.withOpacity(0.1),
borderRadius: BorderRadius.circular(8.r),
),
child: Icon(icon, color: color, size: 20),
),
SizedBox(width: 12.w),
Expanded(
child: Text(
label,
style: TextStyle(
fontSize: 15.sp,
fontWeight: FontWeight.w500,
color: Colors.black87,
),
),
),
Icon(
Icons.chevron_right,
color: Colors.grey[400],
size: 20,
),
],
),
),
);
}
按钮内部是一个Row布局,左侧是带背景的图标,中间是文字标签,右侧是箭头。Expanded让文字区域占据中间的所有空间,确保箭头始终靠右。这种布局在移动应用中非常常见,用户一看就知道这是可以点击进入下一步的。
页脚社区信息
页脚展示社区信息和版权声明,用柔和的颜色和较小的字号,不抢夺主要内容的注意力。
dart
Widget _buildFooter() {
return Center(
child: Column(
children: [
Container(
padding: EdgeInsets.all(12.w),
decoration: BoxDecoration(
color: const Color(0xFFE91E63).withOpacity(0.1),
borderRadius: BorderRadius.circular(12.r),
),
child: Column(
children: [
Text(
'开源鸿蒙跨平台社区',
style: TextStyle(
fontSize: 15.sp,
fontWeight: FontWeight.w600,
color: const Color(0xFFE91E63),
),
),
SizedBox(height: 4.h),
Text(
'致力于为开发者提供优质的跨平台开发体验',
style: TextStyle(
fontSize: 12.sp,
color: Colors.grey[600],
),
textAlign: TextAlign.center,
),
],
),
),
社区信息用带背景的容器突出显示,粉色主题和顶部的logo呼应。文字居中对齐,简短的slogan让用户了解社区的定位。这种设计既能传达信息,又不会显得突兀。
dart
SizedBox(height: 16.h),
Text(
'Made with ❤️ by OpenHarmony Community',
style: TextStyle(
fontSize: 12.sp,
color: Colors.grey[500],
),
),
SizedBox(height: 8.h),
Text(
'Copyright © 2024 All Rights Reserved',
style: TextStyle(
fontSize: 11.sp,
color: Colors.grey[400],
),
),
],
),
);
}
版权信息用更小的字号和更浅的灰色,让它处于视觉层次的最底层。这是关于页面的标准做法,既满足了法律要求,又不会影响用户体验。
实现细节的打磨
在实际开发中,还有一些细节需要注意。比如应用大小的获取,可以通过读取安装包信息来实现。版本号应该从package_info_plus包读取,而不是硬编码。
操作按钮的点击事件在这个demo中只是简单的占位,实际项目中应该实现真实的功能。反馈功能可以跳转到反馈表单页面或打开邮件客户端,分享功能可以调用系统的分享面板,评分功能可以跳转到应用商店。
页面的滚动体验也很重要,我们使用SingleChildScrollView包裹整个内容,确保在小屏幕设备上也能流畅滚动。padding的设置要统一,保持视觉上的整齐。
总结
关于我们页面虽然功能简单,但设计上有很多讲究。通过合理的布局、统一的视觉语言和精心打磨的细节,我们打造了一个既美观又实用的页面。这个页面不仅能传达应用信息,还能提升用户对产品的信任感。
在实现过程中,我们大量使用了Container的decoration属性来实现丰富的视觉效果,用GridView和ListView来组织内容,用InkWell来添加交互反馈。这些都是Flutter开发中的常用技巧,掌握它们能够大大提升开发效率。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
完整代码展示
为了便于理解整个页面的结构,这里展示完整的实现代码。
dart
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class AboutScreen extends StatelessWidget {
const AboutScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('关于我们'),
elevation: 0,
),
body: ListView(
padding: EdgeInsets.all(16.w),
children: [
_buildAppHeader(),
SizedBox(height: 24.h),
_buildVersionCard(),
SizedBox(height: 16.h),
_buildInfoCard(),
SizedBox(height: 16.h),
_buildFeaturesCard(),
SizedBox(height: 16.h),
_buildActionsCard(),
SizedBox(height: 16.h),
_buildLinksCard(),
SizedBox(height: 24.h),
_buildFooter(),
],
),
);
}
}
代码组织方式:整个页面被拆分成多个小方法,每个方法负责构建一个区域。这种组织方式让代码结构清晰,易于维护和修改。如果需要调整某个区域的样式或内容,只需要修改对应的方法即可。
ListView的使用:所有内容放在ListView中,确保在小屏幕设备上也能流畅滚动。padding设置统一的内边距,SizedBox控制各区域之间的间距,形成有节奏的布局。
实战技巧分享
在开发关于我们页面时,有一些实用的技巧可以提升开发效率和页面质量。
技巧一:使用ScreenUtil进行屏幕适配
不同设备的屏幕尺寸差异很大,硬编码的像素值在某些设备上可能显示不正常。
dart
// 初始化ScreenUtil
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ScreenUtilInit(
designSize: const Size(375, 812),
builder: (context, child) {
return MaterialApp(
home: AboutScreen(),
);
},
);
}
}
适配原理说明:ScreenUtil根据设计稿尺寸和实际屏幕尺寸计算缩放比例,自动调整所有使用.w和.h后缀的数值。这样在不同设备上,UI元素的相对大小保持一致。
最佳实践建议:设计稿通常是375x812(iPhone X尺寸),以此为基准进行适配。字体大小用.sp,宽度用.w,高度用.h,这样能够保证在各种屏幕上都有良好的显示效果。
技巧二:渐变色的高级用法
渐变色能够让页面更有层次感,但要用得恰当。
dart
BoxDecoration(
gradient: LinearGradient(
colors: [
const Color(0xFFE91E63),
const Color(0xFFF06292),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
stops: [0.0, 1.0],
),
)
渐变参数详解:colors数组定义渐变的颜色,至少需要两个颜色。begin和end定义渐变的方向,从左上到右下是最常用的方向。stops数组定义每个颜色的位置,0.0表示起点,1.0表示终点。
颜色选择建议:渐变的两个颜色不要差异太大,否则会显得突兀。通常选择同一色系的深浅两个颜色,或者相邻色系的颜色。可以使用在线工具生成和谐的渐变色方案。
技巧三:阴影效果的精细控制
阴影能够增加UI的层次感,但过度使用会让页面显得脏乱。
dart
BoxShadow(
color: const Color(0xFFE91E63).withOpacity(0.3),
blurRadius: 20,
offset: const Offset(0, 8),
spreadRadius: 0,
)
阴影参数说明:color定义阴影颜色,通常使用元素主色的半透明版本。blurRadius控制模糊程度,值越大阴影越柔和。offset设置阴影偏移,向下偏移让阴影更自然。spreadRadius控制阴影扩散范围,通常设为0。
阴影使用原则:不是所有元素都需要阴影,只在需要突出的元素上使用。阴影的透明度不要太高,0.1-0.3是比较合适的范围。同一页面的阴影样式要保持一致。
性能优化要点
虽然关于我们页面通常不会有性能问题,但养成优化的习惯很重要。
优化一:使用const构造函数
能用const的地方尽量用const,这样Flutter可以复用Widget实例,减少内存占用。
dart
const Text(
'家庭相册',
style: TextStyle(
fontSize: 28,
fontWeight: FontWeight.bold,
),
)
const的作用:const关键字告诉Flutter这个Widget是不可变的,可以在编译时创建并复用。这样在页面重建时,不需要重新创建这些Widget,提升性能。
使用限制:只有所有参数都是编译时常量的Widget才能用const。如果参数包含变量或方法调用,就不能用const。
优化二:避免不必要的重建
StatelessWidget比StatefulWidget性能更好,因为它不需要管理状态。
dart
class AboutScreen extends StatelessWidget {
const AboutScreen({super.key});
@override
Widget build(BuildContext context) {
// 页面内容
}
}
Widget选择原则:如果页面不需要管理状态,就用StatelessWidget。只有在需要响应用户交互、更新UI时才用StatefulWidget。
性能影响分析:StatelessWidget的build方法只在必要时调用,而StatefulWidget可能因为setState被频繁调用。对于纯展示型页面,StatelessWidget是最佳选择。
优化三:图片资源的优化
如果页面包含图片,要注意图片的大小和格式。
dart
Image.asset(
'assets/images/logo.png',
width: 100.w,
height: 100.w,
cacheWidth: 200,
cacheHeight: 200,
)
图片优化建议:使用cacheWidth和cacheHeight参数限制图片在内存中的大小。即使显示尺寸是100x100,也可以缓存200x200的版本,在高分辨率屏幕上显示更清晰。
格式选择:PNG适合图标和透明图片,JPEG适合照片。WebP格式体积更小,但兼容性稍差。根据实际需求选择合适的格式。
用户体验提升
好的用户体验往往体现在细节上,这里分享一些提升体验的技巧。
体验提升一:加载状态处理
如果页面需要从网络获取数据,要提供加载状态提示。
dart
class AboutScreen extends StatefulWidget {
@override
State<AboutScreen> createState() => _AboutScreenState();
}
class _AboutScreenState extends State<AboutScreen> {
bool _isLoading = true;
@override
void initState() {
super.initState();
_loadData();
}
Future<void> _loadData() async {
// 模拟网络请求
await Future.delayed(const Duration(seconds: 2));
setState(() {
_isLoading = false;
});
}
@override
Widget build(BuildContext context) {
if (_isLoading) {
return const Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
}
return Scaffold(
// 正常内容
);
}
}
加载状态的重要性:用户不喜欢等待,但如果必须等待,至少要让他们知道应用在工作。CircularProgressIndicator是最简单的加载指示器,也可以使用骨架屏等更高级的方案。
超时处理:网络请求可能失败或超时,要有相应的错误处理。可以显示错误提示和重试按钮,让用户能够重新加载数据。
体验提升二:动画效果
适当的动画能够让页面更生动,但不要过度使用。
dart
AnimatedOpacity(
opacity: _isVisible ? 1.0 : 0.0,
duration: const Duration(milliseconds: 500),
child: _buildAppHeader(),
)
动画使用场景:页面进入时的淡入动画,卡片展开的动画,按钮点击的缩放动画等。这些微动画能够提升页面的精致感。
动画性能考虑:动画要流畅,帧率至少要达到60fps。避免在动画过程中执行耗时操作,使用Transform而不是改变布局属性,这样性能更好。
体验提升三:触觉反馈
在用户点击按钮时提供触觉反馈,增强交互感。
dart
InkWell(
onTap: () {
HapticFeedback.lightImpact();
// 执行操作
},
child: Container(
// 按钮内容
),
)
触觉反馈的作用:轻微的震动反馈能够让用户确认操作已被接收,提升交互的确定性。但要注意不要过度使用,否则会让用户觉得烦躁。
平台差异:iOS和Android的触觉反馈效果略有不同,要在真机上测试效果。有些用户可能关闭了系统的触觉反馈,要尊重用户的选择。
可访问性支持
让应用对所有用户友好,包括有障碍的用户。
语义化标签
为UI元素添加语义信息,帮助屏幕阅读器理解界面。
dart
Semantics(
label: '应用版本信息',
child: _buildVersionCard(),
)
Semantics(
button: true,
label: '意见反馈按钮',
child: _buildActionButton(
icon: Icons.feedback,
label: '意见反馈',
color: const Color(0xFF2196F3),
onTap: () {},
),
)
语义标签的重要性:视障用户依赖屏幕阅读器来使用应用,如果没有语义标签,他们可能无法理解界面内容。添加Semantics组件是一个简单但重要的工作。
标签编写原则:标签要简洁明了,描述元素的作用而不是外观。比如"意见反馈按钮"而不是"蓝色圆角按钮"。对于可交互元素,要标明它是按钮、链接还是开关。
对比度检查
确保文字和背景的对比度足够高,符合WCAG标准。
dart
// 好的对比度
Text(
'应用名称',
style: TextStyle(
color: Colors.black87, // 深色文字
backgroundColor: Colors.white, // 白色背景
),
)
// 不好的对比度
Text(
'应用名称',
style: TextStyle(
color: Colors.grey[400], // 浅灰色文字
backgroundColor: Colors.white, // 白色背景
),
)
对比度标准:WCAG AA级要求正文文字的对比度至少是4.5:1,大号文字至少是3:1。可以使用在线工具检查颜色组合的对比度是否符合标准。
实用建议:黑色文字配白色背景,白色文字配深色背景,这些经典组合的对比度都很好。避免使用浅灰色文字,除非是次要信息。
国际化实现
如果应用要支持多语言,关于我们页面的所有文字都需要国际化。
配置国际化
在pubspec.yaml中添加国际化支持。
yaml
dependencies:
flutter_localizations:
sdk: flutter
intl: ^0.18.0
flutter:
generate: true
创建语言文件
在l10n目录下创建arb文件定义不同语言的文字。
json
// app_en.arb
{
"aboutUs": "About Us",
"appName": "Family Album",
"appDescription": "Record beautiful family moments",
"currentVersion": "Current Version",
"appInfo": "App Information"
}
// app_zh.arb
{
"aboutUs": "关于我们",
"appName": "家庭相册",
"appDescription": "记录家庭美好时光",
"currentVersion": "当前版本",
"appInfo": "应用信息"
}
使用国际化文字
在代码中使用生成的AppLocalizations类。
dart
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
return Scaffold(
appBar: AppBar(
title: Text(l10n.aboutUs),
),
body: ListView(
children: [
Text(l10n.appName),
Text(l10n.appDescription),
],
),
);
}
国际化的好处:支持多语言能够扩大应用的用户群体,提升国际竞争力。即使目前只支持一种语言,也建议从一开始就使用国际化方案,这样后续添加新语言会很容易。
注意事项:不同语言的文字长度可能差异很大,要确保UI布局能够适应不同长度的文字。使用Expanded或Flexible组件让文字区域自适应。
测试策略
关于我们页面虽然简单,但也需要测试确保质量。
Widget测试
测试页面的UI渲染是否正确。
dart
testWidgets('About screen should display app name',
(WidgetTester tester) async {
await tester.pumpWidget(
MaterialApp(
home: AboutScreen(),
),
);
expect(find.text('家庭相册'), findsOneWidget);
expect(find.text('v1.0.0'), findsOneWidget);
});
测试的价值:自动化测试能够在代码修改后快速验证功能是否正常,避免引入新的bug。虽然编写测试需要时间,但长期来看能够提升开发效率。
测试覆盖率:不需要100%的测试覆盖率,重点测试核心功能和容易出错的地方。对于纯展示型页面,测试主要内容是否正确显示即可。
总结与最佳实践
关于我们页面是应用的重要组成部分,通过这篇文章我们学习了如何构建一个功能完善、体验良好的关于页面。
核心要点回顾:使用清晰的信息架构组织内容,用渐变色和阴影增加视觉层次,通过屏幕适配确保在不同设备上的显示效果,添加语义标签支持可访问性,实现国际化支持多语言。
开发建议:从简单开始,逐步完善。先实现基本功能,再优化性能和体验。使用Flutter提供的组件,不要重复造轮子。保持代码整洁,合理拆分方法。
持续改进:关于我们页面不是一次性的工作,随着应用的发展,可能需要添加新的内容或调整布局。保持代码的可维护性,让后续的修改更容易。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net