【文章翻譯】Announcing sound null safety

【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】

宣告可靠的空值安全

作者:Filip Hracek 和 Michael Thomsen

今天,Dart 團隊迎來了一個重要的里程碑,我們推出了空值安全功能的技術預覽版。空值安全可以幫助您避免一類通常難以發現的錯誤,並且額外帶來一系列效能提升。我們現在發佈的是早期技術預覽版,期待您的回饋。

這篇文章描述了 Dart 團隊推出空值安全的計劃。它還解釋了可靠的空值安全是什麼意思,以及它與許多其他語言採用的方法有何不同。

為什麼需要空值安全?

Dart 是一種型別安全語言。這意味著,當您取得某個型別的變數時,編譯器可以保證它是該型別的。但型別安全本身並不能保證變數不是空值。

空值錯誤非常常見。在 GitHub 上搜尋會發現由 Dart 程式碼中的空值引起的數千個問題,以及更多數千個提交試圖修復這些問題。

試著看看您是否可以在以下範例程式碼中發現可空性問題:

1
2
3
4
5
void printLengths(List<File> files) {
for (var file in files) {
print(file.lengthSync());
}
}

如果以空值呼叫此函式,它肯定會失敗,但還有第二種情況需要考慮:

1
2
3
4
5
6
7
void main() {
// 錯誤情況 1:將空值傳遞給 files。
printLengths(null);

// 錯誤情況 2:傳遞檔案列表,其中包含一個空值項目。
printLengths([File('filename1'), File('filename2'), null]);
}

空值安全功能可以解決這個問題:

有了空值安全,您可以更有信心地推斷您的程式碼。不再有煩人的執行階段空值解參考錯誤。相反,您會在編碼時得到靜態錯誤。

可靠的空值安全

Dart 的空值安全是可靠的。這意味著 Dart 可以 100% 確定在上面的範例中,files 列表及其中的元素都不能為空。當 Dart 分析您的程式碼並確定變數不可為空時,該變數始終不可為空:如果您在偵錯器中檢查正在執行的程式碼,您會看到不可空性在執行階段得以保留。相比之下,其他一些實作是不可靠的,並且在許多情況下仍然需要執行執行階段空值檢查。Dart 與 Swift 共享可靠的空值安全,但其他程式語言並不多。

Dart 的空值安全的可靠性還有另一個令人欣喜的含義:它意味著您的程式可以更小、更快。因為 Dart 確實確定 files 永遠不會為空,所以 Dart 可以優化。例如,Dart ahead-of-time (AOT) 編譯器可以產生更小、更快的原生程式碼,因為當它知道變數不為空時,它不需要加入空值檢查。

我們已經看到一些非常有希望的初步結果。例如,在模擬典型 Flutter 架構渲染模式的微基準測試中,我們看到了 19% 的效能提升

設計原則

在開始詳細設計空值安全之前,Dart 團隊定義了以下三個核心原則:

  • 預設不可為空。 除非您明確告訴 Dart 變數可以為空,否則它會將其視為不可為空。我們選擇此作為預設值,因為我們發現非空值是 API 中最常見的選擇。
  • 可逐步採用。 現有的 Dart 程式碼有很多。必須可以逐步遷移到空值安全,一部分一部分地遷移。在同一個專案中應該可以同時存在空值安全和非空值安全的程式碼。我們還將提供工具來幫助您進行遷移。
  • 完全可靠。 如上所述,Dart 的空值安全是可靠的。一旦您將整個專案和您的依賴項遷移到空值安全,您就可以獲得可靠性的全部好處。

使用空值安全宣告變數

核心語法很簡單。以下是一些以不同方式宣告的不可為空變數。記住,不可為空是預設值,因此這些宣告看起來和今天一樣,但它們的含義發生了變化。

1
2
3
4
// 在空值安全的 Dart 中,這些變數都不能為空。
var i = 42;
final b = Foo();
String m = '';

Dart 將確保您永遠不會將空值賦值給上述任何變數。如果您在一千行程式碼之後嘗試執行 i = null,您將收到靜態分析錯誤和紅色波浪線,並且您的程式將拒絕編譯。

如果您希望變數可以為空,您可以使用 ?,如下所示:

1
2
3
4
// 這些都是可為空的變數。
int? j = 1; // 之後可以為空。
final Foo? c = getFoo(); // 函式可能傳回空值。
String? n; // 最初為空。之後的任何時候也可以為空。

上述變數的行為與今天所有變數的行為相同。

您也可以在其他地方使用 ? 語法:

1
2
3
4
5
6
7
8
9
10
11
12
// 在函式參數中。
void boogie(int? count) {
// count 可能為空。
}

// 在函式傳回值中。
Foo? getFoo() {
// 可以傳回空值而不是 Foo。
}

// 也適用於:泛型、型別定義、型別檢查等。
// 以及上述的任何組合。

但是,再次強調,我們的夢想是您幾乎永遠不需要使用 ?。您的絕大多數型別都將是不可為空的。

讓空值安全更容易使用

Dart 團隊正在努力讓空值安全盡可能容易使用。例如,看看這段使用 if 檢查空值的程式碼:

1
2
3
4
5
6
7
8
9
10
void honk(int? loudness) {
if (loudness == null) {
// 未指定 loudness,以最大 loudness 通知開發人員。
_playSound('error.wav', volume: 11);
return;
}

// loudness 不為空,我們將其限制在可接受的級別。
_playSound('honk.wav', volume: loudness.clamp(0, 11));
}

請注意,Dart 如何聰明地意識到,當我們通過該 if 陳述句時,loudness 變數不可能為空。因此,Dart 允許我們直接呼叫 clamp() 方法,而無需額外操作。這種便利性是由一種稱為流程分析的東西實現的:Dart 分析器會像執行程式碼一樣瀏覽您的程式碼,自動找出有關程式碼的額外資訊。

以下是另一個範例,它顯示了一個 Dart 可以確定變數不為空的情況,因為我們總是為其賦值一個非空值:

1
2
3
4
5
6
7
8
9
10
11
12
13
int sign(int x) {
// 結果不可為空。
int result;

if (x >= 0) {
result = 1;
} else {
result = -1;
}

// 到這裡,Dart 知道 result 不可能為空。
return result;
}

如果您移除上述任何賦值(例如,刪除 result = -1; 行),Dart 就無法保證 result 將不為空:您將收到靜態錯誤,並且您的程式碼將無法編譯。

流程分析僅在函式內部有效。如果您有一個全域變數或類別欄位,那麼 Dart 就無法保證何時會為其賦值什麼值。Dart 無法模擬整個應用程式的流程。因此,當您知道變數在第一次讀取之前將不為空,但您無法立即初始化它時,可以使用新的 late 關鍵字。

