Dart 3 Record 语法快速入门指南

简介: 学习如何使用Dart中的record类型,这种匿名、不可变的聚合类型将帮助您更高效地管理数据。

Dart 3 Record 语法快速入门指南

视频

https://youtu.be/06WmVjp06D0

https://www.bilibili.com/video/BV1Kt42157Xv/

前言

原文 https://ducafecat.com/blog/dart-syntax-record-usage-guide

学习如何使用Dart中的record类型,这种匿名、不可变的聚合类型将帮助您更高效地管理数据。

了解如何定义和使用,以及常见使用场景。

参考

https://dart.dev/language/records

在线编辑器

https://dartpad.dev/

定义 Record 类型

快速定义

  var name = 'Bob';
  var age = 20;
  var isVip = true;

  var userInfo = (name, age, isVip);

  print('name: ${userInfo.$1}');
  print('age: ${userInfo.$2}');
  print('isVip: ${userInfo.$3}');

需要通过 userInfo.$1 的方式访问

命名定义

  var name = 'Bob';
  var age = 20;
  var isVip = true;

  var userInfo = (name: name, age: age, isVip: isVip);

  print('name: ${userInfo.name}');
  print('age: ${userInfo.age}');
  print('isVip: ${userInfo.isVip}');

通过 name: name 方式指定名称,方便调用 userInfo.name

指定类型

  (String, int, bool) userInfo = (name, age, isVip);

  print('name: ${userInfo.$1}');
  print('age: ${userInfo.$2}');
  print('isVip: ${userInfo.$3}');

指定命名类型

  ({
   
   String name, int age, bool isVip}) userInfo =
      (name: name, age: age, isVip: isVip);

  print('name: ${userInfo.name}');
  print('age: ${userInfo.age}');
  print('isVip: ${userInfo.isVip}');

定义赋值分开写

// 定义
({
   
   String name, int age, bool isVip}) userInfo;

// 赋值
userInfo = (name: name, age: age, isVip: isVip);

解构方式读取

// 定义,赋值
({
   
   String name, int age, bool isVip}) userInfo =
      (name: name, age: age, isVip: isVip);

// 解构读取
final (:name, :age, :isVip) = userInfo(json);
print("$name, $age, $isVip");

使用场景

直接返回经纬度

({
   
   double latitude, double longitude}) getLocation() {
   
   
  // 返回经纬度
  return (latitude: 37.7749, longitude: -122.4194);
}

void main(List<String> arguments) {
   
   
  var location = getLocation();
  print(
      "Location latitude: ${location.latitude}, longitude: ${location.longitude}");
}

函数方式处理 json 数据

// 函数
(String name, int age) userInfo(Map<String, dynamic> json) {
   
   
  return (json['name'] as String, json['age'] as int);
}

// 数据
final json = <String, dynamic>{
   
   
  'name': 'Dash',
  'age': 10,
  'color': 'blue',
};

// 执行处理
var (name, age) = userInfo(json);

/* Equivalent to:
  var info = userInfo(json);
  var name = info.$1;
  var age  = info.$2;
*/

合并数据集合

如返回博客文章,我们需要一次返回文章、评论、关联推荐.

以前原来我们需要定义一个返回类 Class。

class ArticleDetail {
   
   
  final String article;
  final List<String> comments;
  final List<String> related;

  ArticleDetail(this.article, this.comments, this.related);
}
Future<ArticleDetail> GetArticle(String uri) async {
   
   
  String article;
  List<String> comments;
  List<String> related;

  ...

  return ArticleDetail(article, comments, related);
}

现在直接返回 Record 对象

Future<({
   
   String article, List comments, List related})> getArticle(String uri) async {
   
   
  String article;
  List<String> comments;
  List<String> related;

  ...

  return  (article: article, comments: comments, related: related);
}
void main(List<String> arguments) {
   
   
  final (:article, :comments, :related) = getArticle(123);
}

小结

今天讲了下 Record 的匿名、命名定义、赋值使用,以及使用场景,优点我总结如下:

  • 减少了繁琐的类型定义
  • 快速集合多个数据
  • 配合解构使用 : 冒号语法
  • 适合处理 map 数据转模型 class

感谢阅读本文

如果有什么建议,请在评论中让我知道。我很乐意改进。


© 猫哥
ducafecat.com

end

相关文章
|
3月前
|
Dart 数据安全/隐私保护
Dart笔记:Dart 语言中的存取器及其用法解析
Dart笔记:Dart 语言中的存取器及其用法解析
51 0
|
6月前
|
Go
Go 语言 errgroup 库的使用方式和实现原理
Go 语言 errgroup 库的使用方式和实现原理
60 0
|
6月前
|
Dart
带你读《深入浅出Dart》十二、Dart库的使用和创建(1)
带你读《深入浅出Dart》十二、Dart库的使用和创建(1)
|
6月前
|
JSON 安全 Go
Go 语言怎么使用 zap 日志库?
Go 语言怎么使用 zap 日志库?
70 0
|
6月前
|
Go
Go 语言怎么使用变长参数函数?
Go 语言怎么使用变长参数函数?
27 0
|
3月前
|
存储 Dart 编译器
Dart笔记:Dart语言中的注解(元数据)
Dart笔记:Dart语言中的注解(元数据)
84 0
|
4月前
|
存储 Go 索引
Go 语言中 For 循环:语法、使用方法和实例教程
for循环用于多次执行特定的代码块,每次都可以使用不同的值。每次循环执行都称为一次迭代。for循环可以包含最多三个语句: 语法
46 0
|
6月前
|
Cloud Native 编译器 Go
100天精通Golang(基础入门篇)——第22天:深入探讨Go中的‘type‘关键字
100天精通Golang(基础入门篇)——第22天:深入探讨Go中的‘type‘关键字
51 0
|
6月前
|
JSON Dart 数据格式
带你读《深入浅出Dart》十四、Dart中使用JSON(2)
带你读《深入浅出Dart》十四、Dart中使用JSON(2)
|
6月前
|
JSON Dart IDE
带你读《深入浅出Dart》十四、Dart中使用JSON(3)
带你读《深入浅出Dart》十四、Dart中使用JSON(3)