首页 > 其他分享 >一统天下 flutter - dart: dart 3 新特性(元组,解构,switch 的模式匹配)

一统天下 flutter - dart: dart 3 新特性(元组,解构,switch 的模式匹配)

时间:2023-09-18 11:23:22浏览次数:46  
标签:log age 解构 var dart 元组 name

源码 https://github.com/webabcd/flutter_demo
作者 webabcd

一统天下 flutter - dart: dart 3 新特性(元组,解构,switch 的模式匹配)

示例如下:

lib\dart\dart3feature1.dart

/*
 * dart 3 新特性(元组,解构,switch 的模式匹配)
 *
 * dart 3 中新增了 Record 和 Pattern
 * Record 就是元组
 * Pattern 就是解构和 switch 的模式匹配
 *
 *
 * 升级 dart 需要先在 pubspec.yaml 中做如下配置,然后 flutter upgrade
 * environment:
 *   sdk: ">=3.0.0 <=3.1.2"
 */

import 'package:flutter/material.dart';
import 'package:flutter_demo/helper.dart';

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

  @override
  Widget build(BuildContext context) {

    // 元组
    sample1();
    // 一般数据的解构
    sample2();
    // json 数据的解构
    sample3();
    // 对象属性的解构
    sample4();
    // switch 的模式匹配
    sample5();

    return const MyWidget(text: "dart 3 新特性(元组,解构,switch 的模式匹配)");
  }

  void sample1() {
    // 元组用于将多个值组合成一个复合值
    var record1 = (1, "a", key:"value", );
    var a = record1.$1;   // 获取元组中的指定的元素的值,只能 get 不能 set
    var b = record1.$2;   // 获取元组中的指定的元素的值,只能 get 不能 set
    var c = record1.key;  // 获取元组中的指定的元素的值,只能 get 不能 set
    log("$a, $b, $c");

    // 定义元组的类型
    (int, String, {String key}) record2 = (1, "a", key:"value", );
    var d = record2.$1;
    var e = record2.$2;
    var f = record2.key;
    log("$d, $e, $f");

    // 判断两个元组是否相等
    var g = record1 == record2;
    // 判断元组的类型
    var h = record1 is (int, String, {String key});
    log("$g, $h");

    // 函数的返回值可以是一个元组类型
    var record3 = f1();
    log("${record3.$1}, ${record3.$2}");
  }
  // 函数的返回值可以是一个元组类型
  (String, int) f1() {
    return ("webabcd", 43);
  }

  void sample2() {
    // 解构一个元组数据
    var (name, age) = ("webabcd", 43);
    log("$name, $age");

    // 解构一个 List 数据
    var list = [1, 2, 3];
    var [a, b, c] = list;
    log("$a, $b, $c");

    // 解构一个 Map 数据
    var map = {"k1":"v1", "k2":"v2", };
    var {"k1":d, "k2":e} = map;
    log("$d, $e");

    Map<String, String> map2 = {'k1':'v1', 'k2':'v2', };
    // 解构一个 MapEntry 数据(一般写法)
    for (var MapEntry(key: myKey, value: myValue) in map2.entries) {
      log('$myKey, $myValue');
    }
    // 解构一个 MapEntry 数据(简便写法)
    for (var MapEntry(:key, :value) in map2.entries) {
      log('$key, $value');
    }

    var (f, g) = ('left', 'right');
    // 通过解构的方式交换两个变量
    (g, f) = (f, g);
    log('$f, $g');
  }

  void sample3() {
    var json = {
      'user': ['webabcd', 43]
    };

    // 解构一个 json 数据
    var {'user': [name, age]} = json;
    log("$name, $age");

    // 通过 case 实现如下逻辑
    // 如果一个 json 数据符合指定的类型,则返回 true 并解构
    if (json case {'user': [String name, int age]}) {
      log("$name, $age");
    }
  }

  void sample4() {
    var obj = _MyClass1(name: "webabcd", age: 43);

    // 解构一个对象的属性(一般写法)
    var _MyClass1(name:myName, age:myAge) = obj;
    log("$myName, $myAge");

    // 解构一个对象的属性(简便写法)
    var _MyClass1(:name, :age) = obj;
    log("$name, $age");
  }

  void sample5() {
    // 在 dart 3 中 switch 除了支持传统的常量匹配方式之外,还支持如下的模式匹配方式

    // 如果 List 中的第 1 个元素是 1 或 2,则 case 匹配成功,同时会将 List 中的第 2 个元素赋值给 a,将 List 中的第 3 个元素赋值给 b
    switch ([1, 10, 100]) {
      case [1 || 2, var a, var b]:
        log("$a, $b"); // 10, 100
    }

    // 支持条件匹配
    switch (10) {
      case >= 0 && <= 100:
        log(">= 0 && <= 100"); // >= 0 && <= 100
    }

    // 支持返回值(根据匹配的条件,返回指定的值)
    var c = switch (Colors.red) {
      Colors.red || Colors.green || Colors.blue => "red || green || blue",
      Colors.orange => "orange",
      _ => "other",
    };
    log("$c"); // red || green || blue

    // 通过 case 解构,并通过 when 匹配解构后的值
    switch (Colors.red) {
      case Color(value: var d) when d > 100:
        log("$d, ${Color(d)}"); // 4294198070, Color(0xfff44336)
    }
  }
}

