在这里插入图片描述

工具页面提供了各种实用工具,包括二维码生成、Hash计算、Base64编码等。这个页面使用GridView来展示所有可用的工具,让用户能够一眼看到所有工具。工具页面的设计强调了易用性和可扩展性,用户可以快速找到所需的工具,同时添加新工具也非常简单。

工具页面的整体架构

工具页面是一个StatelessWidget,因为它不需要维护任何状态。页面的核心是定义一个工具列表,然后使用GridView来展示这些工具。

class ToolsPage extends StatelessWidget {
  const ToolsPage({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    final tools = [
      {'icon': Icons.qr_code_2, 'title': '二维码生成'},
      {'icon': Icons.barcode_reader, 'title': '条形码生成'},
      {'icon': Icons.fingerprint, 'title': 'Hash计算'},
      {'icon': Icons.vpn_key, 'title': 'Base64编码'},
      {'icon': Icons.data_object, 'title': 'JSON格式化'},
      {'icon': Icons.search, 'title': '正则表达式'},
      {'icon': Icons.palette, 'title': '颜色选择器'},
      {'icon': Icons.straighten, 'title': '单位转换'},
      {'icon': Icons.text_fields, 'title': '文本转换'},
      {'icon': Icons.description, 'title': 'Markdown预览'},
      {'icon': Icons.calculate, 'title': '计算器'},
      {'icon': Icons.timer, 'title': '计时器'},
    ];

这个架构的设计思路很清晰。我们定义了一个tools列表,其中每个元素都是一个Map,包含了工具的图标和标题。这样的设计使得添加新工具变得非常简单,只需要在列表中添加新的Map即可。

工具列表的定义

工具列表是一个包含多个Map的列表。每个Map包含了工具的图标和标题。这样的设计有几个优点。

final tools = [
  {'icon': Icons.qr_code_2, 'title': '二维码生成'},
  {'icon': Icons.barcode_reader, 'title': '条形码生成'},
  {'icon': Icons.fingerprint, 'title': 'Hash计算'},
  {'icon': Icons.vpn_key, 'title': 'Base64编码'},
  {'icon': Icons.data_object, 'title': 'JSON格式化'},
  {'icon': Icons.search, 'title': '正则表达式'},
  {'icon': Icons.palette, 'title': '颜色选择器'},
  {'icon': Icons.straighten, 'title': '单位转换'},
  {'icon': Icons.text_fields, 'title': '文本转换'},
  {'icon': Icons.description, 'title': 'Markdown预览'},
  {'icon': Icons.calculate, 'title': '计算器'},
  {'icon': Icons.timer, 'title': '计时器'},
];

这个列表包含了12个工具。每个工具都有一个图标和标题。使用Map来存储工具信息的好处是,如果需要添加新的属性(比如工具的描述),只需要在Map中添加新的键值对即可,不需要修改其他代码。这样的设计提高了代码的灵活性和可维护性。

页面的布局结构

工具页面使用Scaffold作为基础容器。AppBar显示页面标题,body使用GridView来展示工具卡片。

return Scaffold(
  appBar: AppBar(title: const Text('工具箱')),
  body: GridView.count(
    crossAxisCount: 2,
    padding: EdgeInsets.all(12.w),
    mainAxisSpacing: 12.h,
    crossAxisSpacing: 12.w,
    children: tools.map((tool) {
      return ToolCard(
        icon: tool['icon'] as IconData,
        title: tool['title'] as String,
        onTap: () => _showToolDetail(context, tool['title'] as String),
      );
    }).toList(),
  ),
);

这个布局的设计很清晰。GridView.count 是一个网格布局组件,它根据指定的列数来排列子Widget。crossAxisCount: 2 表示每行显示2个工具卡片。这样的设计充分利用了屏幕宽度,同时保持了良好的可读性。

padding: EdgeInsets.all(12.w) 为整个GridView添加了内边距。mainAxisSpacing: 12.hcrossAxisSpacing: 12.w 分别设置了卡片之间的垂直和水平间距。这些间距使用flutter_screenutil的适配单位,确保在不同设备上都有合适的大小。

工具卡片的映射

工具列表通过map函数转换为ToolCard列表。这是一个函数式编程的例子。

children: tools.map((tool) {
  return ToolCard(
    icon: tool['icon'] as IconData,
    title: tool['title'] as String,
    onTap: () => _showToolDetail(context, tool['title'] as String),
  );
}).toList(),

map 函数将工具列表中的每个元素转换为一个ToolCard。as 操作符用来进行类型转换,确保从Map中取出的值具有正确的类型。toList() 将Iterable转换为List,这是GridView所需的。

这样的设计使得添加新工具变得非常简单。只需要在tools列表中添加新的Map,GridView会自动创建对应的ToolCard。

ToolCard组件的实现

ToolCard是一个自定义组件,用来展示工具的图标和标题。它类似于FeatureCard,但专门为工具页面设计。

class ToolCard extends StatelessWidget {
  final IconData icon;
  final String title;
  final VoidCallback onTap;

  const ToolCard({
    Key? key,
    required this.icon,
    required this.title,
    required this.onTap,
  }) : super(key: key);

  
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: onTap,
      child: Card(
        elevation: 2,
        child: Padding(
          padding: EdgeInsets.all(12.w),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Icon(icon, size: 40.sp, color: Colors.blue),
              SizedBox(height: 8.h),
              Text(
                title,
                style: TextStyle(fontSize: 14.sp, fontWeight: FontWeight.bold),
                textAlign: TextAlign.center,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

ToolCard是一个StatelessWidget,因为它不需要维护任何状态。它接收三个参数:icon、title和onTap。GestureDetector 用来处理点击事件。当用户点击卡片时,onTap回调会被触发。

Card 组件提供了卡片的基础样式,包括圆角和阴影。elevation: 2 设置了阴影深度。Padding 为卡片内容添加了内边距。Column 用来垂直排列图标和标题。mainAxisAlignment: MainAxisAlignment.center 使图标和标题居中对齐。

工具详情对话框

当用户点击任何工具卡片时,会显示一个对话框,提供工具的输入和输出界面。

void _showToolDetail(BuildContext context, String title) {
  showDialog(
    context: context,
    builder: (context) => AlertDialog(
      title: Text(title),
      content: SingleChildScrollView(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            TextField(
              maxLines: 4,
              decoration: InputDecoration(
                hintText: '输入内容',
                border: OutlineInputBorder(borderRadius: BorderRadius.circular(8.r)),
              ),
            ),
            SizedBox(height: 12.h),
            TextField(
              readOnly: true,
              maxLines: 4,
              decoration: InputDecoration(
                hintText: '输出结果',
                border: OutlineInputBorder(borderRadius: BorderRadius.circular(8.r)),
              ),
            ),
          ],
        ),
      ),
      actions: [
        TextButton(
          onPressed: () => Navigator.pop(context),
          child: const Text('关闭'),
        ),
        TextButton(
          onPressed: () => Navigator.pop(context),
          child: const Text('执行'),
        ),
      ],
    ),
  );
}

这个方法展示了如何使用AlertDialog来创建一个对话框。showDialog 函数显示一个对话框,builder参数是一个函数,返回对话框的Widget。

对话框的内容包含了两个主要部分。第一个 TextField 用来输入内容,用户可以在这里输入要处理的数据。maxLines: 4 允许用户输入多行文本。第二个 TextField 用来显示输出结果,readOnly: true 使其只读,防止用户修改输出结果。

SingleChildScrollView 包裹了Column,这确保了当对话框内容超过屏幕高度时,用户可以滚动查看。mainAxisSize: MainAxisSize.min 使Column只占用必要的高度。

对话框的底部有两个按钮:关闭和执行。关闭按钮调用 Navigator.pop(context) 关闭对话框。执行按钮在实际应用中应该调用相应的工具逻辑来处理输入数据。

工具的扩展性设计

工具页面的设计具有很好的扩展性。这是通过以下几个方面实现的。首先,工具列表是独立定义的,添加新工具只需要在列表中添加新的Map。其次,ToolCard是一个通用的组件,可以用来展示任何工具。最后,工具详情对话框是通用的,可以用来处理任何工具的输入和输出。

这样的设计使得添加新工具变得非常简单。例如,如果要添加一个"时间戳转换"工具,只需要在tools列表中添加新的Map即可。

工具页面的用户体验

工具页面的设计强调了易用性。用户可以一眼看到所有可用的工具,通过点击工具卡片来使用相应的工具。对话框提供了清晰的输入和输出界面,使用户能够快速完成工具的使用。

总结

工具页面通过使用GridView和ToolCard组件,提供了一个功能丰富的工具集合。工具列表的设计使得添加新工具变得非常简单。ToolCard组件提供了统一的工具展示方式。工具详情对话框提供了清晰的用户交互界面。这样的设计提供了良好的用户体验,并且具有很好的扩展性和可维护性。


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

Logo

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

更多推荐