鸿蒙+flutter 跨平台开发——亲戚关系计算器的开发与实现

🚀运行效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

📝 前言

在移动互联网时代,跨平台开发已成为主流趋势。鸿蒙(HarmonyOS)作为华为自主研发的分布式操作系统,与Flutter这一强大的跨平台UI框架的结合,为开发者提供了广阔的发展空间。本文将介绍如何使用鸿蒙+Flutter技术栈开发一款实用的亲戚关系计算器应用,展示跨平台开发的优势和实现细节。

🎮 应用介绍

功能概述

亲戚关系计算器是一款帮助用户快速计算和理解复杂亲戚关系的应用。用户可以通过选择不同的关系路径,快速获得相应的亲戚称呼,解决日常生活中遇到的亲戚关系困惑。

应用特点

  • 📱 跨平台兼容:支持鸿蒙、Android、iOS等多种操作系统
  • 🎨 响应式设计:自适应不同屏幕尺寸,提供良好的用户体验
  • 快速计算:基于关系图算法,快速准确地计算亲戚关系
  • 🌐 多区域支持:支持不同区域的亲戚称呼习惯(默认、北方地区、粤语惯用)
  • 👨‍👩‍👧‍👦 双向计算:支持"我称呼对方"和"对方称呼我"两种计算模式

🏗️ 系统架构

技术栈

技术 版本 用途
Flutter 3.0+ UI框架
Dart 3.0+ 开发语言
HarmonyOS SDK 3.0+ 鸿蒙平台支持

项目结构

lib/
├── main.dart                      # 应用入口
├── relation_calculator/           # 关系计算器模块
│   ├── models/                    # 数据模型
│   │   └── relation.dart          # 关系模型
│   ├── screens/                   # 页面
│   │   └── relation_calculator_screen.dart  # 关系计算器页面
│   └── utils/                     # 工具类
│       └── relation_calculator.dart  # 关系计算工具
└── widgets/                       # 通用组件

核心流程图

用户选择区域模式

用户选择性别

用户选择称呼方式

用户选择关系路径

系统计算关系

显示计算结果

回退操作

清空操作

重新选择参数

🚀 核心功能实现

1. 数据模型设计

关系模型 (relation.dart)

/// 性别枚举
enum Gender {
  /// 男性
  male,
  
  /// 女性
  female,
}

/// 关系类型枚举
enum RelationType {
  /// 父系关系
  paternal,
  /// 母系关系
  maternal,
  /// 配偶关系
  spouse,
  /// 子女关系
  children,
  /// 兄弟姐妹关系
  sibling,
  /// 其他关系
  other,
}

/// 亲戚关系模型
class Relation {
  /// 关系名称
  final String name;
  /// 关系路径
  final List<String> path;
  /// 关系类型
  final RelationType type;
  /// 是否需要考虑性别
  final bool genderSpecific;
  
  /// 构造函数
  const Relation({
    required this.name,
    required this.path,
    required this.type,
    this.genderSpecific = false,
  });
}

2. 关系计算算法

关系计算器 (relation_calculator.dart)

/// 亲戚关系计算器
class RelationCalculator {
  /// 关系图,键为关系路径,值为关系名称
  final Map<List<String>, String> _relationMap = {
    // 父母关系
    ['father']: '父亲',
    ['mother']: '母亲',
    ['father', 'father']: '祖父',
    ['father', 'mother']: '祖母',
    ['mother', 'father']: '外祖父',
    ['mother', 'mother']: '外祖母',
    // 更多关系定义...
  };

  /// 计算从当前角色到目标角色的关系
  /// [path] - 关系路径
  /// [gender] - 当前角色性别
  String calculateRelation(List<String> path, Gender gender) {
    // 尝试直接匹配完整路径
    if (_relationMap.containsKey(path)) {
      return _relationMap[path]!;
    }

    // 尝试匹配不考虑性别的路径
    final genderNeutralPath = path.where((p) => p != 'male' && p != 'female').toList();
    if (_relationMap.containsKey(genderNeutralPath)) {
      return _relationMap[genderNeutralPath]!;
    }

    // 尝试反向匹配
    for (final entry in _reverseRelationMap.entries) {
      if (_isPathMatch(entry.value, path)) {
        return entry.key;
      }
    }

    // 默认返回未知关系
    return '未知关系';
  }

  /// 检查两个路径是否匹配
  bool _isPathMatch(List<String> pattern, List<String> path) {
    if (pattern.length != path.length) {
      return false;
    }

    for (int i = 0; i < pattern.length; i++) {
      if (pattern[i] != path[i] && pattern[i] != '*') {
        return false;
      }
    }

    return true;
  }

  // 其他方法...
}

3. 响应式UI设计

关系计算器页面 (relation_calculator_screen.dart)

/// 亲戚关系计算器页面
class RelationCalculatorScreen extends StatefulWidget {
  /// 构造函数
  const RelationCalculatorScreen({super.key});

  
  State<RelationCalculatorScreen> createState() =>
      _RelationCalculatorScreenState();
}

class _RelationCalculatorScreenState extends State<RelationCalculatorScreen> {
  /// 区域模式
  RegionMode _regionMode = RegionMode.defaultMode;
  
  /// 当前选择的性别
  Gender _selectedGender = Gender.male;
  
  /// 称呼方式
  CallMode _callMode = CallMode.meToYou;
  
  /// 当前选择的关系路径
  List<String> _selectedPath = [];
  
