Flutter 在 Dart 3.8 開始支持 Null-Aware Elements 語法,自動識別集合里的空元素

近日,在 Dart 3.8 的 changelog 里正式提交了 Null-Aware Elements 語法,該語法糖可以用于在 List、Set、Map 等集合中處理可能為 null 的元素或鍵值對,簡化顯式檢查 null 的場景:

/之前
var listWithoutNullAwareElements = [if (promotableNullableValue != null) promotableNullableValue,if (nullable.value != null) nullable.value!,if (nullable.value case var value?) value,
];/之后
var listWithNullAwareElements = [?promotableNullableValue,?nullable.value,?nullable.value,
];

自然,在 Flutter 的 UI 聲明里,也可以簡化之前控件的 if 判斷,不得不說確實比起之前的寫法優雅不少:

/之前
Stack(fit: StackFit.expand,children: [const AbsorbPointer(),if (widget.child != null) widget.child!,],
)/之后
Stack(fit: StackFit.expand,children: [const AbsorbPointer(),?widget.child,],
)

同時,官方在分析了大量開源 Dart 代碼后(90019 個文件中的 17,941,439 行代碼),發現這類需要支持的場景更多是 Map

-- Surrounding collection (1812 total) --1566 ( 86.424%): Map   ===============================================241 ( 13.300%): List  ========5 (  0.276%): Set   =

而事實上,從以下例子可以看出來,在簡化 Map 上 Null-Aware Elements 的作用尤為明顯:

/之前
final tag = Tag()..tags = {if (Song.title != null) 'title': Song.title,if (Song.artist != null) 'artist': Song.artist,if (Song.album != null) 'album': Song.album,if (Song.year != null) 'year': Song.year.toString(),if (comments != null)'comment': comms!.asMap().map((key, value) => MapEntry<String, Comment>(value.key, value)),if (Song.numberInAlbum != null) 'track': Song.numberInAlbum.toString(),if (Song.genre != null) 'genre': Song.genre,if (Song.albumArt != null) 'picture': {pic.key: pic},}..type = 'ID3'..version = '2.4';/之后
final tag = Tag()..tags = {'title': ?Song.title,'artist': ?Song.artist,'album': ?Song.album,'year': ?Song.year?.toString(),if (comments != null)'comment': comms!.asMap().map((key, value) => MapEntry<String, Comment>(value.key, value)),'track': ?Song.numberInAlbum?.toString(),'genre': ?Song.genre,if (Song.albumArt != null) 'picture': {pic.key: pic},}..type = 'ID3'..version = '2.4';

通過下面的簡單例子,也可以看出來有了 Null-Aware Elements 之后在代碼簡化效果上很明顯:

當然,配合其他語法也能達到去 null 的效果,比如最簡單的 for 循環,通過 ?i ,就可以簡單到做排除空數據的目的:

當然,你可能會覺得本來 Dart 里就有很多 ? ,比如 ?? 、 ?. 之類,加上語法之后會不會有歧義?這個問題在目前的規則上看起來還行,例如此時的 ? 前通常是 ,[{ : 等符號,這些上下文和現有 ? 用法不同 :

var list = [1, ?foo]; // ? 是空感知元素,不是其他用法
var map = {key: ?value}; // ? 是空感知值,不是可空類型

并且前面介紹過,與現有語法如 iffor 元素結合時,? 出現在 if for 頭部后也不會有歧義:

var list = [for (var i in [1, 2]) ?i, // 合法:?i 是空感知元素
];
print(list); // 輸出: [1, 2]

而在 Flutter 里的 UI 編排了就更加直觀了:

當然,這個語法還是有一些規則限制,在這個規則下 expression 只能是一個普通表達式,不能是另一個集合,比如嵌套的 ? 或展開操作 ...

element ::=| nullAwareExpressionElement| nullAwareMapElement| // Existing productions...nullAwareExpressionElement ::= '?' expressionnullAwareMapElement ::=| '?' expression ':' '?'? expression // Null-aware key or both.|     expression ':' '?' expression  // Null-aware value.

例如下方代碼就可以很直觀展示這個錯誤使用,同時也沒有 ????foo?if (c) nullableThing else otherNullableThing 這樣的場景:

可以看到, Null-aware elements 語法不管是在邏輯代碼還是 UI 代碼都十分有用,雖然 Dart 3.8 還沒正式發布,但是你可以在 Flutter beta channel 提前體驗,那么,你覺這個語法符合你的審美嗎?

參考鏈接

  • https://github.com/dart-lang/language/blob/main/accepted/future-releases/0323-null-aware-elements/feature-specification.md

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78411.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78411.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SAIL-RK3588協作機器人運動控制器技術方案

一、核心能力與政策適配? ?政策合規性? 滿足工信部《智能機器人重點技術攻關指南》要求&#xff0c;支持 ?EtherCAT主站協議&#xff08;符合IEC 61158標準&#xff09;?&#xff0c;助力企業申報工業機器人研發專項補貼&#xff08;最高300萬元/項目&#xff09;?核心板…

Eigen幾何變換類 (Transform, Quaternion等)

1. Transform 類&#xff1a;仿射/射影變換 模板參數 cpp Transform<Scalar, Dim, Mode, Options> Scalar&#xff1a;數據類型&#xff08;如 float, double&#xff09;。 Dim&#xff1a;維度&#xff08;2 或 3&#xff09;。 Mode&#xff1a;變換類型&#xf…

openGauss手工配置主備

1、初始化 創建一個操作系統用戶&#xff0c;例如postgres&#xff0c;為這個用戶設置PATH和LD_LIBRARY_PATH環境變量&#xff0c;指向opengauss/bin和opengauss/lib export GAUSSHOME/mnt/disk01/opengauss export PATH$GAUSSHOME/bin:$PATH export LD_LIBRARY_PATH$GAUSS…

CSS預處理器對比:Sass、Less與Stylus如何選擇

引言 CSS預處理器已成為現代前端開發的標準工具&#xff0c;它們通過添加編程特性來增強純CSS的功能&#xff0c;使樣式表更加模塊化、可維護且高效。在眾多預處理器中&#xff0c;Sass、Less和Stylus是三個最流行的選擇&#xff0c;它們各自擁有獨特的語法和功能特點。本文將深…

基于Docker、Kubernetes和Jenkins的百節點部署架構圖及信息流描述

以下是基于Docker、Kubernetes和Jenkins的百節點部署架構圖及信息流描述,使用文本和Mermaid語法表示: 架構圖(Mermaid語法) #mermaid-svg-WWCAqL1oWjvRywVJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WWCAq…

js中get,set用法

1、作為對象的訪問器屬性 //使用Object.definePropertylet obj {_a:123};Object.defineProperty(obj, "a", {get() {return this._a;},set(val) {this._aval},});console.log(obj.a); //123obj.a456console.log(obj.a) // 456 //使用對象字面量let obj {_a:123,ge…

Steam游戲服務器攻防全景解讀——如何構建游戲級抗DDoS防御體系?

Steam游戲服務器的DDoS攻防體系設計&#xff0c;從協議層漏洞利用到業務連續性保障&#xff0c;深度拆解反射型攻擊、TCP狀態耗盡等7類威脅場景。基于全球15個游戲廠商攻防實戰數據&#xff0c;提供包含邊緣節點調度、AI流量指紋識別、SteamCMD加固配置的三維防護方案&#xff…

【AI】SpringAI 第四彈:接入本地大模型 Ollama

Ollama 是一個開源的大型語言模型服務工具。它的主要作用是幫助用戶快速在本地運行大模型&#xff0c; 簡化了在 Docker 容器內部署和管理大語言模型&#xff08;LLM&#xff09;的過程。 1. 確保Ollama 已經啟動 # 查看幫助文檔 ollama -h# 自動下載并啟動 ollama run deeps…

大語言模型的評估指標

目錄 一、混淆矩陣 1. 混淆矩陣的結構&#xff08;二分類為例&#xff09; 2.從混淆矩陣衍生的核心指標 3.多分類任務的擴展 4. 混淆矩陣的實戰應用 二、分類任務核心指標 1. Accuracy&#xff08;準確率&#xff09; 2. Precision&#xff08;精確率&#xff09; 3. …

SpringBoot Gradle插件:構建與打包配置

文章目錄 引言一、Spring Boot Gradle插件基礎二、依賴管理與配置三、應用打包配置四、啟動腳本與運行配置五、多環境構建與配置六、集成Docker與云原生支持七、實踐案例&#xff1a;自定義Spring Boot應用構建總結 引言 在Java生態系統中&#xff0c;Gradle作為一種靈活且強大…

Vue3 組件通信與插槽

Vue3 組件通信方式全解&#xff08;10種方案&#xff09; 一、組件通信方式概覽 通信方式適用場景數據流向復雜度Props/自定義事件父子組件簡單通信父 ? 子?v-model 雙向綁定父子表單組件父 ? 子??Provide/Inject跨層級組件通信祖先 → 后代??事件總線任意組件間通信任…

【KWDB 創作者計劃】_嵌入式硬件篇---數字電子器件

文章目錄 前言一、系列前綴(如 "74" 或 "54")74(商用級)54(工業級)二、邏輯家族(如 "LS"、"HC"、"HCT" 等)TTL(晶體管-晶體管邏輯)家族CMOS(互補金屬氧化物半導體)家族BiCMOS(雙極 CMOS)家族三、功能編號(如…

黃勇的《架構探險:從Java到大數據》內容詳解

《架構探險&#xff1a;從Java到大數據》內容詳解 1. 書籍核心主題 黃勇的《架構探險&#xff1a;從Java到大數據》是一本系統性探討架構設計演進的著作&#xff0c;結合Java技術棧和大數據場景&#xff0c;深入分析了從單體架構到分布式、微服務、云原生的演進路徑&#xff0…

【動手學強化學習】番外8-IPPO應用框架學習與復現

文章目錄 一、待解決問題1.1 問題描述1.2 解決方法 二、方法詳述2.1 必要說明&#xff08;1&#xff09;MAPPO 與 IPPO 算法的區別在于什么地方&#xff1f;&#xff08;2&#xff09;IPPO 算法應用框架主要參考來源 2.2 應用步驟2.2.1 搭建基礎環境2.2.2 IPPO 算法實例復現&am…

驅動開發硬核特訓 · Day 17:深入掌握中斷機制與驅動開發中的應用實戰

&#x1f3a5; 視頻教程請關注 B 站&#xff1a;“嵌入式 Jerry” 一、前言 在嵌入式驅動開發中&#xff0c;“中斷”幾乎無處不在。無論是 GPIO 按鍵、串口通信、網絡設備&#xff0c;還是 SoC 上的各種控制器&#xff0c;中斷都扮演著核心觸發機制的角色。對中斷機制掌握程度…

通過門店銷售明細表用PySpark得到每月每個門店的銷冠和按月的同比環比數據

假設我在Amazon S3上有銷售表的Parquet數據文件的路徑&#xff0c;包含ID主鍵、門店ID、日期、銷售員姓名和銷售額&#xff0c;需要分別用PySpark的SparkSQL和Dataframe API統計出每個月所有門店和各門店銷售額最高的人&#xff0c;不一定是一個人&#xff0c;以及他所在的門店…

PostgreSQL 常用日志

PostgreSQL 常用日志詳解 PostgreSQL 提供了多種日志類型&#xff0c;用于監控數據庫活動、排查問題和優化性能。以下是 PostgreSQL 中最常用的日志類型及其配置和使用方法。 一、主要日志類型 日志類型文件位置主要內容用途服務器日志postgresql-<日期>.log服務器運行…

MySQL 存儲過程:解鎖數據庫編程的高效密碼

目錄 一、什么是存儲過程?二、創建存儲過程示例 1:創建一個簡單的存儲過程示例 2:創建帶輸入參數的存儲過程示例 3:創建帶輸出參數的存儲過程三、調用存儲過程調用無參數存儲過程調用帶輸入參數的存儲過程調用帶輸出參數的存儲過程四、存儲過程中的流控制語句示例 1:使用 …

基于STM32的物流搬運機器人

功能&#xff1a;智能循跡、定距夾取、顏色切換、自動跟隨、自動避障、聲音夾取、藍牙遙控、手柄遙控、顏色識別夾取、循跡避障、循跡定距…… 包含內容&#xff1a;完整源碼、使用手冊、原理圖、視頻演示、PPT、論文參考、其余資料 資料只私聊

pg_jieba 中文分詞

os: centos 7.9.2009 pg: 14.7 pg_jieba 依賴 cppjieba、limonp pg_jieba 下載 su - postgreswget https://github.com/jaiminpan/pg_jieba/archive/refs/tags/vmaster.tar.gzunzip ./pg_jieba-master cd ~/pg_jieba-mastercppjieba、limonp 下載 su - postgrescd ~/pg_jie…