关于界面是应用中展示应用信息、版本号、开源协议等内容的重要页面。一个设计良好的关于页面不仅能够传达应用的基本信息,还能体现应用的品牌形象和开发者的用心。本文将详细介绍如何实现一个美观且功能完整的关于界面。
请添加图片描述

页面的基础结构

让我们从关于界面的基本代码开始:

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

Logo

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

更多推荐