Dart 3 Record 語法快速入門指南
視頻
https://www.bilibili.com/video/BV1Kt42157Xv/
前言
原文 https://ducafecat.com/blog/dart-syntax-record-usage-guide
學(xué)習(xí)如何使用Dart中的record類型遇骑,這種匿名熔掺、不可變的聚合類型將幫助您更高效地管理數(shù)據(jù)。
了解如何定義和使用泻拦,以及常見使用場景。
參考
https://dart.dev/language/records
在線編輯器
定義 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
方式指定名稱审磁,方便調(diào)用 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);
解構(gòu)方式讀取
// 定義肖油,賦值
({String name, int age, bool isVip}) userInfo =
(name: name, age: age, isVip: isVip);
// 解構(gòu)讀取
final (:name, :age, :isVip) = userInfo(json);
print("$name, $age, $isVip");
使用場景
直接返回經(jīng)緯度
({double latitude, double longitude}) getLocation() {
// 返回經(jīng)緯度
return (latitude: 37.7749, longitude: -122.4194);
}
void main(List<String> arguments) {
var location = getLocation();
print(
"Location latitude: ${location.latitude}, longitude: ${location.longitude}");
}
函數(shù)方式處理 json 數(shù)據(jù)
// 函數(shù)
(String name, int age) userInfo(Map<String, dynamic> json) {
return (json['name'] as String, json['age'] as int);
}
// 數(shù)據(jù)
final json = <String, dynamic>{
'name': 'Dash',
'age': 10,
'color': 'blue',
};
// 執(zhí)行處理
var (name, age) = userInfo(json);
/* Equivalent to:
var info = userInfo(json);
var name = info.$1;
var age = info.$2;
*/
合并數(shù)據(jù)集合
如返回博客文章,我們需要一次返回文章匆骗、評論、關(guān)聯(lián)推薦.
以前原來我們需要定義一個返回類 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);
}
現(xiàn)在直接返回 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);
}
小結(jié)
今天講了下 Record 的匿名碉就、命名定義、賦值使用闷串,以及使用場景瓮钥,優(yōu)點(diǎn)我總結(jié)如下:
- 減少了繁瑣的類型定義
- 快速集合多個數(shù)據(jù)
- 配合解構(gòu)使用
:
冒號語法 - 適合處理 map 數(shù)據(jù)轉(zhuǎn)模型 class
感謝閱讀本文
如果有什么建議,請?jiān)谠u論中讓我知道窿克。我很樂意改進(jìn)骏庸。
? 貓哥
ducafecat.com
end