Flutter框架跨平台鸿蒙开发——Pattern Matching模式匹配

一、Pattern Matching概述

Pattern Matching提供了一种声明式的方式来处理数据结构。
是
否
是
否
表达式
匹配Pattern
是否匹配?
执行对应分支
尝试下一分支
还有分支?
执行默认分支
返回结果

|| 特性 | 说明 |

|------|------|

| 声明式 | 代码更清晰 |

| 类型安全 | 编译时检查 |

| 解构支持 | 同时匹配和提取 |

| 多层次 | 支持嵌套匹配 |

二、示例代码

dart 复制代码
class _Page04PatternDemo extends StatefulWidget {
  const _Page04PatternDemo();

  @override
  State<_Page04PatternDemo> createState() => _Page04PatternDemoState();
}

class _Page04PatternDemoState extends State<_Page04PatternDemo> {
  String _input = 'user:123';
  String _result = '';

  void _analyzeInput() {
    setState(() {
      _result = _analyzeUserInput(_input);
    });
  }

  String _analyzeUserInput(String input) {
    switch (input) {
      case 'admin':
        return '管理员权限';
      case final s when s.startsWith('user:'):
        return '用户ID: ${s.split(':')[1]}';
      case final s when s.startsWith('guest:'):
        return '访客: ${s.split(':')[1]}';
      case '':
        return '空输入';
      default:
        return '未知输入';
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.green.shade50,
      padding: const EdgeInsets.all(20),
      child: Column(
        children: [
          Container(
            padding: const EdgeInsets.all(20),
            decoration: BoxDecoration(
              color: Colors.green.shade600,
              borderRadius: BorderRadius.circular(20),
            ),
            child: const Column(
              children: [
                Icon(Icons.pattern, size: 48, color: Colors.white),
                SizedBox(height: 16),
                Text(
                  'Pattern Matching',
                  style: TextStyle(fontSize: 28, fontWeight: FontWeight.bold, color: Colors.white),
                ),
                SizedBox(height: 8),
                Text('模式匹配 - 页面 4/5', style: TextStyle(color: Colors.white70)),
              ],
            ),
          ),
          const SizedBox(height: 24),
          Expanded(
            child: Container(
              padding: const EdgeInsets.all(20),
              decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20)),
              child: Column(
                children: [
                  TextField(
                    decoration: InputDecoration(
                      labelText: '输入用户信息',
                      border: OutlineInputBorder(borderRadius: BorderRadius.circular(10)),
                      hintText: '试试: admin, user:123, guest:456',
                    ),
                    onChanged: (value) => _input = value,
                  ),
                  const SizedBox(height: 20),
                  ElevatedButton(
                    onPressed: _analyzeInput,
                    style: ElevatedButton.styleFrom(backgroundColor: Colors.green.shade600),
                    child: const Text('分析', style: TextStyle(color: Colors.white)),
                  ),
                  const SizedBox(height: 20),
                  if (_result.isNotEmpty)
                    Container(
                      padding: const EdgeInsets.all(16),
                      decoration: BoxDecoration(
                        color: Colors.green.shade100,
                        borderRadius: BorderRadius.circular(10),
                      ),
                      child: Text(_result, style: const TextStyle(fontSize: 18)),
                    ),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }
}

三、匹配流程

是
否
是
否
是
否
是
否
输入
匹配admin?
返回管理员权限
以user:开头?
提取并返回用户ID
以guest:开头?
返回访客信息
是空字符串?
返回空输入
返回未知输入

四、Pattern类型

Pattern 说明 示例
常量模式 匹配固定值 case 42:
变量模式 匹配任意值并绑定 case var x:
通配符模式 匹配任意值不绑定 case _:
记录模式 解构Record case (a, b):

五、最佳实践

  • ✅ 从具体到抽象排列case
  • ✅ 使用守卫条件提高精度
  • ✅ 充分利用解构
  • ❌ 避免过度嵌套

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

相关推荐
创世虚拟世界28 分钟前
我做了一个 3D 虚拟世界基底,基于这个再做 3D 虚拟世界或者元宇宙,会事半功倍
javascript·人工智能·3d·gitee·虚拟现实
Anhty35 分钟前
2026最新免费手机音频处理工具 !!
android·功能测试·ios·智能手机·音视频
Highcharts.js2 小时前
用Highcharts开发动态主从图表|双图联动的时间序列图表示例
javascript·数据库·信息可视化·highcharts·图表开发·动态图表
志尊宝2 小时前
Vue3 零基础每日笔记(076):防抖节流的正确使用——搜索框、按钮防重复提交、滚动监听
javascript·vue.js·笔记
2501_915909063 小时前
iOS应用从开发到上架App Store的完整发布流程与步骤指南
android·ios·小程序·https·uni-app·webview
能源革命3 小时前
Vue 网格拖拽布局组件全景指南:7 大方案深度对比
前端·javascript·vue.js
雷工笔记3 小时前
KingFusion 驾驶舱开发:ECharts小时模板实现动态时间窗口
javascript
知野小兔3 小时前
JavaScript中Map和Set详解
javascript
狗凯之家源码网3 小时前
AI 步数修改提交系统源码应用场景与落地指南
android·数据库·人工智能·运动步数