1
2
3
4
5
6
7
class Goo {
late Viscosity v;

Goo(Material m) {
v = m.computeViscosity();
}
}

請注意,v 不可為空,儘管它最初未初始化。Dart 相信您在為 v 賦值一個非空值之前不會嘗試讀取它,並且您的程式碼可以編譯而不會出錯。

空值安全向下相容

Dart 團隊已經努力了一年多的時間,才讓空值安全進入技術預覽階段。這是自我們推出 Dart 2 以來,對 Dart 語言最大的補充。然而,它並不是一個重大變更。現有程式碼可以呼叫使用空值安全的程式碼,反之亦然。即使空值安全可用後,它也將是一個可選功能,您可以在準備就緒時採用。您現有的程式碼將繼續運行而不會發生變化

我們最近將 Dart 核心程式庫遷移到完全使用空值安全。作為空值安全向下相容的一個範例,我們替換了現有的核心程式庫,而沒有在 Dart 和 Flutter 測試環境中運行的現有測試和測試應用程式中造成任何損壞。我們甚至將新的核心程式庫推送到我們在 Google 內部的許多客戶,直接推送到他們的生產程式碼庫中,也沒有出現任何問題。我們計劃在該功能推出時將我們所有的套件和應用程式遷移到使用空值安全,我們希望您也能這樣做。但您可以按照自己的時間表,逐個套件、逐個應用程式地進行遷移。

空值安全路線圖

我們計劃分三個階段逐步推出空值安全:

  1. 技術預覽。 這是今天發佈的,並且在 Dart 的 dev channel 中可用。有關詳細資訊,請參閱下面的「立即試用」部分。事情仍然可能會發生變化,因此目前請勿在生產程式碼中使用空值安全。不過,請測試一下並 給我們回饋
  2. Beta 版。 空值安全將在 Dart 的 beta channel 中可用,並且不再需要 實驗性標誌。該功能將非常接近預期的最終版本。如果您擁有 pub.dev 套件或外掛,這是您可以開始遷移的時候,但您不應該將其發佈為穩定版本。
  3. 穩定版。 每個人都將擁有空值安全,並且您將被鼓勵將您遷移的套件和外掛發佈為穩定版本。您還應該遷移您的生產應用程式。

如果一切順利,我們計劃在今年年底之前將空值安全作為一個穩定功能發佈。從現在到那時,我們將加入工具來幫助您使您的程式碼空值安全,包括:

  • 一個遷移工具,以支援您自動執行升級現有套件和應用程式的許多步驟
  • pub.dev 上的標籤,以便您可以判斷套件是否支援空值安全
  • pub outdated 命令的擴展,支援尋找支援空值安全的最新版本的依賴項

立即試用

今天試用空值安全的最快方法是透過 nullsafety.dartpad.dev,這是一個啟用了空值安全的 DartPad 版本。打開「使用程式碼片段學習」下拉選單,可以找到一系列學習練習,逐步介紹空值安全的新語法和基礎知識。

您也可以在小型命令行程式中試用空值安全。(我們尚未遷移 Flutter 等較大的框架。)首先下載 dev channel Dart SDK 的副本,然後取得 此範例 Dart CLI 應用程式 的副本(GitHub 儲存庫zip 壓縮檔案)。範例應用程式的 README 檔案 中包含使用空值安全實驗標誌運行應用程式的說明。範例中的其他檔案提供了在 VS Code 和 Android Studio 中啟用偵錯的啟動設定。

我們也有文件,並計劃製作更多:

我們很高興將空值安全引入 Dart。可靠的空值安全是 Dart 的一個獨特功能,可以幫助您編寫更少錯誤的程式碼並獲得更好的效能。我們希望您在技術預覽中試用該功能,並透過我們的問題追蹤器 給我們回饋。編碼愉快!


宣告可靠的空值安全 最初發佈在 Dart 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

http://creativecommons.org/licenses/by/4.0/

【文章翻譯】Black Lives Matter

【文章內容使用 Gemini 1.5 Pro 自動產生】

黑人的命也是命

我們這週不會發佈 #FlutterGoodNewsWednesday 文章。

Flutter 和 Dart 團隊在此想藉此機會與黑人社群站在一起,並告訴您:我們與您同在,我們看到了您,我們支持您。本週美國發生的事件再次令人痛苦地意識到,系統性的種族主義仍然很普遍,正義在我們的社會中分配不均。

我們知道這些問題不是用三言兩語就能解決的;我們需要在個人和企業層面積極參與。我們也要承認,我們是問題的一部分,我們中的許多人需要努力檢視自己的偏見和特權。

我們鼓勵我們的團隊在本週花時間學習和反思如何成為更好的盟友,如何在我們自己的社群中更好地促進多元化。我們中有些人正在閱讀像 新吉姆·克勞 這樣的書籍,觀看像 第 13 號修正案 這樣的紀錄片;我們還發現這些指南很有幫助:白人銀河系指南留住眼淚:白人女性指南

我們將在本週剩下的時間保持安靜,專注於放大 有色人種的聲音


黑人的命也是命 最初發表在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】Two Months of

【文章內容使用 Gemini 1.5 Pro 自動產生】

兩個月的 #FlutterGoodNewsWednesday

當我們意識到今年春天將會很不一樣,沒有往常的活動和連線點時,我們決定尋找一種新的方式,將我們的各種公告與您分享。我們中的幾個人聚在一起,於是 #FlutterGoodNewsWednesday 就誕生了。在過去的兩個月裡,我們每個星期都會分享一些新的內容,希望讓您露出笑容。本週,我們想追蹤一下我們迄今為止所做的部分公告,並分享一些進一步的更新。

Flutter 開發人員的免費入門培訓

我們以宣布與 App Brewery 的安吉拉·余合作創建的 免費 10 小時以上入門課程,涵蓋 Flutter 開發的基礎知識。我們很高興地看到超過 75,000 人註冊了這個課程,並且已經有將近 5,000 人完成了(我十三歲的兒子就是其中之一!)對於正在學習這個課程的大家,希望您能發現 Discord 群組,Very Good Ventures 和一組志願者一直在那裡提供禮賓服務。我們也一直在向大家學習——特別是了解開始學習時的一些早期陷阱;我們將利用這些知識來改進文件和產品本身。

如果您快完成這個課程了,您可能會想知道「下一步是什麼?」我們有一些建議,其中涵蓋了中級主題:

CodePen Flutter 支援

我們還分享了關於 CodePen 採用 Flutter 的資訊。迄今為止,我們已經看到來自世界各地的設計師和開發人員創建了近 5,000 個 Flutter pens。有些人的作品讓我們大開眼界。以下是我們過去幾週看到的一些最喜歡的:

