在这里插入图片描述

说起关于页面,很多人觉得这是个可有可无的功能,无非就是显示个版本号、联系方式。但我自己做过几个App后发现,关于页面其实很重要。它是应用的名片,展示应用的基本信息,也是用户联系开发者的入口。一个好的关于页面,能提升应用的专业度和可信度。

为什么关于页面不可或缺

在开始写代码之前,我先想清楚了关于页面的价值。

第一个是信息透明。用户有权知道自己在用什么应用,版本是多少,开发者是谁。这些信息应该公开透明,让用户放心使用。

第二个是问题反馈。用户遇到问题时,需要一个渠道联系开发者。关于页面提供邮箱、官网、客服电话等联系方式,方便用户反馈。

第三个是法律合规。应用商店要求应用提供隐私政策、用户协议等法律文件。关于页面是放置这些文件的合适位置。

第四个是品牌展示。关于页面是展示应用品牌的窗口。应用图标、名称、介绍,这些都是品牌的一部分。一个精心设计的关于页面,能提升品牌形象。

功能设计的思路

在设计这个功能时,我考虑了以下几个方面。

简洁明了

关于页面不需要太复杂,信息要简洁明了。用户打开这个页面,一眼就能看到想要的信息。

层次分明

信息要分组展示,比如应用信息一组,联系方式一组。这样看起来更清晰,不会乱。

视觉统一

关于页面的设计风格要和整个应用保持一致。颜色、字体、圆角,这些细节都要统一。

可点击的链接

邮箱、官网、电话这些联系方式应该是可点击的。点击邮箱打开邮件应用,点击官网打开浏览器,点击电话拨打电话。

页面整体结构

先看页面的基本框架:

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

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('关于'),
      ),
      body: SingleChildScrollView(
        padding: EdgeInsets.all(16.w),
        child: Column(
          children: [
            SizedBox(height: 40.h),
            _buildAppIcon(),
            SizedBox(height: 20.h),
            _buildAppName(),
            SizedBox(height: 8.h),
            _buildVersion(),
            SizedBox(height: 40.h),
            _buildInfoCard(),
            SizedBox(height: 20.h),
            _buildContactCard(),
          ],
        ),
      ),
    );
  }
}

StatelessWidget的选择

这里用了StatelessWidget,因为关于页面只是展示信息,没有用户交互导致的状态变化。所有信息都是静态的,不需要管理状态。

页面布局的六个部分

页面分成六块:应用图标、应用名称、版本号、应用介绍卡片、联系方式卡片。这个顺序是经过考虑的,从视觉焦点到详细信息,符合用户的阅读习惯。

外层用SingleChildScrollView包裹,这样内容超出屏幕时可以滚动。虽然关于页面内容不多,但加上滚动总是好的。

应用图标的设计

页面顶部是一个大大的应用图标:

Widget _buildAppIcon() {
  return Container(
    width: 100.w,
    height: 100.w,
    decoration: BoxDecoration(
      color: Colors.blue,
      borderRadius: BorderRadius.circular(20.r),
    ),
    child: Icon(Icons.apps, size: 60.sp, color: Colors.white),
  );
}

图标的大小

图标大小是100x100,比较大,很醒目。这是页面的视觉焦点,用户第一眼就会看到。

圆角的设计

图标用了圆角矩形,圆角半径是20。这是现代应用图标的标准样式,看起来更柔和。

颜色的选择

图标背景用蓝色,和应用的主题色一致。里面的图标用白色,形成对比。

实际项目中,应该用应用的真实图标,而不是Icons.apps这个占位图标。可以用Image.asset加载本地图片。

应用名称和版本号

图标下方是应用名称和版本号:

Widget _buildAppName() {
  return Text(
    '生活助手',
    style: TextStyle(fontSize: 24.sp, fontWeight: FontWeight.bold),
  );
}

Widget _buildVersion() {
  return Text(
    'Version 2.1.3',
    style: TextStyle(fontSize: 14.sp, color: Colors.grey),
  );
}

名称的样式

应用名称用24号大字,加粗,黑色。这是页面的标题,要醒目。

版本号的样式

版本号用14号小字,灰色。这是辅助信息,不需要太醒目。

版本号的格式

版本号用"Version X.Y.Z"的格式,这是国际通用的格式。X是主版本号,Y是次版本号,Z是修订号。

实际项目中,版本号应该从package_info_plus包读取,而不是硬编码:

Future<String> _getVersion() async {
  final packageInfo = await PackageInfo.fromPlatform();
  return 'Version ${packageInfo.version}';
}

应用介绍卡片

名称和版本号下方是应用介绍卡片:

