<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Dart 2.13 版現(xiàn)已發(fā)布

      作者 / Kevin Moore & Michael Thomsen

      Dart 2.13 版現(xiàn)已發(fā)布,其中新增了類型別名功能,這是目前用戶呼聲第二高的語言功能。Dart 2.13 還改進(jìn)了 Dart FFI 以及更好的性能,并且我們還為 Dart 提供了新的官方鏡像。本文將為您奉上 2.12 版中推出的空安全功能的最新信息,介紹 2.13 版本的新特性,以及 Docker 和 Google Cloud 對 Dart 后端支持的新消息。另外,還會預(yù)告在后續(xù)版本中的其他變化。

      空安全更新

      在今年 3 月份發(fā)布的 Dart 2.12 中,我們推出了 健全的空安 全功能??瞻踩芍^是 Dart 最近推出的一項(xiàng)重要功能,旨在幫助您避免空值錯誤 (這類錯誤經(jīng)常難以發(fā)現(xiàn)),有效提升工作效率。我們希望發(fā)布 package 的開發(fā)者能夠及時跟進(jìn)這項(xiàng)發(fā)布,更新 pub.dev 上分享的 package 以支持空安全。

      我們極其欣喜地看到,在發(fā)布后的短短幾個月內(nèi),空安全就已被廣泛采用,目前 pub.dev 上前 500 個最受歡迎的 package 中,93% 的 package 已經(jīng)支持空安全。 在此,謹(jǐn)向如此迅速跟進(jìn)的所有 package 開發(fā)者致以最誠摯的謝意,感謝大家?guī)椭苿诱麄€生態(tài)系統(tǒng)不斷向前!

      有了這么多 package 支持空安全,您就可以開始考慮著手將自己的應(yīng)用遷移到使用空安全的環(huán)境。要開始遷移,請首先使用 dart pub outdated 檢查應(yīng)用的依賴項(xiàng)。詳細(xì)步驟,請參閱 空安全遷移指南。我們還調(diào)整了 dart createflutter create 模板,現(xiàn)在它們在新的應(yīng)用程序和 package 中默認(rèn)啟用空安全。

      推出類型別名功能

      類型別名是 2.13 版中新增的語言功能,也是廣大開發(fā)者翹首以盼的功能,曾在語言問題的反饋中高居 第二位。有了這一功能,開發(fā)者就能夠創(chuàng)建函數(shù)類型的別名,但不能創(chuàng)建其他任何類型。

      利用類型別名您可以為任何現(xiàn)有的類型創(chuàng)建新的名稱,然后將新創(chuàng)建的名稱用在原始類型可以出現(xiàn)的任何地方。創(chuàng)建新名稱并不會真的定義一個新類型,只不過是引入一個簡短的別名而已。該別名甚至能通過類型等同測試:

      typedef Integer = int;
      
      void main() {
        print(int == Integer); // true
      }
      

      那么,類型別名可以怎么用?一種常見的用法是給某類型指定一個更短或更具描述性的名稱,以便您的代碼更易于理解和維護(hù)。

      比如,給 JSON 類型指定別名就是種不錯的用法 (此示例由 GitHub 用戶 Levi-Lesches 提供,特此感謝)。在下列示例中,我們可以定義一個新的類型別名 Json,它將一個 JSON 文檔描述為一個 map,其鍵為 String,值為任意值 (使用動態(tài)類型)。這樣,當(dāng)我們定義名為 fromJson 的構(gòu)造函數(shù)和 json get函數(shù)時,就能使用該 Json 類型別名。

      typedef Json = Map<String, dynamic>;
      
      class User {
        final String name;
        final int age;
      
        User.fromJson(Json json) : 
          name = json['name'],
          age = json['age'];
      
        Json get json => {
          'name': name, 
          'age': age,
        };
      }
      

      您也可以對指代某個類的類型別名調(diào)用構(gòu)造函數(shù),比如以下示例就非常合規(guī):

      main() {
        var j = Json();
        j['name'] = 'Michael';
      }
      

      通過使用類型別名來指代復(fù)雜類型,可以讓讀者更容易理解您代碼的不變量。例如,以下代碼定義了一個類型別名來描述鍵值為泛型類型 X、值為類型 List<X> 的映射。如果給該類型指定一個具有單一類型參數(shù)的名稱,映射的常規(guī)結(jié)構(gòu)在代碼讀者眼中會變得更為清晰。

      typedef MapToList<X> = Map<X, List<X>>;
      void main() {
        MapToList<int> m = {};
        m[7] = [7]; // OK
        m[8] = [2, 2, 2]; // OK
        for (var x in m.keys) {
          print('$x --> ${m[x]}');
        }
      }
      
      =>
      
      7 --> [7]
      8 --> [2, 2, 2]
      

      如果您嘗試使用不匹配的類型,將出現(xiàn)分析錯誤:

      m[42] = ['The', 'meaning', 'of', 'life']; 
      
      
      =>
      
      The element type 'String' can't be assigned to the list type 'int'.
      

      您甚至可以使用類型別名來重命名公共庫中的類。假設(shè)現(xiàn)在公共庫中有一個 PoorlyNamedClass 類,您想要將它重命名為 BetterNamedClass。如果您只是重命名該類,那么您的 API 客戶那邊將會出現(xiàn)突發(fā)編譯錯誤。而使用類型別名,則不會出現(xiàn)這一問題,您可以隨意重命名,只不過要先為舊的類名稱定義一個新的類型別名,再給舊名稱添加幾行 @Deprecated 注解。這樣,使用 PoorlyNamedClass 的代碼雖然會出現(xiàn)警告,但仍可繼續(xù)編譯并照舊正常運(yùn)行,讓用戶有時間升級其代碼。

      mylibrary.dart:
      
      class BetterNamedClass {}
      
      @Deprecated('Use BetterNamedClass instead')
      typedef PoorlyNamedClass = BetterNamedClass;
      
      main.dart
      
      
      import 'mylibrary.dart';
      
      
      void main() {
        PoorlyNamedClass p;
      }
      
      =>
      
      'PoorlyNamedClass' is deprecated and shouldn't be used. Use BetterNamedClass instead.
      

      下面介紹實(shí)現(xiàn) BetterNamedClass 和棄用 PoorlyNamedClass 的方法 (在一個名為 mylibrary.dart 的文件中)。

      class BetterNamedClass {...}
      
      @Deprecated('Use BetterNamedClass instead')
      typedef PoorlyNamedClass = BetterNamedClass;
      

      下面是嘗試使用 PoorlyNamedClass 時會發(fā)生的情況:

      import 'mylibrary.dart';
      void main() {
       PoorlyNamedClass p;
      }
      =>
      'PoorlyNamedClass' is deprecated and shouldn't be used. Use BetterNamedClass instead.
      

      類型別名功能從 Dart 2.13 版開始即可使用,要啟用此功能,需要將您 pubspec 中版本較低的 Dart SDK 約束設(shè)置為最低 2.13 版,如下所示:

      environment:
        sdk: ">=2.13.0 <3.0.0"
      

      此功能支持向后兼容,這要?dú)w功于 語言的版本管理。也就是說,SDK 約束版本低于 2.13 的 package 可以安全地引用 2.13 版 package 中定義的類型別名,盡管 2.13 版之前的 package 不能定義其自己的類型別名。

      Dart 2.13 FFI 的變化

      我們還在 Dart FFI (這是用來調(diào)用 C 語言代碼的互操作機(jī)制) 中引入了一些新功能。

      首先,F(xiàn)FI 現(xiàn)在支持包含內(nèi)聯(lián)數(shù)組 (#35763) 的結(jié)構(gòu)。假設(shè)某 C 語言結(jié)構(gòu)具有如下內(nèi)聯(lián)數(shù)組:

      struct MyStruct {
        uint8_t arr[8];
      }
      

      現(xiàn)在,只需將包含一個類型實(shí)參的元素類型指定給 Array,即可直接將該結(jié)構(gòu)體封裝在 Dart 中,如下所示:

      class StructInlineArray extends Struct {
        @Array(8)
        external Array<Uint8> arr;
      }
      

      其次,F(xiàn)FI 現(xiàn)在支持封裝結(jié)構(gòu)體 (#38158)。結(jié)構(gòu)體通常都被放置在內(nèi)存中,以便其位于地址邊界內(nèi)的成員能夠被 CPU 更輕松地存取。使用 封裝結(jié)構(gòu)體 時,為了減少整體內(nèi)存占用量,經(jīng)常會以平臺特有的方式忽略一些填充字節(jié)。借助新的 @Packed(<alignment>) 注解,您可以輕松指定填充字節(jié)。例如,下列代碼創(chuàng)建的結(jié)構(gòu)體就指定其在內(nèi)存中時的字節(jié)對齊為 4。

      @Packed(4)
      class TASKDIALOGCONFIG extends Struct {
        @Uint32()
        external int cbSize;
        @IntPtr()
        external int hwndParent;
        @IntPtr()
        external int hInstance;
        @Uint32()
        external int dwFlags;
      …
      }
      

      Dart 2.13 在性能方面的提升

      我們一直在不斷努力降低 Dart 代碼的應(yīng)用體量和內(nèi)存占用量。在大型 Flutter 應(yīng)用中,經(jīng)過 AOT 編譯 Dart 程序的元數(shù)據(jù)的內(nèi)部結(jié)構(gòu)可能要占用非??捎^的內(nèi)存。這些元數(shù)據(jù)的存在大多是為了實(shí)現(xiàn)熱重載、交互式調(diào)試,以及格式化可讀堆棧軌跡等功能,這些功能在需要部署的應(yīng)用中從不會用到。過去幾年來,我們一直在重構(gòu) Dart 原生運(yùn)行時環(huán)境,以便盡可能多地消除這種開銷。其中一些改進(jìn)適用于所有以版本模式構(gòu)建的 Flutter 應(yīng)用,而有些則需要使用 --split-debug-info 標(biāo)志將 AOT 編譯應(yīng)用中的調(diào)試信息拆分出來,從而放棄可讀的堆棧軌跡。

      Dart 2.13 在內(nèi)存消耗上取得了很大的進(jìn)步,在使用 --split-debug-info 時,程序元數(shù)據(jù)占用的空間量降幅顯著。例如,F(xiàn)lutter Gallery 的空間占用降幅達(dá)到 30%: 在 --split-debug-info 模式下,程序元數(shù)據(jù)在 Dart 2.12 中要占用 5.7Mb,而在 Dart 2.13 中僅需 3.7Mb。以 Flutter Gallery 應(yīng)用為例,在 Android 平臺上,包含調(diào)試信息的發(fā)布 APK 大小為 112.4MB,不包含的情況下大小為 106.7MB (總體積減少了 5%)。該 APK 中包含了大量的資源。僅從 APK 內(nèi)部的元數(shù)據(jù)體積來說,從 Dart 2.12 平臺上的 5.7MB 減少至 Dart 2.13 平臺上的 3.7MB (減少了35%!)。

      如果對您來說應(yīng)用體量和內(nèi)存占用量比較重要,可以使用 --split-debug-info 標(biāo)志省略調(diào)試信息。請注意,一旦這么做,您需要使用 symbolize 命令 來重新使堆棧軌跡可讀。

      Dart 官方 Docker 鏡像發(fā)布以及 Cloud 支持

      Dart 現(xiàn)在在 官方鏡像 中可用,雖然 Dart 早已提供了 Docker 鏡像,但為了遵循最佳實(shí)踐,這些 新的 Dart 鏡像 是由 Docker 進(jìn)行測試和驗(yàn)證的。它們還支持 AOT 編譯,可以大大減少構(gòu)建容器的大小,并且可以在容器環(huán)境中提升部署速度——如 Cloud Run。

      雖然 Dart 始終專注于使 Flutter 等應(yīng)用框架在每個屏幕上構(gòu)建出色的界面,但我們意識到,大多數(shù)用戶體驗(yàn)的背后至少有一個托管服務(wù)。通過讓 Dart 輕松構(gòu)建后端服務(wù)來支持全棧體驗(yàn),開發(fā)者可以使用與前端 widget 相同的語言和業(yè)務(wù)邏輯,將他們的應(yīng)用擴(kuò)展到云端。

      通常來說,將 Dart 用于 Flutter 應(yīng)用程序的后端,特別符合 Google 無服務(wù)器管理平臺 Cloud Run 的簡單性和可擴(kuò)展性。這也包括零擴(kuò)展,意味著當(dāng)您的后端不處理任何請求時,就不會產(chǎn)生成本。我們與 Google Cloud 團(tuán)隊(duì)合作,提供 Dart 的函數(shù)框架,這是一個 packages、工具和實(shí)例的集合,使開發(fā)者們能夠輕松地編寫 Dart 函數(shù),以取代處理 HTTP 請求和 CloudEvents 的完整服務(wù)器部署。

      您可以查看我們的 Google Cloud 官方文檔 以便開始使用。

      后續(xù)更新預(yù)告

      在接下來的版本中,還會有一些令人激動的改變。和以往一樣,您可以使用 language funnel 追蹤器留意我們的后續(xù)工作。

      我們一直努力改進(jìn)的一個方面是,為 Dart 和 Flutter 定義一組新的 canonical lint。lint 是配置 Dart 靜態(tài)分析 的一種高效方式,但由于可能有成百上千個 lint 要啟用或禁用,有時可能會難以抉擇。眼下,我們正打算定義兩組要在 Dart 和 Flutter 項(xiàng)目中默認(rèn)應(yīng)用的 canonical lint。預(yù)計(jì)這兩組 lint 將在下一個穩(wěn)定版中默認(rèn)啟用。如果您想要提前預(yù)覽,請查看 lintsflutter_lints 這兩個 package。

      最后,如果您深度嵌套了 Dart VM 運(yùn)行時環(huán)境,請注意,我們打算棄用其現(xiàn)有的機(jī)制。我們將用一個基于 Dart FFI 的更快、更靈活的模型取代它 (請參閱追蹤問題 #45451)。

      Dart 2.13 版現(xiàn)已發(fā)布

      Dart 2.13 版現(xiàn)已在 Dart 2.13Flutter 2.2 SDK 中推出,此版本新增了類型別名功能,還改進(jìn)了 FFI。

      如果您一直在等待將自己的依賴項(xiàng)遷移到空安全環(huán)境的時機(jī),不妨使用 dart pub outdated 再次檢查一下。目前,前 500 個最受歡迎的 package 中,93% 的 package 都已遷移,現(xiàn)在沒準(zhǔn)就是您遷移的好時機(jī)。在此,謹(jǐn)向那些已經(jīng)遷移的開發(fā)者致以最衷心的感謝!

      歡迎試用本指南中介紹的新功能和改進(jìn)后的功能,并將您使用后的感想告訴我們。請?jiān)谙路皆u論區(qū)留言。

      posted on 2021-05-21 16:51  Flutter社區(qū)  閱讀(547)  評論(0)    收藏  舉報(bào)

      導(dǎo)航

      主站蜘蛛池模板: 久久久无码人妻精品无码| 欧美日本激情| 国产成人精品区一区二区| 曰韩无码二三区中文字幕| 2021亚洲va在线va天堂va国产| AV教师一区高清| 国产福利社区一区二区| 漳平市| 丰满熟妇乱又伦在线无码视频 | 少妇人妻偷人精品免费| 欧美日韩中文字幕视频不卡一二区| 4hu四虎永久在线观看| 丝袜a∨在线一区二区三区不卡 | 久久蜜臀av一区三区| 欧美寡妇xxxx黑人猛交| 黄瓜一区二区三区自拍视频 | 东京热一精品无码av| 无码人妻一区二区三区线| 国产网红女主播精品视频| 久久av高潮av喷水av无码| 竹菊影视欧美日韩一区二区三区四区五区 | 欧美日韩中文字幕久久伊人| 婷婷国产成人精品视频| 博乐市| 乱码精品一区二区亚洲区| 国产成人亚洲精品成人区| 国产精品熟女孕妇一区二区| 欧美成本人视频免费播放| 深夜av在线免费观看| 崇信县| 国产中文字幕久久黄色片| 无码人妻熟妇av又粗又大| 国产免费午夜福利在线播放| 亚洲中文字幕一区二区| 精品人妻午夜福利一区二区| 国产一区二区三区小说| 国产一级老熟女自拍视频| 麻豆成人传媒一区二区| 国产免费无遮挡吸奶头视频| 国产精品久久久久7777| 国产成人一区二区三区|