使用 Flutter 的 Web 支援展示原型和實驗的新 CodePen。

繼續在 CodePen 上探索:我們將為您舉辦一場挑戰!

Flutter 強勁勢頭

在我們第三篇 #FlutterGoodNewsWednesday 部落格文章中,我們分享了一些有關 Flutter 採用的統計數據,現在有 200 萬開發人員使用 Flutter。與去年此時相比,現在每天使用 Flutter 的開發人員比過去一個星期還要多。

紐約時報拼字蜂遊戲,使用 Flutter 實作。

當時我們分享了我們看到大約 50,000 個應用程式上傳到 Play Store。增長速度繼續加快,我們很高興地分享自那篇文章發佈以來,又上傳了 10,000 個 Flutter 應用程式。這種勢頭激勵著我們:感謝您的支援!

其中一個新應用程式的絕佳範例來自 紐約時報遊戲團隊,他們在 Google I/O ‘19 活動 上分享了他們使用 Flutter 的一些經驗。他們的 拼字蜂 遊戲現已作為他們 字謎遊戲應用程式 的一部分推出到 iOS 和 Android 商店:這個令人上癮的文字遊戲完全使用 Flutter 構建,挑戰您用蜂巢狀字母製作單詞。

自這篇部落格文章發佈以來,我們還發佈了第一季度開發人員調查結果,有超過 6,000 人參與。94.5% 的人表示他們對 Flutter 感到滿意或非常滿意,但我們也更多地了解到哪些方面存在困難。以前的一份調查報告指出動畫是一個挑戰,我們隨後針對該子系統添加了一系列 視訊更詳細的文檔,以更深入地介紹它。

Web 進度更新

在過去的幾個月裡,我們一直在努力的一個領域是 Flutter 對目標 Web 輸出的支援。正如我們在 Web 更新中所報告的那樣,我們特別關注改進效能和一致性。在文章中,我們宣布 Flutter 現在支援漸進式 Web 應用程式,並且在後續的幾週中,我們一直在透過 更複雜的服務工作者快取 大幅改進此功能,以提高首次載入效能。

在過去的一週中,我們還開始了一系列 文章,介紹 基於優化 Flutter Gallery 的經驗教訓,針對在 Web 上運行的 Flutter 應用程式最大限度地提高效能的技巧和竅門。請繼續關注這個部落格頻道,在接下來的幾週中,我們將發佈更多關於此主題的文章!

Flutter 1.17 和 Dart 2.8

也許迄今為止所有這些公告中最大的新聞是 Flutter 1.17 的發佈,包括 Dart 2.8。Flutter 1.17 在所有平台上都提供了效能和記憶體改進,但您會在 iOS 上看到最大的提升,因為 採用了 Apple 的 Metal 子系統 進行圖形渲染。對於 Android 來說,您也會看到改進,特別是新的可選 快速啟動除錯模式,它在不更改程式碼的情況下提供了 3 倍的速度提升。

除了在部落格文章中提到的新功能之外,還有一個功能讓一些人注意到了,那就是在發佈模式構建中更新的錯誤顯示。對於發佈模式構建,我們已 停用當您的其中一個 Widget 配置不正確時出現的「紅色死亡畫面」。許多人告訴我們,他們希望在罕見的情況下,當您的應用程式中存在 bug 時,能夠看到一個不太……突出的訊息,希望這個更改的預設行為是一個更好的替代方案。(對於那些想要其他東西的人,您可以使用 ErrorWidget.builder 屬性進一步自訂它。)

令人興奮的是,截至撰寫本文時,三分之二的人已經升級到 1.17。我們鼓勵大家儘快升級,以利用此版本中提供的所有功能!

在此期間,我們為 Flutter 1.17 發佈了一個熱修補版本,並計劃根據需要進一步更新以提高穩定性和品質。您可以查看 相關 Wiki 頁面,了解每個熱修補版本中包含的 bug 修復,以及如何確保您正在運行最新的穩定版本。

Adobe XD Plugin 預覽可用性

對於設計師來說,另一個重大消息是 Adobe XD 對 Flutter 支援的第一個公開預覽,由 Adobe 本身發佈。

本週,Adobe 發佈了對 Plugin 的更新,其中 修復了一些與不透明度相關的匯出錯誤,並積極地組合形狀以獲得更清晰的 Dart 程式碼。此外,Adobe 上週發佈了一個 XD 更新,其中 包含用於存取響應式佈局的新 API。一旦它得到更廣泛的推出,請在接下來的幾週內繼續關注 XD 到 Flutter Plugin 的進一步更新,這將提高生成的 Dart 程式碼的靈活性。

Plugin 和 Flutter 最愛

最近,上週我們 宣布我們計劃將許多 Flutter 團隊的 Plugin 升級到 1.0,此外還有一組新的 Flutter 最愛,其中包括 使用 Apple 進行登錄

但始終值得指出一些默默無聞的英雄。有超過 10,000 個套件,很難全部認出來,但本週我們將重點介紹一個非正式的十佳清單,其中包含一些很酷的套件,這些套件還不是 Flutter 最愛,但仍然值得關注:

  1. fl_chart 提供精美的商務圖表,包括折線圖和條形圖、散點圖和餅圖。
  2. flutter_blurhash 為可能需要時間下載的圖片提供快速佔位符。
  3. font_awesome_flutter 提供數千個圖示,以便輕鬆將它們包含在您的 Flutter 應用程式中。
  4. fab_circular_menu 提供一個迷人的彈出式選單。
  5. flutter_staggered_animations 為 listview、gridview 和 columns 提供精美的載入動畫。
  6. device_preview 將您的應用程式限制在一個自訂設備殼中,例如,讓您能夠從 macOS 預覽 iPhone 輸出。
  7. smooth_page_indicator 允許您在資訊卡的旋轉木馬中進行轉場。
  8. flame 提供一個小型 Flutter 遊戲引擎,帶有一組豐富的教學課程。
  9. flutter_launcher_icons 是一個受歡迎的 CLI 工具,它極大地簡化了更新 Flutter 應用程式啟動器圖示的任務。
  10. smooth_star_rating 提供一個緊湊的控制項,用於選擇星級評分。
pub.dev 上的 10,000 多個 Plugin,其中包含從商務圖表到 2D 遊戲引擎支援到 Flutter 的所有內容。

順便說一下,如果您正在編寫套件,請確保您沒有錯過我們關於 開發現代 Plugin 的技巧和竅門的文章。並且請填寫我們的 季度調查,其中有一個專注於 Plugin 開發的模組。

Flutter 日