Widget _buildInfoCard() {
  return Container(
    padding: EdgeInsets.all(20.w),
    decoration: BoxDecoration(
      color: Colors.white,
      borderRadius: BorderRadius.circular(12.r),
    ),
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text(
          '应用介绍',
          style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.bold),
        ),
        SizedBox(height: 12.h),
        Text(
          '生活助手是一款集健康管理、记账、待办事项等功能于一体的生活管理应用。帮助你更好地规划和管理日常生活,养成良好的生活习惯。',
          style: TextStyle(fontSize: 14.sp, height: 1.5, color: Colors.grey[700]),
        ),
      ],
    ),
  );
}

卡片的样式

卡片用白色背景,圆角12,和应用的其他卡片保持一致。内边距20,让内容不会太挤。

标题的样式

"应用介绍"这个标题用16号字,加粗,黑色。让用户知道下面是什么内容。

介绍文字的样式

介绍文字用14号字,行高1.5,深灰色。行高1.5让文字不会太挤,阅读起来更舒服。

介绍内容的撰写

介绍要简洁明了,一两句话说清楚应用是做什么的,有什么价值。不要写太长,用户没耐心看。

这段介绍突出了应用的核心功能(健康管理、记账、待办事项)和核心价值(规划和管理日常生活,养成良好习惯)。

联系方式卡片

应用介绍卡片下方是联系方式卡片:

Widget _buildContactCard() {
  return Container(
    padding: EdgeInsets.all(20.w),
    decoration: BoxDecoration(
      color: Colors.white,
      borderRadius: BorderRadius.circular(12.r),
    ),
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text(
          '联系我们',
          style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.bold),
        ),
        SizedBox(height: 12.h),
        _buildContactItem(Icons.email, '邮箱', 'support@lifehelper.com'),
        _buildContactItem(Icons.language, '官网', 'www.lifehelper.com'),
        _buildContactItem(Icons.phone, '客服', '400-123-4567'),
      ],
    ),
  );
}

Widget _buildContactItem(IconData icon, String label, String value) {
  return Padding(
    padding: EdgeInsets.only(bottom: 12.h),
    child: Row(
      children: [
        Icon(icon, size: 20.sp, color: Colors.blue),
        SizedBox(width: 12.w),
        Text(
          '$label: ',
          style: TextStyle(fontSize: 14.sp, color: Colors.grey),
        ),
        Text(
          value,
          style: TextStyle(fontSize: 14.sp),
        ),
      ],
    ),
  );
}

联系方式的三种类型

提供了三种联系方式:

  • 邮箱:用户可以发邮件反馈问题或建议
  • 官网:用户可以访问官网了解更多信息
  • 客服电话:用户可以打电话咨询

这三种方式覆盖了不同的用户需求。有人喜欢发邮件,有人喜欢打电话,有人喜欢看官网。

图标的选择

每种联系方式有自己的图标:

  • 邮箱:Icons.email,信封图标
  • 官网:Icons.language,地球图标
  • 客服:Icons.phone,电话图标

这些图标都是蓝色,和应用的主题色一致。大小20,不会太大也不会太小。

文字的布局

每个联系方式是一行,包含图标、标签、值三个部分。标签用灰色,值用黑色,形成层次关系。

可点击的联系方式

联系方式应该是可点击的,点击后执行相应的操作:

Widget _buildContactItem(IconData icon, String label, String value, VoidCallback onTap) {
  return GestureDetector(
    onTap: onTap,
    child: Padding(
      padding: EdgeInsets.only(bottom: 12.h),
      child: Row(
        children: [
          Icon(icon, size: 20.sp, color: Colors.blue),
          SizedBox(width: 12.w),
          Text(
            '$label: ',
            style: TextStyle(fontSize: 14.sp, color: Colors.grey),
          ),
          Expanded(
            child: Text(
              value,
              style: TextStyle(
                fontSize: 14.sp,
                decoration: TextDecoration.underline,
                color: Colors.blue,
              ),
            ),
          ),
        ],
      ),
    ),
  );
}

下划线的添加

可点击的文字加上下划线,用蓝色显示,让用户知道这是个链接。这是网页的标准做法,用户很熟悉。

点击事件的处理

点击邮箱,打开邮件应用:

Future<void> _launchEmail(String email) async {
  final uri = Uri(scheme: 'mailto', path: email);
  if (await canLaunchUrl(uri)) {
    await launchUrl(uri);
  }
}

点击官网,打开浏览器:

Future<void> _launchWebsite(String url) async {
  final uri = Uri.parse('https://$url');
  if (await canLaunchUrl(uri)) {
    await launchUrl(uri);
  }
}

点击电话,拨打电话:

Future<void> _launchPhone(String phone) async {
  final uri = Uri(scheme: 'tel', path: phone);
  if (await canLaunchUrl(uri)) {
    await launchUrl(uri);
  }
}

这些功能需要用到url_launcher包。

法律文件的链接

关于页面还应该包含隐私政策和用户协议的链接:

_buildLegalLinks() {
  return Row(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
      TextButton(
        onPressed: () {
          // 打开隐私政策页面
        },
        child: const Text('隐私政策'),
      ),
      Text('|', style: TextStyle(color: Colors.grey)),
      TextButton(
        onPressed: () {
          // 打开用户协议页面
        },
        child: const Text('用户协议'),
      ),
    ],
  );
}