class _MyClass1 {
  String name;
  int age;
  _MyClass1({required this.name, required this.age});
}

源码 https://github.com/webabcd/flutter_demo
作者 webabcd

标签:log,age,解构,var,dart,元组,name
From: https://www.cnblogs.com/webabcd/p/flutter_lib_dart_dart3feature1.html

相关文章

  • 一统天下 flutter - dart: dart 3 新特性(类相关)
    源码https://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-dart:dart3新特性(类相关)示例如下:lib\dart\dart3feature2.dart/**dart3新特性(类相关)***升级dart需要先在pubspec.yaml中做如下配置,然后flutterupgrade*environment:......
  • 46-字典-序列解包用于列表元组字典
          ......
  • 42-元组-生成器推导式创建元组-总结
           ......
  • 40-元组-特点-创建的两种方式_tuple()要点
     学完列表再学元祖,就半小时的事,很简单元祖很多方法都没有,不可变   活到80岁,人生也就20000天,成年后能挤出3年的学习时间都很不易了 快速学习,建立体系,不要事事求完美   若是单个数字后面要加逗号      ......
  • 41-元组-元素访问-计数方法_切片操作_成员资格判断_zip()
            ......
  • Android Studio中无法显示main.dart(Flutter项目在Android Studio中显示不全)
    问题描述创建完项目后只出现android文件选择ProjectFiles就会显示整个目录内容设置后......
  • 列表和元组的概念和操作(1)
    通用序列列表元组字符串通用的序列操作索引:可以使用例如greeting='Hello'greeting[0]这种操作获取第一个元素切片:切片适用于提取序列中的一部分,例如number=[1,2,3,4,5,6]number[1:4],输出的结果为[2,3,4],第一个索引是包含的第一个元素的编号,但第二个索引是切片......
  • Swift 中,元组(Tuple)
    在Swift中,元组(Tuple)是一种可以包含多个不同类型元素的数据结构。元组可以将多个值组合在一起,并且你可以为元组中的元素分配标签以便于访问。这是一个元组的示例:swiftletpair=(score:85,grade:"A")在这个例子中,我们创建了一个元组,它有两个元素:一个是整数类型的 score ......
  • C#7 里面的元组
    C#7.0是Microsoft于2017年发布的一个新版本的C#语言。C#7.0引入了许多新功能和改进,以帮助开发者更轻松地编写高效、简洁和可靠的代码。元组(Tuples)是C#7.0中的一个新特性,它允许开发者将多个值存储在一个单独的容器中,而不是使用一个类或结构来存储这些值。元组在C#7......
  • Python第四章序列(2):元组
    1.创建元组:  a=('a',2009) //与列表不同,用圆括号  a=()  a=(20,) //当元组中只包含一个元素的时候,需要在元素后加逗号,不然括号会被当成运算符2.元组访问:  a[1]   a[2:5] //也可以用切片  也可以用for的遍历。3.修改元组:  元组不允许......