最後,但並非最不重要的一點——我們最近 宣布了 Flutter 日,它將在幾週後的 6 月 25 日舉行。我們將舉辦三個技術會議、#AskFlutter,以及一組新的和更新的程式碼實驗室,讓您為在隨後的週末開始的由社群主導的 #Hack20 黑客馬拉松 活動做好準備。

更多好消息即將到來

我們還沒有完成:我們還有許多公告將作為 #FlutterGoodNewsWednesday 的一部分推出。所以請繼續關注,如果您有自己的好消息要與我們分享,請不要猶豫!

您隨時可以在 Twitter 上透過 @flutterdev 聯繫我們。我們很樂意收到您的來信!


兩個月的 #FlutterGoodNewsWednesday 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

http://creativecommons.org/licenses/by/4.0/

【文章翻譯】Save the Date: Flutter Day, June 25, 2020

【文章內容使用 Gemini 1.5 Pro 自動產生】

預留日期:Flutter Day,2020 年 6 月 25 日

作為一個團隊,我們習慣於大量的旅行,在各種活動和使用者群組中閒逛,並與人們面對面交流;我們懷念與 Flutter 社群在一起的時光!因此,雖然我們無法面對面聚會,但我們將做接下來最好的事情:用一個專門的 Flutter 日來讓聚會來到您的身邊。

Flutter Day (g.co/FlutterDay) 從太平洋時間 2020 年 6 月 25 日上午 9 點開始,在全球持續 24 小時,享受 Flutter 的所有事物:技術、生態系統,最重要的是,社群。

首先,我們有 codelabs,既有經過精心更新的現有 codelabs,也有全新的 codelabs!無論您是 Flutter 的新手還是經驗豐富的專業人士,您都可以在這個列表中找到自己喜歡的東西。為了確保您獲得所需的幫助,我們將提供一個 24 小時的支援頻道,讓您在 codelab 中獲得問題解答。

然後,我們在一天中為您準備了三場一小時的影片串流,這樣無論您身處哪個時區,您都能找到適合自己的內容。我們將回顧並擴展過去幾週在 Flutter 和 Dart 中宣布的一些新聞,重點關注 Flutter 的前端設計和開發,並展示一些我們認為您會喜歡的演示。我們也希望聽到您的聲音——我們為時常受到歡迎的 #AskFlutter 預留了一些時間,讓您可以在您想了解更多內容的主題上與團隊成員聯繫。

我們有一支優秀的陣容,包括來自 Flutter 和 Dart 團隊的工程師、產品經理和開發者倡導者。

想要了解 Flutter Day 的詳情,並告訴我們您有興趣參加,請今天就在 Flutter Day 網站註冊

身邊的 Flutter Day

當然,Flutter Day 是為所有人而設,因此我們也與世界各地的本地 Flutter 使用者群組協調,以收集所有正在進行的虛擬聚會,以紀念 Flutter Day。

無論您住在哪裡,您都可以在附近找到一個本地的 Flutter 虛擬聚會。

準備好迎接 Hack20

而且,好像這些还不够,今年我們還與國際 Flutter Hackathon #Hack20 合作。

完成一天的 Flutter codelabs 之後,您就可以開始一個周末的 Flutter 程式設計,並為最佳應用程式頒發獎項,以及來自 Flutter 社群的導師。

為所有人而設

無論您是第一次嘗試 Flutter,還是經驗豐富的資深人士,Flutter Day 都為您準備了內容。與來自世界各地的 Flutter 愛好者一起閒逛,獲得您的 Flutter 問題解答,享受來自世界各地的 Flutter 內容,然後花費一個周末參加黑客松。別忘了註冊您的興趣,並在今天查看詳細資訊


預留日期:Flutter Day,2020 年 6 月 25 日 最初發佈在 Flutter 上的 Medium,人们在那里通过突出显示和回应这个故事来继续讨论。

【文章翻譯】3 cool Dart patterns

【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】

三個很酷的 Dart 模式

關於作者:Jose 最近大學畢業,現在在 Material 工作,這是一個設計系統,可幫助團隊建立高品質的數位體驗。Jose 的團隊維護 Flutter material 函式庫

使用 Flutter 框架,您可以使用 Dart 程式語言建立漂亮的應用程式。隨著時間的推移,我學習了一些有用的 Dart 模式,這些模式幫助我成為一名更好的 Flutter 開發人員。以下是我推薦您在下一個應用程式中嘗試的三個模式:

  • 有條件地賦值:boolean ? widget : widget
  • 將 Widget 合併到集合中:for ()...[]
  • 立即調用匿名函式:() {} ()

本文將向您展示如何使用每種模式,最後會有一個嵌入的 Pen,您可以在其中使用程式碼。

此螢幕截圖顯示了我將討論的程式碼及其產生的 UI。

有條件地賦值

條件賦值運算子 ?:(也稱為 三元運算子)需要一個條件表達式和兩個值表達式。當您的 Widget 取決於布林值時,此模式非常有用。您可以使用三元運算子內嵌運行程式碼,而不是將運算模組化到單獨的方法中。我已經無數次使用過這種技術。

在以下範例中,AppBar 標題取決於布林值。(在這種情況下,該值取決於 isVegetarian 布林值。)如果該值為 true,則標題文字設定為第一個值(「Vegetarian Food」);否則,它就是第二個值(「Non-Vegetarian Food」)。

1
2
3
4
5
appBar: AppBar(
title: Text(Random().nextBool()
? 'Vegetarian Food'
: 'Non-Vegetarian Food'),
),

將 Widget 合併到集合中

此模式 for ()...[] 使用展開運算子(…)將 Widget 列表合併到現有集合中。每當我使用 Widget 列表時,我都會使用它,通常與 children 屬性一起使用。以下範例使用此技術建立 Widget 列表:

1
2
3
4
5
6
7
8
children: [
Container(),
for (final food in foods) ...[
if (isVegetarian == food.isVegetarian)
ListTile(title: Text(food.name)),
SizedBox(height: 50.0),
],
],

在此範例中,foodsFood 物件的列表,定義如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
List<Food> foods = [
Food(name: 'apple', isVegetarian: true),
Food(name: 'nuts', isVegetarian: true),
Food(name: 'eggs', isVegetarian: true),
Food(name: 'chicken', isVegetarian: false),
];

class Food {
Food({
this.name,
this.isVegetarian,
});

String name;
bool isVegetarian;
}

每當您需要多次(例如,在範例中,如果 isVegetarian 為 true,則為 3 次)將多個 Widget(例如範例中的 ListTile Widget)加入到 Widget 列表中時,for ()...[] 模式都很方便。

由於展開運算子(…)對 Dart 來說相對較新,請確保您的 pubspec.yaml 檔案指定的 Dart SDK 版本為 2.3.0 或更高版本:

1
2
environment:
sdk: ">=2.3.0 <3.0.0"

要了解有關 集合運算子展開運算子 的更多資訊,請閱讀 Dart 語言導覽

立即調用匿名函式

第三種模式 () {} () 相當於 Dart 中的「立即調用函式表達式(IIFE)」。這種方便的模式讓您可以定義匿名函式並立即執行它。我發現這種模式在處理可能有多個輸出的 Widget 時非常有用。程式碼可以內嵌使用,而不是使用巢狀的三元運算子或將簡單的調用模組化。以下範例顯示了此模式,其中包含一個帶有 switch 語句的匿名函式。

1
2
3
4
5
6
7
8
9
10
11
12
color: () {
switch (getRandomElement(foods).name) {
case 'apple':
return Colors.green;
case 'nuts':
return Colors.brown;
case 'eggs':
return Colors.yellow;
default:
return Colors.transparent;
}
}(),

總結

您可以使用 CodePen 來玩 Flutter 程式碼。以下是一個包含本文中所有程式碼的 Pen:

以下是用顏色表示的另一個 CodePen 範例:

我希望這三種 Dart 模式能讓您在開發 Flutter 應用程式時擁有更大的自由度。如果您還有其他喜歡的技巧,請在評論中分享!

要了解有關 Jose 的更多資訊,請造訪他的 GitHubLinkedInYouTubeInstagram

【文章翻譯】Flutter Package Ecosystem Update

【文章內容使用 Gemini 1.5 Pro 自動產生】

Flutter 套件生態系統更新

Google 的 Flutter 團隊只有一個工作:為開發者提供跨多個平台構建美麗、原生應用程式的管道。當 Flutter 還很新時,團隊透過專注於少數最初的客戶來實現了這個目標。這導致了文字和圖形的可攜式渲染引擎的誕生。接下來是擴展其覆蓋範圍,團隊透過吸引開發者,結合 Dart 平台的強大功能,易於使用的 Flutter API,以及跨 Android 和 iOS 的原生編譯,來實現了這個目標。隨著客戶群的增長,他們的需求也隨之增長,促使團隊利用 Dart 的 pub.dev 提供 Flutter 套件管理員和發現機制,將套件作者與應用程式開發者聯繫起來。

最後一步尤其重要,因為它使 Flutter 社群能夠互相幫助,而無需 Flutter 團隊的干預。在 pub.dev 上發佈或使用套件之前,沒有人需要詢問。另一方面,為培育這種生態系統,擁有建立現代 Flutter 應用程式構建基礎的信賴代理非常重要。Google 的 Flutter 團隊提供了信賴的平台,Flutter 社群可以在其上繼續發展壯大。

套件發佈者、評分和最愛

為了幫助使 Flutter 套件生態系統值得信賴,我們在 pub.dev 上公開了有關每個套件的許多指標:

這是 provider 套件 的螢幕截圖,它在 Flutter 生態系統中的普及程度和品質方面名列前茅。此螢幕截圖展示了我們用於在 pub.dev 上傳遞品質信號的幾個指標。域名旁邊的藍色盾牌是 已驗證發佈者,讓您知道套件是由身份已驗證的人發佈的。豎起大拇指圖示及其旁邊的數字顯示了「讚」的數量,讓您知道社群中其他成員對這個套件的感受。最後,最右邊的圖示將套件標記為 Flutter 最愛,表示當您構建應用程式時應該先考慮的套件。僅供比較,在過去三個月的時間裡,積極維護的套件的平均好感度為 12 個讚,而對於 Flutter 最愛,則為 270 個讚。若要找到品質最高的套件,Flutter 最愛指標 會將 pub.dev 分數與許多客觀和主觀的品質、可用性和廣泛適用性指標結合在一起,其中包括來自 Flutter 框架本身的貢獻者之一的工程程式碼審查。

由於門檻很高,因此 Flutter 最愛標記並非經常出現 - 它只出現在 少數套件上。今天,我很高興地宣布,該清單已擴展到包含以下內容:blocflutter_blocconvex_bottom_bargeolocatorgoogle_fontslocation,以及 sign_in_with_apple。恭喜所有作者,並衷心感謝您對 Flutter 套件生態系統的貢獻。

使用 Apple 登入

此輪 Flutter 最愛獎項中最顯著的 Plugin 之一是 sign_in_with_apple Plugin

它不僅品質高,而且適用性廣,還填補了 Flutter 功能集中的重要空白。Apple 已宣布,到 2020 年 6 月 30 日,使用其他第三方驗證(如 Google 登入)的應用程式必須啟用 Apple 登入才能被 App Store 接受。顯然,對於任何以 iOS 為目標的 Flutter 開發者而言,這都是至關重要的功能,但 Google 的 Flutter 團隊並沒有自行建立 Plugin 來填補這個空白,而是依賴於我們的社群。聯絡到 sign_in_with_apple 的作者 Timm Preetz 和 Henri Beck,我們發現他們反應迅速,並在創紀錄的時間內迅速將 Plugin 提升到所需的標準。

提高數量和品質

只有透過 Flutter 套件生態系統的成熟和多元化,我們才能與社群合作,實現像 sign_in_with_apple Plugin 這樣的事情。如果您查看 Flutter 相依套件隨著時間推移的數量,您可以看到生態系統的增長。

自 1.0 版本以來的 Flutter 相依套件數量

通常,您會期望這種驚人的增長會伴隨著整體品質下降。然而,Flutter 社群正在見證截然相反的趨勢。

自 1.0 版本以來的 Flutter 相依高品質套件的百分比

我們將品質衡量為 pub.dev 上整體分數的健康度和維護部分。如您所見,自 Flutter 1.0 版本發佈以來,儘管套件生態系統的增長巨大,但其整體品質卻有所提高。

將 Google Flutter Plugin 移至 1.0

不僅社群會產生 Plugin。Google 的 Flutter 團隊也提供了一組 Plugin。其中許多 Plugin 被標記為 Flutter 最愛套件,表明其品質很高,包括 shared_preferencespath_providerurl_launcher 等等。然而,這些 Plugin 並不都是被標記為「1.0」;例如,shared_preferences 被標記為「0.5.7+2」,這在我們認為已準備好投入生產使用的 Plugin 方面似乎並不直觀。原因在於 Dart 如何處理版本:

根據慣例,我們建議開發者在相依於套件時使用插入符號語法,例如:^current-version。此語法由 flutter pub get 解釋為「我希望獲得比我指定版本高或與我指定的版本相同,但在不更改主要版本的條件下獲得最高可用版本」。這是 Dart 的實作 語義化版本控制,它指出主要版本應與重大變更一起使用,並且應明確選擇。但是,在由 Google 維護的這組 Flutter Plugin 中,我們已穩定 API,因此可以安全地指定版本字串以包含 1.x 版本,您可以像這樣在 pubspec.yaml 中進行操作:

1
2
dependencies:
shared_preferences: **‘&gt;=0.5.7+2 &lt;2.0.0’**

對於這組 Plugin,您可以使用以下版本字串來準備 v1.0,而不是傳統的版本:

在您按照這些行更新 pubspec.yaml 之前,如果我們將版本號碼提升到 1.0.0,您的應用程式和相依套件將不會獲得更新。對於 1.0 來說這是可以的,因為它與上面列出的 0.x 版本沒有任何不同,但是 1.1 及以後版本如何呢?這就是您需要進行這些更改的原因。

在某些情況下,我們可以提供幫助。例如,pub.dev 上有 181 個套件相依於 shared_preferences。如果您的應用程式相依於 shared_preferences <2.0.0,並且也相依於另一個進而相依於 shared_preferences <1.0.0 的套件,則 Dart 版本解析器永遠不會給您 1.0.0(或 1.1.0 或…)。但是,我們並沒有等待和希望這些 181 個套件的作者閱讀這篇部落格文章並更新他們對上面列出的所有 Plugin 的相依版本字串,而是積極地努力向包含套件 pubspec.yaml 的 git 儲存庫提交 PR,以匹配上面表格中的版本字串。這樣,當我們將 Google Flutter Plugin 中目前為 0.x 的版本號碼更改為 1.0.0 時,您的應用程式將會全部設定好,您相依的套件也將全部設定好。

將 Google Flutter Plugin 推向生產環境

您可能已經注意到,並非所有 Google Flutter Plugin 都列在上面的討論中,例如 Firebase、Camera、Video Player 等等。這是因為我們還需要對一些 Plugin 做些工作,才能將它們提升到生產品質;例如,Firebase Plugin 需要更完善、更詳細的文檔,以及更快的構建時間和更簡單的設定。為了幫助我們實現這個目標,我很高興地宣布,我們與 Invertase 達成了合作,Invertase 是一家位於英國的諮詢公司,在 Dart 和 Flutter 方面擁有豐富的專業知識。

在接下來的幾個月裡,Invertase 將幫助我們將其餘的 Google Flutter Plugin 推向生產品質。如果您想更詳細地了解 Firebase Plugin,您可以在 FlutterFire 儲存庫 上閱讀 Invertase 的計劃。

總結

Flutter 套件管理員是一個蓬勃發展的生態系統,擁有越來越多的套件來填補 Google Flutter 團隊的開發者永遠無法自行管理的空白。幸運的是,有了 pub.dev 上的信號,包括分數、評分和 Flutter 最爱標記,以及我們與 Invertase 的合作關係,您可以放心地相信,您將擁有找到下一個 Flutter 應用程式所需正確套件的品質信號。有了 pub.dev 上套件提供的全部功能,您打算構建什麼?


Flutter 套件生態系統更新 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】Optimizing performance in Flutter web apps with tree shaking and deferred loading

【文章內容使用 Gemini 1.5 Pro 自動產生】

為 Flutter 網頁應用程式最佳化效能:使用 Tree Shaking 和延遲載入

為了提供最佳的使用者體驗,應用程式快速載入非常重要。透過縮減 Flutter 網頁應用程式的 JavaScript 捆綁包,可以改善其初始載入時間。Dart 編譯器包含 Tree Shaking 和延遲載入等功能,這兩者都可以縮減 JavaScript 捆綁包。本文將解釋它們的工作原理以及如何在應用程式中使用它們。

預設的 Tree Shaking

在編譯 Flutter 網頁應用程式時,JavaScript 捆綁包是由 dart2js 編譯器生成的。發行版本具有 最高級別的優化,其中包括對您的程式碼進行 Tree Shaking。

Tree Shaking 是一個消除無用程式碼的過程,它只包含保證會執行的程式碼。這表示您不必擔心應用程式中包含的函式庫的大小,因為未使用的類別或函數將被排除在編譯的 JavaScript 捆綁包之外。

若要查看 Tree Shaking 的實際運作方式:

  1. 建立一個 Dart 檔案 greeter.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
abstract class Greeter {
String greet(String name);
}

class EnglishGreeter implements Greeter {
String greet(String name) => 'Hello $name!';
}

class SwedishGreeter implements Greeter {
String greet(String name) => 'Hej $name!';
}

void main() {
print(EnglishGreeter().greet('World'));
}
  1. 在您的終端機中執行 dart2js -O4 greeter.dart,並查看生成的輸出檔案 out.js

在生成的 JavaScript 程式碼中,沒有任何對 SwedishGreeter 類別的引用,也沒有包含 Hej $name 字串,因為它在編譯器進行 Tree Shaking 時被移除。

編譯器只能透過靜態分析來找出哪些程式碼可達,哪些是無用程式碼。以以下範例為例,其中根據系統地區設定定義了 greeter

1
2
3
4
5
6
Locale locale = Localizations.localeOf(context);
if (locale.languageCode == 'sv') {
greeter = SwedishGreeter();
} else {
greeter = EnglishGreeter();
}

編譯器不知道使用者的系統地區設定,因此 EnglishGreeterSwedishGreeter 都包含在 JavaScript 捆綁包中。對於此類用例,延遲載入可以幫助縮減初始捆綁包的大小。

使用延遲載入僅在需要時載入程式碼

延遲載入(也稱為懶惰載入)允許您在需要時載入函式庫。它可以用於載入應用程式中很少使用的功能。請注意,延遲載入是 dart2js 的一項功能,因此這不適用於 Flutter 行動應用程式。在最簡單的情況下,將匯入的套件或檔案標記為延遲載入,並在使用它之前等待它載入:

1
2
3
4
5
6
import 'greeter.dart' deferred as greeter;

void main() async {
await greeter.loadLibrary();
runApp(App(title: greeter.EnglishGreeter().greet('World')));
}

編譯此程式碼將生成兩個 JavaScript 檔案。當在延遲匯入上呼叫 loadLibrary 時,它將載入 greeter 函式庫。

在 Flutter 中,所有內容都是 Widget,您可能想要使用 FutureBuilder。Widget 的 build 方法預期是同步的,因此您不能在 build 方法中對 loadLibrary 呼叫 await。但是,您可以在 build 方法中返回 FutureBuilder,也可以用它在函式庫載入時顯示不同的 UI:

1
2
3
4
5
6
7
8
9
10
11
12
import 'greeter.dart' deferred as greeter;

FutureBuilder(
future: greeter.loadLibrary(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return Text(greeter.greet('World'));
} else {
return Text('Loading...');
}
},
)