这两个链接通常放在页面底部,用小字显示。点击后跳转到对应的法律文件页面。

应用信息的获取

实际项目中,应用信息应该动态获取,而不是硬编码。可以用package_info_plus包:

Future<void> _loadAppInfo() async {
  final packageInfo = await PackageInfo.fromPlatform();
  
  setState(() {
    _appName = packageInfo.appName;
    _version = packageInfo.version;
    _buildNumber = packageInfo.buildNumber;
    _packageName = packageInfo.packageName;
  });
}

这样获取的信息是准确的,不会因为手动更新忘记改代码。

版本更新检查

关于页面还可以加个"检查更新"按钮,让用户主动检查是否有新版本:

ElevatedButton(
  onPressed: () async {
    await _checkForUpdate();
  },
  child: const Text('检查更新'),
)

Future<void> _checkForUpdate() async {
  // 从服务器获取最新版本号
  final latestVersion = await _fetchLatestVersion();
  final currentVersion = await _getCurrentVersion();
  
  if (_isNewerVersion(latestVersion, currentVersion)) {
    // 有新版本,提示用户更新
    _showUpdateDialog(latestVersion);
  } else {
    // 已是最新版本
    ScaffoldMessenger.of(context).showSnackBar(
      const SnackBar(content: Text('已是最新版本')),
    );
  }
}

开发者信息

如果是个人开发者,可以在关于页面加上开发者信息,比如名字、头像、个人网站:

Widget _buildDeveloperInfo() {
  return Container(
    padding: EdgeInsets.all(20.w),
    decoration: BoxDecoration(
      color: Colors.white,
      borderRadius: BorderRadius.circular(12.r),
    ),
    child: Row(
      children: [
        CircleAvatar(
          radius: 30.r,
          backgroundImage: AssetImage('assets/developer_avatar.png'),
        ),
        SizedBox(width: 16.w),
        Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              '开发者',
              style: TextStyle(fontSize: 12.sp, color: Colors.grey),
            ),
            Text(
              '张三',
              style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.bold),
            ),
          ],
        ),
      ],
    ),
  );
}

这样能让应用更有人情味,用户知道背后是个真实的人在维护。

致谢信息

如果应用用了开源库或第三方服务,可以在关于页面加上致谢信息:

Widget _buildAcknowledgements() {
  return Container(
    padding: EdgeInsets.all(20.w),
    decoration: BoxDecoration(
      color: Colors.white,
      borderRadius: BorderRadius.circular(12.r),
    ),
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text(
          '致谢',
          style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.bold),
        ),
        SizedBox(height: 12.h),
        Text(
          '本应用使用了以下开源项目:\n• Flutter\n• fl_chart\n• get\n• shared_preferences',
          style: TextStyle(fontSize: 14.sp, color: Colors.grey[700]),
        ),
      ],
    ),
  );
}

这是对开源社区的尊重,也是开源协议的要求。

实际使用体验

这个关于页面我自己看了很多次,感觉设计得还不错。信息简洁明了,一眼就能看到想要的内容。

应用图标、名称、版本号放在最上面,很醒目。应用介绍和联系方式分成两个卡片,层次分明。

联系方式可以点击,很方便。想发邮件反馈问题,点一下邮箱就打开了邮件应用。想看官网,点一下就打开了浏览器。

整个页面的设计风格和应用保持一致,颜色、字体、圆角都统一。看起来很专业,不像是随便做的。

可以改进的地方

如果要做得更完善,可以考虑以下几点。

更新日志

可以加个"更新日志"按钮,点击后显示历史版本的更新内容。这样用户能知道每个版本都改了什么。

评分和反馈

可以加个"给我们评分"按钮,引导用户去应用商店评分。好评对应用的推广很重要。

社交媒体链接

如果应用有官方微博、微信公众号、Twitter等社交媒体账号,可以在关于页面加上链接。

彩蛋

可以在关于页面藏个彩蛋,比如连续点击应用图标10次,显示一个隐藏功能或开发者的话。这种小惊喜能增加用户的好感。

多语言支持

如果应用支持多语言,关于页面的文字也应该翻译。特别是应用介绍,要让不同语言的用户都能看懂。

小结

今天实现了关于页面与应用信息功能,用到了卡片布局、图标、文字样式等组件。核心是展示应用的基本信息和联系方式,让用户了解应用,方便反馈问题。

这个功能虽然简单,但很重要。它是应用的名片,展示应用的专业度和可信度。一个好的关于页面,能提升用户对应用的信任。

在实现过程中,我特别注重信息的组织。应用图标、名称、版本号、介绍、联系方式,这些信息按重要程度排列,符合用户的阅读习惯。联系方式可以点击,方便用户操作。整个页面的设计风格统一,看起来很专业。

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

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