  /// 计算结果
  List<String> _results = [];

  
  Widget build(BuildContext context) {
    final screenWidth = MediaQuery.of(context).size.width;
    final isMobile = screenWidth < 600;
    final padding = isMobile ? 16.0 : 24.0;

    return Scaffold(
      appBar: AppBar(
        title: const Text('亲戚关系计算器'),
        backgroundColor: Colors.blue,
        centerTitle: true,
        elevation: 0,
      ),
      body: SafeArea(
        child: SingleChildScrollView(
          padding: EdgeInsets.all(padding),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              // 区域模式选择
              // 性别选择
              // 称呼方式选择
              // 关系路径输入框
              
              // 关系按钮(响应式网格布局)
              GridView.count(
                shrinkWrap: true,
                physics: const NeverScrollableScrollPhysics(),
                crossAxisCount: isMobile ? 4 : 5,
                mainAxisSpacing: 15,
                crossAxisSpacing: 15,
                childAspectRatio: 1,
                children: _relationButtons.map((button) {
                  return ElevatedButton(
                    onPressed: () => _addRelation(button['value']!),
                    style: ElevatedButton.styleFrom(
                      backgroundColor: Colors.white,
                      foregroundColor: Colors.black,
                      shape: const CircleBorder(),
                      padding: EdgeInsets.all(isMobile ? 16 : 20),
                      elevation: 3,
                    ),
                    child: Text(
                      button['label']!,
                      style: TextStyle(fontSize: isMobile ? 18 : 20),
                    ),
                  );
                }).toList(),
              ),
              
              // 操作按钮
              // 结果显示
            ],
          ),
        ),
      ),
    );
  }

  // 其他方法...
}

4. 关系计算逻辑

/// 计算关系
void _calculateRelation() {
  if (_selectedPath.isEmpty) {
    setState(() {
      _results = ['请选择关系路径'];
    });
    return;
  }

  // 实现简单的关系计算逻辑
  String result = _calculateRelationName(_selectedPath);

  setState(() {
    _results = [result];
  });
}

/// 根据关系路径计算关系名称
String _calculateRelationName(List<String> path) {
  if (path.isEmpty) {
    return '请选择关系路径';
  }

  // 简单的路径匹配示例
  String pathStr = path.join('->');

  // 示例匹配规则
  final relationMap = {
    'mother->sister->son->daughter->father': '姨哥',
    'mother->brother->son': '表兄',
    'father->brother->daughter': '堂姐',
    'father->sister->daughter': '表姐',
    // 更多匹配规则...
  };

  // 查找匹配的关系
  if (relationMap.containsKey(pathStr)) {
    return relationMap[pathStr]!;
  }

  // 根据路径长度返回不同的结果
  switch (path.length) {
    case 1:
      return _getSingleRelationName(path[0]);
    case 2:
      return _getDoubleRelationName(path[0], path[1]);
    case 3:
      return _getTripleRelationName(path[0], path[1], path[2]);
    default:
      return '${path.length}级关系';
  }
}

🎨 响应式设计实现

1. 屏幕适配策略

final screenWidth = MediaQuery.of(context).size.width;
final isMobile = screenWidth < 600;
final padding = isMobile ? 16.0 : 24.0;

2. 网格布局适配

GridView.count(
  crossAxisCount: isMobile ? 4 : 5,
  mainAxisSpacing: 15,
  crossAxisSpacing: 15,
  childAspectRatio: 1,
  // 其他属性
);

3. 按钮样式适配

ElevatedButton(
  style: ElevatedButton.styleFrom(
    shape: const CircleBorder(),
    padding: EdgeInsets.all(isMobile ? 16 : 20),
    elevation: 3,
  ),
  child: Text(
    button['label']!,
    style: TextStyle(fontSize: isMobile ? 18 : 20),
  ),
  // 其他属性
);

🧪 测试与优化

测试策略

  • 单元测试:测试关系计算算法的准确性
  • UI测试:测试不同屏幕尺寸下的布局效果
  • 功能测试:测试各功能模块的完整性和正确性
  • 用户测试:收集用户反馈,优化用户体验

性能优化

  • 🔍 算法优化:使用关系图算法,提高计算效率
  • 📦 资源优化:减少不必要的资源加载
  • 🚀 响应速度优化:优化UI渲染,提高应用响应速度

📱 鸿蒙平台适配

适配要点

  1. 权限配置:在config.json中配置必要的权限
  2. 鸿蒙特性支持:利用鸿蒙的分布式能力,实现多设备协同
  3. 主题适配:适配鸿蒙系统主题,提供一致的视觉体验
  4. 性能优化:针对鸿蒙设备进行性能调优

构建与运行

# 构建鸿蒙HAP包
flutter build ohos

# 运行到鸿蒙设备
flutter run

📈 应用展望

未来功能规划

  • 语音输入:支持语音输入关系路径
  • 关系可视化:以图形方式展示亲戚关系图谱
  • 自定义关系:支持用户自定义亲戚关系
  • 社交分享:支持将计算结果分享到社交媒体
  • AI智能推荐:根据用户使用习惯,智能推荐常用关系

技术发展方向

  • 鸿蒙分布式能力:进一步利用鸿蒙的分布式特性,实现多设备协同
  • Flutter 3.0+新特性:采用Flutter的最新特性,提升应用性能和开发效率
  • AI技术融合:引入AI技术,实现更智能的关系计算和推荐

🎯 总结

本文介绍了使用鸿蒙+Flutter技术栈开发亲戚关系计算器的全过程,包括应用设计、系统架构、核心功能实现、响应式设计等方面。通过跨平台开发技术,实现了一款功能完整、用户体验良好的亲戚关系计算器应用。

鸿蒙+Flutter的结合,为开发者提供了强大的跨平台开发能力,不仅可以降低开发成本,还可以充分利用各平台的特性,提供更好的用户体验。相信在未来,这种技术组合将会在更多领域得到广泛应用。


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

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