若要親自嘗試(請查看 GitHub 上的完整範例),請打開 Chrome DevTools 並點擊 網路 標籤以檢查網路活動。重新載入頁面,查看函式庫何時載入和匯入。在以下螢幕截圖中,載入 main.dart.js_1.part.js 檔案是延遲的:

Flutter Gallery 支援 70 多種語言,但大多數使用者只使用一種語言。延遲載入本地化字串是使用此功能的絕佳方法。例如,在 Flutter Gallery 中實作本地化字串的延遲載入之後,應用程式的初始 JavaScript 捆綁包大小減少了一半。如果您的 Flutter 網頁應用程式中有很多本地化字串,請考慮延遲載入這些檔案。gen_l10n.dart 腳本 包含 --use-deferred-loading 旗標,可用於此目的(目前僅在 1.19 SDK master channel 上提供)。

這篇文章是關於我們在提高 Flutter Gallery 效能時所學到的知識的一部分。我希望您覺得它有用,並且學到了一些可以應用到您的 Flutter 網頁應用程式中的知識!


透過 Tree Shaking 和延遲載入最佳化 Flutter 網頁應用程式的效能 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】What are the important & difficult tasks for Flutter devs? — Q1 2020 survey results

【文章內容使用 Gemini 1.5 Pro 自動產生】

Flutter 開發人員的哪些任務重要且困難? - 2020 年第一季調查結果

作者:JaYoung LeeYouyang Hou

我們每季都會對 Flutter 開發人員進行調查,以更好地了解您如何使用 Flutter 以及我們可以改進哪些方面。今天,我們將發佈第八次季度調查的結果,該調查於 2020 年 2 月進行。我們在 8 天內收到了大約 6,000 份回覆,很高兴地得知,有史以來最高比例的開發人員(94.5%)表示對 Flutter 感到滿意。雖然我們每季都會問一些問題以了解長期趨勢,但本季度的調查特別側重於識別對使用者而言重要且困難的關鍵任務。在深入探討結果之前,以下是一些其他的有趣發現。

關於 Flutter 使用者

首先,我們了解到,與上個季度相比,使用者對 Flutter 的核心框架 (+2%) 和生態系統 (+4%) 更為滿意。但使用者對動畫框架的滿意度略有下降 (-3%)。為了進一步了解造成這種情況的原因,我們将在下一次調查中詢問您關於動畫框架體驗的更多問題。同時,請查看我們 YouTube 頻道上的「在 Flutter 中製作動畫」播放清單。所有這些影片都是最近發佈的。

接下來,大約一半的受訪者表示他們已經使用 Flutter 發佈了應用程式 (51%)。這個數字一直在持續增長 - 大約一年前,這個數字是 34%。那些發佈了應用程式的開發人員對 Flutter 的滿意度比那些未發佈應用程式的開發人員高。

應用程式開發階段的 Flutter 滿意度。發佈了 Flutter 應用的開發人員對 Flutter 的滿意度比那些未發佈應用的開發人員高。

同樣,當我們詢問他們使用 Flutter 的主要目的時,48% 的受訪者表示他們正在使用 Flutter 進行主要工作。這個數字也在增長。一年前,這個數字是 30%。評估 Flutter 以便潛在生產使用的使用者數量一直在下降,從 2019 年的 36% 降至 2020 年的 25%。這意味著許多使用者已經完成了評估,並將 Flutter 用於更嚴肅的目的。

最後,我們發現,69% 發佈了完整生產應用的開發人員正在構建 iOS 和 Android 應用程式。16% 的開發人員表示,除了兩個行動平台之外,他們還嘗試了 Web 平台。目前,Play 商店中大約有 50,000 個 Flutter 應用程式。這個數字一直在呈指數級增長,我們希望看到這種趨勢在未來幾個月內繼續下去。

更多統計數據、見解和未來計畫,請參閱「Flutter 2020 年春季更新」文章。

關於任務

部分調查受訪者被邀請參加更長的調查。因此,43% 的受訪者(N = 2,598)回答了一組問題,我們在這些問題中詢問了他們對 29 個 Flutter 相關任務的看法。這些任務涵蓋了 UI 開發、框架和工具、生態系統、效能和疑難排解以及測試和優化。這些領域的所有 29 個任務都被認為對 Flutter 使用者至關重要。然而,我們假設其中一些任務比其他任務更重要且更難,因此需要團隊更多關注。

我們以這樣的方式設計調查:隨機選取一半的受訪者詢問他們認為哪些任務對他們很重要,另一半的受訪者詢問他們認為哪些任務很難完成。透過將受訪者分成兩組(也稱為「組間設計」),我們能夠減少向每個人提出的問題總數。此外,透過要求使用者評估任務的重要性程度和難度,我們能夠識別出對 Flutter 開發人員既重要又困難的最高優先級任務。以下是團隊用於決定如何處理每個任務的象限圖。

重要程度-難度象限支援決策。

以下任務被評為排名前 6 的最重大的任務。值得注意的是,這些重要的任務廣泛分佈在應用程式開發的不同階段,從效能和測試到 UI 開發。

  • 在我的 Flutter 應用程式中除錯錯誤和崩潰
  • 測試我的應用程式,以確保它可以在各種平台上正常運作
  • 為我的 Flutter 應用程式選擇一種狀態管理方法
  • 了解和解決佈局問題(例如文字溢出)
  • 根據 UX UI 設計師提供的設計規範建立 UI
  • 為我的 Flutter 應用程式排除平台特定問題
任務的相對重要性。藍點表示個人的估計重要性分數,紅點表示平均值。

以下任務被評為排名前 6 的最困難的任務。我們發現,與疑難排解和效能相關的幾個任務對於 Flutter 專業開發人員來說很困難。大多數與 UI 相關的任務被評為不太困難。

  • 為我的 Flutter 應用程式排除平台特定問題
  • 診斷和修復我的 Flutter 應用程式的記憶體問題
  • 診斷和修復我的 Flutter 應用程式的 CPU 使用率問題
  • 將現有的平台特定原生 API 加入我的 Flutter 應用程式
  • 診斷和修復我的 Flutter 應用程式的 UI 卡頓
  • 開發一個 Flutter Plugin(帶有平台特定實作)
任務的相對難度。藍點表示個人的估計重要性分數,紅點表示平均值。

如您所見,一些任務同時出現在高度重要和困難的任務列表中(例如「為我的 Flutter 應用程式排除平台特定問題」)。這些知識對 Flutter 團隊很有價值,因為他們可以根據使用者輸入優先考慮這些領域,而不是憑藉猜測。

此外,由於 Flutter 在企業客戶中快速普及(26% 的調查受訪者在企業工作),我們進行了額外的分析,以找出大型公司開發人員特有的挑戰。對於這組開發人員,我們發現,減少應用程式大小、將 Flutter 加入現有的應用程式(即附加到應用程式)、選擇狀態管理技術以及了解和解決佈局問題,對於他們來說比其他使用者更重要也更困難。

Flutter 團隊現在更加了解您認為既重要又困難的任務,並將使用這些輸入來指導開發重點。此外,團隊將會持續追蹤改進,並重新評估任務,以確保每個開發步驟都健康且得到良好支援。

接下來呢?

在 Flutter 這樣的開源專案中工作的一大樂趣就是擁有一個願意提供見解並提出改進建議(無論是在調查中還是透過 GitHub 問題等其他形式的回饋)的社群。因此,我們要特別感謝您填寫調查問卷。我們中的幾個人閱讀了所有提交的評論。

我們希望這些報告能證明我們對了解您的回饋非常感興趣。在下一份季度調查中,我們計畫針對本次調查中的一些見解進行跟進,特別是我們希望更好地了解上面強調的重要且困難的任務。請留意將很快發佈的下一份調查。

Flutter 的 UX 研究團隊也正在進行各種使用者體驗研究,以使您使用 Flutter 的體驗更加愉快。如果您有興趣參與未來的研究,請註冊


Flutter 開發人員的哪些任務重要且困难? - 2020 年第一季調查結果 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】Announcing Adobe XD support for Flutter

【文章內容使用 Gemini 1.5 Pro 自動產生】

在 XD 中創作,並匯出到可運行的 Flutter 程式碼

我們的 Flutter 目標是提供一個豐富的畫布,用於創意表達。在 iOS 和 Android 上擁有原生效能,對螢幕上渲染的每個像素擁有完全控制權,並且能夠以有狀態的熱重載快速迭代,我們希望釋放設計師和開發人員的潛力,構建不受人工技術界限限制的美麗體驗。

去年在我們的 Flutter Interact 活動 中,我們將焦點轉向了正在使用 Flutter 進行探索和實驗的創作者。我們聽取了像 Robert Felker 這樣的數位藝術家的意見,他使用 Flutter 透過生成演算法來構建虛幻形式。我們展示了 gskinner 等創意代理機構的作品,他們創作了一系列創新的片段,以展示 Flutter 的潛力。並且我們看到了 Adobe 對 Adobe XD 的 Plugin 初期原型 的演示,該原型能將 Flutter 程式碼直接從他們的工具中匯出。

Flutter 是一個豐富的創意表達畫布:一個用於構建不受傳統技術界限限制的美麗原生體驗的工具包。(使用 Flutter 構建的生成藝術品,由 Robert Felker 提供。)

今天,我們很高興與 Adobe 共同宣布,他們將 XD 轉換為 Flutter 的 Plugin 現已 作為搶先體驗版 提供,供更廣泛的公眾測試。 Adobe XD 是一個 UI/UX 設計和協作工具,幫助團隊為網站、應用程式、語音介面、遊戲等等建立和分享設計。作為 Adobe 領先的 Creative Cloud 的一部分,XD 允許設計師將向量藝術、文字、圖片、微互動和動畫轉化為互動式原型,這些原型就像運作中的軟體產品一樣。將設計匯出到 Flutter 的功能進一步縮短了創意想法和產品開發之間的延遲,因為 XD 原型現在可以在幾分鐘內變成可運行的 Flutter 程式碼。Adobe XD 支援在 Windows 或 macOS 上進行設計,並且包括 免費入門計劃,讓您可以快速上手。

將 Adobe XD 匯出到 Flutter 現在只是一個 Plugin 的距離。

從 Adobe XD 匯出 Flutter 程式碼

在 XD 中使用 Flutter Plugin 很簡單。您可以匯出單個繪圖或組件,也可以匯出畫板。以下是操作方法。

首先安裝 Flutter 匯出 Plugin。從 Adobe XD 中,選擇 Plugins > Discover Plugins,然後搜尋 Flutter。安裝完畢後,您可以透過選擇 Plugins > Flutter > UI Panel 來顯示上面螢幕截圖中顯示的 UI 面板。

現在,透過將其包含在您的 pubspec.yaml 應用程式清單中,將 adobe_xd 套件加入到您的 Flutter 專案中。此套件提供輔助函數,可在生成的 XD 程式碼中最大限度地減少樣板。

若要匯出單個元素,只需選取您要匯出到 Flutter 的單個 Widget,然後從 UI 面板中選擇 Copy Selected 按鈕。這會將相關的 Dart 程式碼複製到您的剪貼簿中,您可以將其作為無狀態或有狀態 Widget 的基礎:

匯出的程式碼可以整合到您現有的專案中,並且可以在不重新處理其他檔案的情況下更新。

另一種方法是匯出整個專案。假設您已經有一個要載入內容的 Flutter 應用程式(包括 pubspec.yaml 中的 adobe_xd 套件參考),您只需從 UI 面板中選擇 Plugins > Flutter > Export All Widgets,並設定您想要的任何其他配置選項。

這會在您的專案的 lib/ 子目錄中建立一系列類別,然後您可以直接使用這些類別。您可以繼續調整 XD 原型並使用 ⇧⌘F(Windows 上為 Ctrl+Shift+F)再次匯出,如果您已在 Visual Studio Code 中啟用 Dart Hot Reload on Save Watcher 設定,您的應用程式會在您重新匯出 Widget 時自動重新載入任何更新。

從 XD 到程式碼的快速週期為您提供了一種將原型轉化為應用程式的新方法。

作為搶先體驗版,當然有一些限制,這些限制在 發行備註 中有說明。一個顯著的限制是響應式佈局尚不可用,等待新的 XD API 完成。但是,當像這樣的功能可用時,您會自動獲得 Plugin 的更新。

與 Adobe 合作開發這個 Plugin 真是太好了。我們很興奮能得到他們的支援,而 新的基於 JavaScript 的 API 使得每個人都能輕鬆擴展 Adobe XD。以下是一些關於這個新 Plugin 的觀點:

“在 Adobe,我們一直在尋找簡化設計師到開發人員工作流程的方法,這種工作流程困擾著許多設計和構建應用程式的團隊。今天,我們很興奮地發佈與 Flutter 合作開發的成果的搶先體驗版,該成果旨在消除猜測,加快決策速度,並幫助團隊更快地將新體驗推向市場。”
- Vijay Vachani,Adobe Creative Cloud 平台和生態系統高級總監

若要了解更多資訊,請訪問 Adobe 的 XD 至 Flutter Plugin 頁面。我們期待看到您使用它創作的成果!


宣布 Adobe XD 支援 Flutter 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。