0%

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

宣布 Flutter Puzzle Hack!

The Flutter Puzzle Hack logo
Flutter Puzzle Hack 標誌

準備好拋開節日塵埃,嘗試一個有趣的程式設計專案,測試您對 Flutter 的知識嗎?我們很高興宣布 Flutter Puzzle Hack,這是我們最新的挑戰,看看您能用 Flutter 做出什麼,以及贏得超過 50,000 美元獎金的機會。我們請您開發出最具創意但可解的滑動拼圖,目標是網頁上的 Flutter。無論您是創造出新的設計、從頭開始重建拼圖,還是以新的有趣方式整合套件,我們都希望看到您能將想像力發揮到什麼程度。

為了讓您開始,我們編寫了範例程式碼,它處理所有拼圖邏輯。我們還整理了大量其他文件和資源來幫助您建立引人入勝的提交,因此無論您是經驗豐富的 Flutter 開發人員,還是您只是在閱讀 Flutter Apprentice 後加入 Flutter 社群,這裡都有適合您的東西!

請務必在 Twitter 上分享您的解決方案,並使用標籤 #flutterpuzzlehack 標記,以便有機會在我們的 Twitter 帳戶上獲得展示!

詳細資訊

日期: 所有專案必須在 2022 年 2 月 28 日下午 1:59 PT (GMT -7) 之前提交。獲獎者將於 2022 年 3 月 23 日公布。

如何提交: 可以在 DevPost 找到註冊和提交參賽作品的說明。

類別: 獲獎者將在以下類別中選出:

  • 整體執行
  • 最佳動畫和設計使用
  • 創意
  • 最佳跨平台解決方案
  • 社群選擇

我們還將頒發獎品給提交具有對 Flutter 社群有幫助的內容以及提交高品質 Flutter 團隊回饋的提交。

獎品 包括一台功能齊全的 Macbook Pro、現金、Flutter 周邊商品以及在 Flutter 推廣渠道上獲得展示的機會。

產品資訊會議

除了所有這些資源之外,我們還與 Flutter Community YouTube 頻道合作,邀請 Google Chrome、Firebase 和 Rive 等團隊來分享從網頁構建最佳實務到有效使用整合以將您的專案提升到新水平的內容。查看 競賽頁面 以獲取詳細的時程表。

保持聯繫

我們與 DevPost 的朋友合作進行此挑戰,這意味著您可以在 DevPost 平台上為您最喜歡的提交作品投票、與其他參與者建立聯繫並找到所有相關的競賽更新。

前往 flutterhack.devpost.com 開始。祝您好運,玩得開心!


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

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

Flutter 2.8 的新功能

北半球的季節變換,樹葉變色,氣溫下降,今年的最後一個穩定版本也到來了。歡迎來到 Flutter 2.8!這個版本代表了 207 位貢獻者和 178 位審查者的辛勤工作,共產生了 2,424 個合併的 PR 和 2976 個已關閉的議題。特別感謝本次版本的主要社群貢獻者 Bartosz Selwesiuk,他是 Very Good Ventures 的 Flutter 工程師,他貢獻了 23 個 PR,其中大部分都與 Web 平台的相機功能相關。

所有這些共同努力導致了引擎和 Flutter DevTools 的顯著性能提升,為 Flutter 提供了穩定的 Google Mobile Ads SDK 版本,加入了一系列新的 Firebase 功能和改進,更新了 WebView 3.0,推出了一批新的 Flutter Favorite 套件,對桌面平台進行了大量更新,為穩定版本發佈鋪平了道路,以及推出了支援更多套件(包括 Firebase 自身)的 DartPad 新版本。這可能是今年最後一個版本,但絕對不是最不重要的。讓我們一起來看看吧!

性能

始終如一,Flutter 的首要任務是品質。我們花費大量時間確保 Flutter 在所有支援的設備上都能盡可能順暢且穩定地運行。

啟動

此版本包含對應用程式啟動延遲的改進。我們使用 Google Pay(一個大型、流行的應用程式,擁有超過 100 萬行代碼)來測試這些改進,以確保這些更改可以對現實世界的應用程式產生可感知的影響。總體而言,這些改進導致 Google Pay 在低端 Android 設備上的啟動延遲降低了 50%,在高端設備上則降低了 10%。

Flutter 影響 Dart VM 垃圾回收策略的方式的改進,現在可以幫助在應用程式啟動過程中避免不合時宜的 GC 循環。例如,在 Android 上渲染第一個畫面之前,Flutter 現在 僅在 TRIM_LEVEL_RUNNING_CRITICAL 及以上時通知 Dart VM 記憶體壓力。在本地測試中,此更改將低端設備上的第一個畫面渲染時間最多縮短了 300 毫秒。

出於 謹慎,在之前的版本中,Flutter 在建立平台視圖時會阻塞平台執行緒。仔細的推理和測試 確定可以移除一些序列化操作,這在低端設備上啟動 Google Pay 時,可以移除超過 100 毫秒的阻塞。

先前,建立預設字體管理器會在建立第一個 Dart 隔離區時引入人工延遲。將預設字體管理器建立延遲到與 Dart 隔離區建立同時執行 既改進了啟動延遲,又使上述優化的效果更加明顯,因為這是主要的瓶頸。

記憶體

在記憶體受限設備上運行的 Flutter 開發者 遇到過問題,因為 Flutter 會急切地載入 Dart VM 的「服務隔離區」,而其 AOT 程式碼與應用程式捆綁在一起,導致 Flutter 同時將兩者讀取到記憶體中。在 2.8 版本的 Android 中,Dart VM 的服務隔離區 被拆分到自己的捆綁包中,可以單獨載入,這將記憶體節約了 40 MB,直到需要服務隔離區為止。Dart VM 通知作業系統 記憶體中由 AOT 程式使用的頁面由一個可能不需要再次讀取的檔案備份,從而進一步將記憶體佔用降低了 10%。因此,先前保存檔案備份資料副本的頁面可以被回收,並用於其他用途。

分析

有時開發人員希望查看 Flutter 的性能追蹤資料以及 Android 原生追蹤事件。此外,他們通常希望即使在發佈模式下也能查看追蹤事件,以便更好地理解已部署應用程式中的性能問題。為了實現這個目標,2.8 版本的穩定版本 現在會將追蹤事件發送到 Android systrace 記錄器(如果在應用程式啟動時啟用),即使 Flutter 應用程式是在發佈模式下構建的,這些事件也會被發送。

Flutter 追蹤事件現在顯示在 Android systrace 記錄工具中(底部)

此外,為了幫助創建更少的卡頓動畫,一些開發者希望 在性能追蹤中獲取更多有關柵格快取行為的資訊,柵格快取允許 Flutter 複製昂貴且重複使用的圖片,而不是在每個畫面都重新繪製。性能追蹤中的全新流程事件 現在允許您追蹤柵格快取圖片的生命週期。

Flutter DevTools

為了除錯性能問題,此版本的 DevTools 加入了一個 全新的「增強追蹤」功能,以幫助您診斷由昂貴的構建、佈局和繪製操作造成的 UI 卡頓。

當任何這些追蹤功能啟用時,時間線會包含新的事件,用於構建 Widget、佈局渲染物件以及繪製渲染物件(如適用)。

此外,此版本的 DevTools 加入了一個 新的功能,用於分析應用程式啟動的性能。這個分析包含從 Dart VM 初始化到渲染第一個 Flutter 畫面之間的 CPU 樣本。在您按下「分析應用程式啟動」按鈕並載入應用程式啟動分析後,您會看到選擇了「AppStartUp」使用者標籤用於分析。您也可以在可用的使用者標籤列表中選擇此使用者標籤過濾器(如果存在),從而載入應用程式啟動分析。選擇此標籤會顯示應用程式啟動的分析資料。

Web 平台視圖

Android 和 iOS 並不是唯一獲得性能提升的平台。此版本還改進了 Flutter Web 的平台視圖性能。如果您不熟悉平台視圖,它們是 Flutter 允許您在應用程式中託管來自底層平台的原生 UI 組件的方式。Flutter Web 使用 HtmlElementView Widget 實作此功能,它允許您在 Flutter Web 應用程式中託管 HTML 元素。如果您使用的是 google_maps_fluttervideo_player Plugin 的 Web 版本,或者您遵循 Flutter 團隊關於如何優化 在 Web 上顯示圖片 的建議,那麼您就在使用平台視圖。

在之前的 Flutter 版本中,嵌入平台視圖會立即創建一個新的畫布,每個額外的平台視圖會再增加一個畫布。額外的畫布成本很高,因為每個畫布的大小都是整個視窗的大小。此版本 重新使用為先前平台視圖創建的畫布,因此您不會在每秒鐘都產生 60 次成本,而只會在應用程式整個生命週期中產生一次成本。這意味著您可以在 Web 應用程式中擁有多個 HtmlElementView 實例,而不會降低性能,同時也能在使用平台視圖時減少捲軸卡頓。

生態系統

Flutter 不僅僅是框架、引擎和工具,它還有超過 20,000 個與 Flutter 相容的套件和 Plugin 在 pub.dev 上,而且每天還有更多套件被加入。Flutter 開發人員每天都會與大量生態系統中的套件互動,因此讓我們看看自上次版本發佈以來 Flutter 生態系統中發生了什麼。

Flutter Ads 正式發佈

最重要的是 Google Mobile SDK for Flutter 正式發佈,這是在 11 月發生的。

此版本支援 5 種廣告格式,整合了 AdMob 和 Ad Manager 支援,並包含了一個新的中介功能的測試版本,以幫助您優化廣告性能。有關將 Google Ads 整合到 Flutter 應用程式以及其他變現選項的更多資訊,請 查看 flutter.dev 上新的變現頁面

WebView 3.0

Flutter 此次另一個新的版本是 webview_flutter Plugin 的 3.0 版本。我們提升了版本號碼,因為加入了許多新功能,還因為 Android 上 Web 視圖工作方式的潛在重大變更。在之前的 webview_flutter 版本中,混合合成模式已經可用,但不是預設模式。混合合成修復了先前預設虛擬顯示模式的許多問題。根據使用者回饋和議題追蹤,我們認為混合合成是時候成為預設模式了。此外,webview_flutter 還加入了一些廣受歡迎的功能:

此外,在 3.0 版本中,webview_flutter 為一個新的平台提供了初步支援:Web。我們已經有很多開發者詢問是否能夠在 Flutter Web 應用程式中託管 Web 視圖,這允許您從單個程式碼庫中為行動設備或 Web 構建應用程式。在 Flutter Web 應用程式中託管 Web 視圖是什麼樣子的呢?從程式碼的角度來看,它看起來完全一樣:

在 Web 上運行時,它按預期工作:

請注意,目前 webview_flutter 的 Web 實作有一些限制,因為它是使用 iframe 構建的,iframe 只支援簡單的 URL 載入,而且無法控制或與載入的內容互動(有關更多資訊,請查看 webview_flutter_web README)。但是,我們正在根據大眾的需求將 webview_flutter_web 作為 未經認證的 Plugin 提供。如果您想嘗試一下,請將以下行添加到您的 pubspec.yaml 文件中:

如果您對 Web 或其他平台的 webview_flutter v3.0 有任何回饋,請 在 Flutter 儲存庫中將其記錄為 Web 視圖議題。此外,如果您之前沒有使用過 Web 視圖,或者您想複習一下,請查看 新的 Web 視圖 Codelab,它會逐步引導您完成在 Flutter 應用程式中託管 Web 內容的過程。

Flutter Favorites

Flutter 生態系統委員會 再次開會,指定以下套件為 Flutter Favorite 套件:

Flexfold 應用程式使用 flex_color_scheme 構建

恭喜這些套件作者,感謝您透過辛勤工作支援 Flutter 社群。如果您有興趣提名您最喜歡的 Flutter 套件參加 Flutter Favorite 獎項,請遵循 Flutter Favorite 程式頁面 上的指南和說明。

平台特定套件

如果您是套件作者,您必須做出的一個決定是您將支援哪些平台。如果您要構建一個包含平台特定原生程式碼的 Plugin,您可以 使用專案 pubspec.yaml 文件中的 pluginClass 屬性 來做到這一點,它指示提供功能的原生類別:

但是,隨著 Dart FFI 的日益成熟,您可以在 100% 的 Dart 代碼中實作平台特定功能,就像 path_provider_windows 套件 一樣。當您沒有任何原生類別可以使用,但仍然希望將您的套件指定為只支援某些平台時,請改用 dartPluginClass 屬性:

此設定到位後,即使您沒有任何原生程式碼,您也會將您的套件指定為只支援某些平台。您還必須提供 Dart Plugin 類別;在 Flutter.dev 上的 Dart-only 平台實作文件 中了解更多資訊。

Firebase

Flutter 生態系統的另一個重要組成部分是 FlutterFire,它被三分之二的 Flutter 應用程式使用。此版本加入了一組新的功能,可以更輕鬆地使用 Flutter 和 Firebase 構建應用程式:

  • 所有 FlutterFire Plugin 都從測試版本升級到穩定版本
  • DartPad 中對多個 Firebase 服務的新支援
  • 更方便地為認證和實時 Firestore 查詢構建 UI 的新函式庫
  • 可在 Alpha 版本中使用的 Flutter 的全新 Firestore 物件/文件映射

生產品質

FlutterFire Plugin 已經(幾乎)全部從測試版本轉移到穩定品質。

轉移到 Android、iOS 和 Web 穩定版本的 Plugin 包括 AnalyticsDynamic LinksIn-App MessagingPerformance MonitoringRealtime DatabaseRemote Config 以及新加入的 Installations。App Check Plugin 和 macOS 平台支援仍然處於測試階段,因為 Firebase 函式庫本身也處於測試階段。如果您擔心是否要選擇 Realtime Database、Analytics 或 Remote Config,因為 FlutterFire 函式庫還沒有準備好投入生產環境,那麼現在可以不用再擔心了。這些現在都是支援生產環境的完整 Plugin。

Dart-only Firebase 初始化

隨著套件的轉移到生產品質,我們加入了 從 Dart 初始化任何支援平台上的 Firebase 的功能:

此程式碼使用每個支援平台的適當選項來初始化 Firebase 應用程式,如 firebase_options.dart 文件中所定義,該文件包含每個平台的資料結構,如下所示:

若要收集每個平台的初始化選項資料結構的資料,請查看 新的 flutterfire CLI 工具

此工具會深入您的平台特定子資料夾中的資料,以找到唯一的捆綁 ID,然後使用該 ID 來查詢與您的匹配平台特定應用程式相符的 Firebase 專案的特定詳細資訊,甚至在沒有任何專案或應用程式的

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

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

宣佈 Dart 2.15

今天,我們發佈了 Dart SDK 的 2.15 版本,它具有使用 worker isolates 的快速併發、一個新的構造函數 tear-off 語言功能、dart:core 函式庫中改進的列舉支援、套件發佈者的新功能等等。

Graphic listing new 2.15 features

使用 worker isolates 的快速併發

幾乎所有現代設備都具有多核心的 CPU,能夠並行運行多個任務。對於大多數 Dart 程式而言,這些核心的使用方式對開發人員來說是透明的:Dart 運行時系統預設在單核上運行所有 Dart 程式碼,但會使用其他核心來執行系統級任務,例如異步輸入/輸出,例如寫入檔案或進行網路呼叫。

但是您的 Dart 程式碼本身可能需要並行運行。例如,您可能有一個連續的動畫和一個長時間運行的任務,例如解析一個大型 JSON 檔案。如果額外任務花費的時間太長,則可能會導致 UI 中出現卡頓或延遲。透過將這些額外任務移動到單獨的核心,動畫可以繼續在主執行緒上運行,而不會中斷。

Dart 的併發模型基於 isolates——彼此隔離的獨立執行單元——以防止與共用記憶體相關的一大類併發程式設計錯誤,例如 資料競爭等競爭條件。Dart 透過不允許在 isolates 之間共用任何可變物件來防止這些錯誤,而是使用 isolates 使用 訊息傳遞 交換狀態的模型。在 Dart 2.15 中,我們對 isolates 進行了許多重大增強。

我們首先重新設計和重新實作了 isolates 的工作方式,引入了一個新概念:isolate 群組。isolate 群組中的 isolates 共用代表正在運行程式的各種內部資料結構。這使得群組中的個別 isolates 的成本要低得多。現在,在現有的 isolate 群組中啟動額外的 isolate 的速度要快 100 倍以上,因為我們不需要初始化程式結構,而且這些產生的 isolates 消耗的記憶體減少了 10-100 倍。

雖然 isolate 群組仍然可以防止在 isolates 之間共用可變物件,但該群組是使用共用堆實作的,這解鎖了更多功能。我們可以將物件從一個 isolate 傳遞到另一個 isolate,這可以用於執行返回大量記憶體的任務的 worker isolates。例如,一個 worker isolate 進行網路呼叫以獲取資料,將該資料解析為一個大型 JSON 物件圖,然後將該 JSON 圖返回給主 isolate。在 Dart 2.15 之前,該結果需要進行深度複製,如果複製花費的時間超過畫面預算,則本身可能會導致 UI 卡頓。

在 2.15 中,worker isolate 可以呼叫 Isolate.exit(),將其結果作為參數傳遞。然後,Dart 運行時將包含結果的記憶體從 worker isolate 傳遞到主 isolate,而無需複製,並且主 isolate 可以在恆定時間內接收結果。我們在 Flutter 2.8 中更新了 compute() 工具函數,以利用 Isolate.exit()。如果您已經在使用 compute(),那麼在升級到 Flutter 2.8 後,您將自動獲得這些效能提升。

最後,我們重新設計了 isolate 訊息傳遞機制,使傳遞中小型的訊息的速度提高了大約 8 倍。傳送速度明顯加快,接收訊息幾乎總是在恆定時間內完成。我們還擴展了 isolates 可以相互傳送的物件類型,加入了對函數類型、閉包和堆疊追蹤物件的支援。有關詳細資訊,請參閱 SendPort.send() 的 API 文件。

要了解有關如何使用 isolates 的更多資訊,請參閱我們為 2.15 加入的新的 Dart 中的併發 文件。我們還有一些 程式碼範例 供您查看。

新的語言功能:構造函數 tear-offs

在 Dart 中,您可以透過使用函數的名稱來建立一個指向另一個物件上的函數的函數物件。在以下範例中,main() 方法的第二行說明了當它將 g 設定為 m.greet 時的語法:

1
2
3
4
5
6
7
8
class Greeter {
final String name;
Greeter(this.name);

void greet(String who) {
print('$name says: Hello $who!');
}
}
1
2
3
4
5
void main() {
final m = Greeter('Michael');
final g = m.greet; // g 保存指向 m.greet 的函數指標。
g('Leaf'); // 呼叫並列印 "Michael says: Hello Leaf!"
}

這種函數指標——也稱為函數 tear-offs ——在使用 Dart 核心函式庫時經常出現。以下是一個透過傳遞函數指標來呼叫可迭代物件上的 foreach() 的範例:

1
2
3
4
5
6
final m = Greeter('Michael');

['Lasse', 'Bob', 'Erik'].forEach(m.greet);

// 列印 "Michael says: Hello Lasse!", "Michael says: Hello Bob!",
// "Michael says: Hello Erik!"

從歷史上看,我們不支援從構造函數建立 tear-offs(語言問題 #216)。這很煩人,因為在許多情況下——例如,在構建 Flutter UI 時——構造函數 tear-off 正是您需要的。從 Dart 2.15 開始,現在支援此語法。以下是一個透過呼叫 .map() 並將其傳遞給 Text 的構造函數的 tear-off 來構建包含三個 Text widget 的 Column widget 的範例。

1
2
3
4
5
6
7
class FruitWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: ['Apple', 'Orange'].map(Text.new).toList());
}
}

Text.new 指的是 Text 類別的預設構造函數。您也可以參考命名構造函數——例如,.map(Text.rich)

相關的語言變更

在實作構造函數 tear-offs 的同時,我們藉此機會修復了對函數指標的現有支援中的一些不一致之處。您現在可以特化泛型方法來建立非泛型方法:

1
2
3
T id<T>(T value) => value;
var intId = id<int>; // 2.15 中的新功能。
int Function(int) intId = id; // 2.15 之前的解決方法。

您甚至可以特化泛型函數物件來建立非泛型函數物件:

1
2
const fo = id; // 撕掉 `id`,建立一個函數物件。
const c1 = fo<int>; // 2.15 中的新功能;之前是錯誤的。

最後,我們清理了涉及泛型的類型文字:

1
2
3
var y = List; // 已經支援。
var z = List<int>; // 2.15 中的新功能。
var z = typeOf<List<int>>(); // 2.15 之前的解決方法。

改進 dart:core 函式庫中的列舉

我們對 dart:core 函式庫中的列舉 API 進行了一些便利的補充(語言問題 #1511)。您現在可以使用 .name 獲取每個列舉值的字串值:

1
2
3
4
5
6
7
enum MyEnum {
one, two, three
}

void main() {
print(MyEnum.one.name); // 列印 "one"。
}

您也可以按名稱查詢列舉值:

1
print(MyEnum.values.byName('two') == MyEnum.two);  // 列印 "true"。

最後,您可以獲取所有名稱值對的映射:

1
2
final map = MyEnum.values.asNameMap();
print(map['three'] == MyEnum.three); // 列印 "true"。

有關使用這些新 API 的範例,請參閱 此 Flutter PR

壓縮指標

Dart 2.15 加入了對壓縮指標的支援,這是一種技術,如果只需要支援 32 位地址空間(最多 4 GB 記憶體),則 64 位 SDK 可以使用更節省空間的指標表示形式。壓縮指標會顯著減少記憶體;在我們使用 GPay 應用程式進行的內部測試中,我們發現 Dart 堆大小減少了大約 10%。

由於壓縮指標意味著無法定址 4 GB 以上的任何可用 RAM,因此該功能位於 Dart SDK 中的一個設定選項之後,只有在構建 SDK 時,Dart SDK 的嵌入器才能切換該選項。Flutter SDK 版本 2.8 已為 Android 構建啟用此設定,Flutter 團隊正在考慮在未來的版本中 也為 iOS 構建啟用它

Dart SDK 中包含的 Dart DevTools

DevTools 套件 的除錯和效能工具以前不在 Dart SDK 中;您必須單獨下載它。從 Dart 2.15 開始,您現在下載 Dart SDK 時就可以獲得 DevTools,而無需進一步的安裝步驟。有關將 DevTools 與 Dart 命令列應用程式一起使用的更多資訊,請參閱 DevTools 文件

套件發佈者的新 pub 功能

Dart 2.15 SDK 在 dart pub 開發人員命令和 pub.dev 套件儲存庫中還有兩個新功能。

首先,有一個針對套件發佈者的新安全功能。目的是檢測發佈者何時意外地將機密——例如雲端或 CI 憑證——發佈到 pub 套件中。在了解到在 GitHub 儲存庫中,每天都會 洩露數千個機密 後,我們受到啟發加入了此洩露檢測功能。

洩露檢測作為 dart pub publish 命令中運行的預發佈驗證的一部分運行。如果它在即將發佈的檔案中檢測到潛在的機密,則發佈命令將在不發佈的情況下退出,並列印如下輸出:

1
2
3
4
5
6
7
8
9
10
11
12
Publishing my_package 1.0.0 to https://pub.dartlang.org:
Package validation found the following errors:
* line 1, column 1 of lib/key.pem: Potential leak of Private Key detected.

1 │ ┌ - - -BEGIN PRIVATE KEY - - -
2 │ │ H0M6xpM2q+53wmsN/eYLdgtjgBd3DBmHtPilCkiFICXyaA8z9LkJ
3 │ └ - - -END PRIVATE KEY - - -

* line 2, column 23 of lib/my_package.dart: Potential leak of Google OAuth Refresh Token detected.

2 │ final refreshToken = "1//042ys8uoFwZrkCgYIARAAGAQSNwF-L9IrXmFYE-sfKefSpoCnyqEcsHX97Y90KY-p8TPYPPnY2IPgRXdy0QeVw7URuF5u9oUeIF0";

在極少數情況下,此檢測可能會出現誤報,將您實際上打算發佈的內容或檔案標記為潛在洩露。在這些情況下,您可以將檔案加入 允許清單

其次,我們為發佈者加入了另一個功能,支援撤回已發佈的套件版本。當發佈了錯誤的套件版本時,我們通常建議發佈一個新的次要版本,以修復意外問題。在極少數情況下——例如,當您還沒有這樣的修復程式時,或者當您意外發佈了一個新的主要版本但打算發佈一個新的次要版本時——您可以使用新的 套件撤回功能 作為最後的手段。此功能在 pub.dev 上的管理 UI 中提供:

Screenshot of the package retraction UI

當套件版本被撤回時,pub 用戶端在 pub get 或 pub upgrade 中不再解析到該版本。如果任何開發人員已經解析到撤回的版本(因此它在他們的 pubspec.lock 檔案中),他們下次運行 pub 時會看到一條警告:

1
2
3
4
$ dart pub get
Resolving dependencies…
mypkg 0.0.181-buggy (retracted, 0.0.182-fixed available)
Got dependencies!

用於檢測雙向 Unicode 字元的安全分析 (CVE-2021–22567)

最近發現了一個涉及雙向 Unicode 字元的一般程式設計語言漏洞 (CVE-2021–42574)。此漏洞影響支援 Unicode 的大多數現代程式設計語言。以下 Dart 原始程式碼說明了該問題:

1
2
3
4
5
6
7
8
9
main() {
final accessLevel = 'user';

if (accessLevel == 'user‮ .⁦// Check if admin⁩ ⁦') {
print('You are a regular user.');
} else {
print('You are an admin.');
}
}

您可能會認為這個程式會列印 *You are a regular user.*,但實際上它可能會列印 *You are an admin.*!透過使用包含雙向 Unicode 字元的字串,可以利用此漏洞。這些字元會將文字的方向從左到右更改為從右到左,然後再返回,所有這些都在同一行中。使用雙向字元時,文字在螢幕上的渲染方式可能與實際文字內容大不相同。您可以在 此 GitHub 程式碼 gist 中看到一個範例。

針對此漏洞的緩解措施包括使用檢測雙向 Unicode 字元的工具(編輯器、程式碼審查工具等),以便開發人員可以意識到它們,並有意識地接受它們的使用。上面連結到的 GitHub gist 檔案檢視器就是一個顯示這些字元的工具的範例。

Dart 2.15 引入了一個進一步的緩解措施(Dart 安全公告 CVE-2021–22567):Dart 分析器現在會掃描雙向 Unicode 字元,並標記任何使用它們的情況:

1
2
3
4
5
6
7
8
$ dart analyze
Analyzing cvetest... 2.6s

info • bin/cvetest.dart:4:27 • The Unicode code point 'U+202E'
changes the appearance of text from how it's interpreted
by the compiler. Try removing the code point or using the
Unicode escape sequence '\u202E'. •
text_direction_code_point_in_literal

我們建議將這些字元替換為 Unicode 跳脫序列,以便它們在任何文字編輯器或檢視器中都可見。或者,如果您確實有合法使用這些字元的情況,您可以透過在使用前的行中加入覆蓋來禁用警告:

1
// ignore: text_direction_code_point_in_literal

使用第三方 pub 伺服器時的 Pub.dev 憑證漏洞 (CVE-2021–22568)

我們還發佈了第二個與 pub.dev 相關的 Dart 安全公告:CVE-2021–22568。此公告針對可能已將套件發佈到第三方 pub 套件伺服器(例如私人或公司內部套件伺服器)的套件發佈者。發佈到公共 pub.dev 儲存庫(標準設定)的開發人員不受此漏洞的影響。

如果您已發佈到第三方儲存庫,則該漏洞是:提交給該第三方儲存庫進行身份驗證的 OAuth2 臨時(一小時)存取權杖可能會被濫用於對公共 pub.dev 儲存庫進行身份驗證。因此,惡意的第三方 pub 伺服器可能會使用存取權杖在 pub.dev 上冒充您並在那裡發佈套件。如果您已將套件發佈到不受信任的第三方套件儲存庫,請考慮審計您在 pub.dev 公共套件儲存庫上的所有帳戶活動。您可以使用 pub.dev 活動日誌 來完成此目的。

結語

我們希望您會喜歡 Dart 2.15 中的這些新功能,今天即可使用。這是我們今年的最後一個版本,我們想藉此機會感謝 Dart 生態系統。感謝所有出色的回饋,感謝您在我們不斷發展中提供的持續支援,感謝您在過去一年中透過在 pub.dev 上發佈數千個套件來擴展我們的生態系統。我們迫不及待地想在明年重新開始,我們為 2022 年計劃了很多令人興奮的事情。在此之前,祝您假期愉快!


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

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

宣布 Flutter 2.8:回顧一年的成長

正值節日,我們今天宣布 Flutter 的重大更新,其中包含許多新功能和改進,以優化行動和網頁開發人員的體驗,並且讓我們更接近穩定支援桌面平台。

Flutter 的目標是改變應用程式的建構方式。它將行動、網頁、桌面和嵌入式開發整合到一個工具集中:讓開發人員首先專注於他們想要建構的內容,而不是他們想要鎖定的平台;提供一個高性能、高生產力的框架,縮短開發人員的內部迴圈;並讓一個程式碼庫能夠鎖定多個平台和外型。

新功能和改進:更快、更高效

此版本的主要重點之一是 行動性能。理想情況下,出色的性能應該免費提供,但實際上任何複雜的應用程式都需要優化,以確保它能很好地使用底層硬體和函示庫。這包括啟動性能,它可能會受到網路頻寬或其他初始化成本的限制;記憶體使用情況,特別是在記憶體受限的設備上;以及圖形渲染。我們一直在利用在 Google Pay 等大型 Google 應用程式中獲得的一些經驗,投資於讓 Flutter 本身更具性能,以及為您提供更好的工具來指導您對自己的應用程式進行分析和優化。只要升級到 Flutter 2.8,您的應用程式應該就能更快地啟動,並使用更少的記憶體。

最新的更新讓 將應用程式連接到後端服務 比以往更容易,例如 Firebase 和 Google Cloud。它新增了 生產級 Google Ads 的支援,以及對相機和嵌入式網頁插件的重大升級。此版本還包含 Dart 2.15,它在並發性方面做了重大改進,增加了新的語言功能,例如建構函式 tearoff 和增強的枚舉,以及優化,使記憶體使用率降低 10%。

透過 Flutter 的新開發人員生產力增強功能,應用程式只需一個下拉式 Widget 即可支援登入多個驗證服務。

此版本中我們投入的另一個重要主題(您會看到我們在未來版本中繼續投入),是進一步 提高開發人員生產力。有了狀態熱重載等功能,我們一直專注於為開發人員創造一個緊密的內部迴圈。我們現在開始探索一些更高階的抽象,讓開發人員更容易快速運行。例如,在此版本中,我們新增了一個登入 Widget,它使用 Firebase 來處理驗證。有了這個 Widget,您不必擔心登入的所有邊緣情況,例如雙重驗證或重置密碼使用者流程,也不必擔心支援 Google、Apple、Twitter 或 Facebook 作為驗證提供者的複雜性。像這樣的功能,基於 Flutter 的核心基礎,有可能改變開發人員建構應用程式的模式,將低程式碼解決方案的開發速度與完整的 UI 框架的靈活性與功能結合起來。

Flutter 2.8 和 Dart 2.15 現在都已推出,對於運行先前版本的現有應用程式來說,應該是一個輕鬆的升級。為了更詳細地說明,我們有一篇技術部落格文章涵蓋了 DartFlutter 中的增強功能。

使用 Flame 開發休閒遊戲

對於大多數開發人員來說,Flutter 是一個應用程式框架。但圍繞休閒遊戲開發的生態系統也在不斷增長,利用 Flutter 提供的硬體加速圖形支援。

今天,我們很高興慶祝 Flame 1.0 版的發佈,這是一個基於 Flutter 之上的模組化 2D 遊戲引擎。Flame 提供了您快速建構遊戲所需的一切:除了遊戲迴圈之外,它還包含核心基本元素,例如元件系統、動畫精靈和圖片、碰撞偵測、世界攝影機、效果系統,以及手勢和輸入支援。

Flame 是模組化的,也可以透過提供與其他函式庫整合的套件進行擴展,例如 Rive(用於動畫)、audioplayers(用於音樂和音效)、Forge2D(一個 Box2D 風格的物理引擎)、Tiled(地圖編輯器)、Fire Atlas(一個精靈表和動畫編輯器)。總之,Flame 和更廣泛的生態系統為休閒遊戲或 2D 遊戲開發人員提供了一套強大的服務。

Tomb ToadGravity RunnerBonfire:使用 Flame 建構的遊戲的三个例子。

Flame 由 Blue Fire 創建,這是一個專注於為 Flutter 和 Dart 創建開源套件和插件的貢獻者組成的小組。我們很高興與他們合作,並鼓勵您查看 Flame,如果您對遊戲開發感興趣。

Flutter 的持續發展

我們驚嘆地看到 Flutter 的發展速度有多快,它擁有一個欣欣向榮的應用程式和工具生態系統,建立在核心框架的基礎之上。在今年的 Google I/O 活動上,我們注意到,Play 商店中已經有超過 200,000 個使用 Flutter 建構的應用程式。在該活動舉行後的短短六個多月時間裡,Flutter 應用程式的數量幾乎增加了一倍Play 商店中現在有超過 375,000 個 Flutter 應用程式

Flutter 支援 Android、iOS、iPadOS、網頁、Windows、macOS 和 Linux:因此您不必重新撰寫應用程式,只需針對不同的設備或外型因子即可。

當然,Flutter 不僅僅用於 Android。根據獨立的行動分析公司 AppAnnie 的數據,使用 Flutter 在 iOS 上運行的應用程式包括頂級品牌和應用程式,包括 BMWeBay微信SHEIN飛利浦 Hue諾頓Trip.comGreggs。在網頁上,Flutter 成為了應用程式體驗的理想選擇,為 FlutterFlowRive 等設計工具帶來了益處。在桌面平台上,Ubuntu 工程團隊繼續使用 Flutter 建構各種 新的體驗 ,包括一個新的安裝程式和韌體更新程式。甚至像 PUBG 這樣的遊戲也發現 Flutter 非常適合 UI 螢幕。

生態系統的建立需要很長時間,但 Flutter 現在是佔據主導地位的多平台工具包,根據 StatistaJetBrainsSlashDataStack Overflow 的獨立數據顯示。我們不會因此而感到自滿,但 Flutter 人氣的提升導致了一個越來越廣泛的 套件 和工具生態系統來支援它。

回顧 2021,展望 2022

在過去艱難的一年裡,我們自己的工程團隊一直在忙碌。除了 Flutter 2.8 中的功能之外,我們還重寫了開發人員工具,發佈了空安全和 Web 支援,完成了用於原生程式碼整合的 FFI,增加了對 Material You 的初步支援,並努力提高性能和品質。我們總共關閉了近 20,000 個議題。我們創建了一個 全新的智慧網站 以更好地展示 Flutter。在過去的幾個月裡,我們投入了大量的精力來徹底改造我們的工程基礎設施,以提高工程師的生產力,並擴展測試。

展望 2022 年,我們希望能夠親自見到你們中的一些人。我們預計將更多投資於核心開發人員體驗,包括語言增強、文件更新,以及使使用 Flutter 建構複雜應用程式變得更容易的更高階抽象。我們將完成穩定的桌面支援,並進一步擴展我們在 Web 上的工作。我們還計畫擴展與其他平台的互操作性,以及將其移植到新的目標平台。我們才剛剛開始!

一些結語和致敬

我們想將這個 Flutter 2.8 版本獻給凱文·格雷,一位 Very Good Ventures 的開發人員,他一個星期前不幸去世了。自 Flutter 最初誕生以來,凱文一直是 Flutter 成功的重要貢獻者;他是許多早期 Flutter 範例的開發人員,包括我們最早的幾個高知名度客戶成功案例,例如 Flutter 在桌面平台上的首次演示,以及在 Google I/O 主題演講中展示的第一個 Flutter 範例。他是一個有天賦、關心他人、有趣且善良的人,認識他的人都會同意,他的離去留下了巨大的空缺。在悲傷的同時,我們也慶祝他的生命,並公開紀念他,以便他的影響力可以為所有人所知。沒有他,Flutter 就不會是現在這個樣子。

凱文,我們已經開始想念你了。感謝你為 Flutter 所做的一切,以及你的友誼。我們向他的家人和朋友致以愛意。

對於我們更廣大的 Flutter 開發人員和支援者社群,我們對你們表示感謝。我們希望 Flutter 2.8 能讓你們有足夠的探索空間。如果您還沒開始學習 Flutter,請加入近 40,000 名目前正在學習 Flutter Apprentice 書籍 的開發人員,這本書直到 1 月初對所有人免費。我們祝您節日快樂,平安健康。


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

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

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

應用程式有許多賺錢方式:作為實體商店的店面接受付款;提供訂閱或應用程式內購;或在您的應用程式中直接包含廣告。今天,我們很興奮地宣布,在六個月的 Beta 測試期後,[Google 行動廣告 SDK for Flutter](https://pub.dev/packages/google_mobile_ads) 現在正式上市。這是需要在應用程式中顯示廣告的 Flutter 應用程式的重大消息!

支援的廣告格式

Google 行動廣告 (GMA) SDK for Flutter 適用於 iOS 和 Android,並支援載入和顯示所有 Google [行動廣告格式](https://developers.google.com/admob/flutter/quick-start),包括:

橫幅廣告:一種矩形廣告,佔用應用程式佈局中的位置。這些廣告會在使用者與應用程式互動時保持在螢幕上,無論是固定在螢幕頂部或底部,還是與內容保持一致並隨著使用者捲軸而捲動。除了標準的固定尺寸橫幅廣告外,我們還支援適應橫幅廣告,這些廣告會根據設備的寬度和高度顯示最佳橫幅大小。

插頁式廣告:全螢幕廣告,會覆蓋應用程式的整個螢幕。這些廣告最適合放置在應用程式中的自然間隔或轉場處。

獎勵影片廣告:一種獎勵廣告單元,讓您可以透過與影片廣告、可玩廣告和調查互動來獎勵使用者應用程式內物品。這是遊戲開發人員中最受歡迎的廣告格式之一。

原生廣告:一種高度自訂的格式,讓您可以設計廣告以符合應用程式內容的外觀和風格。

應用程式開啟廣告:一種廣告格式,用於變現您的行動應用程式載入體驗。應用程式開啟廣告會在使用者開啟或切回您的應用程式時顯示。

Google AdMob 和廣告管理員

我們與 Google 廣告團隊合作建立了這個 Plugin,作為 Flutter 開發人員的官方廣告解決方案。GMA SDK for Flutter 將對 **Google AdMob 和 Google 廣告管理員** 的支援整合到單一 Plugin 中。

如果您不熟悉 Google 的廣告服務,您可能不知道 [AdMob](https://admob.google.com/home/) 和 [廣告管理員](http://admanager.google.com/home) 是兩種具有不同變現功能的不同產品。AdMob 平台專為希望從廣告中賺錢並獲得可行洞察以發展應用程式業務的行動開發人員設計。廣告管理員平台專為擁有大量直接銷售或多種庫存類型的發佈者設計。

[GMA SDK for Flutter](https://pub.dev/packages/google_mobile_ads) 整合了這些產品,透過在 iOS 和 Android 之間共用程式碼來滿足您的變現需求,並且無需重新編寫程式碼即可滿足不斷增長的需要。

中介和出價

此版本還包含新的中介功能預覽,可幫助您優化廣告效能。[中介](https://developers.google.com/admob/flutter/mediation/get-started) 可幫助您在一個位置管理用於向您的應用程式提供廣告的各種廣告來源。除了 Google 的需求外,您也可以透過此功能從非 Google 廣告網路提供廣告。使用中介,您可以將收到的廣告請求發送到多個廣告來源,並找到最佳的可用來源來滿足這些請求。除了傳統的中介外,它還支援出價,讓廣告來源可以透過即時拍賣來爭奪滿足您的廣告請求。這有助於確保您的每次展示都能獲得最高收益。

GMA SDK for Flutter 提供了與 iOS 和 Android 應用程式相同的廣告功能。您可以使用相同的工具來管理您的活動、追蹤廣告效能等等。

早期採用者

我們一直在與一些早期採用者合作,他們渴望在我們的生產版本發佈之前先開始使用 Flutter 的廣告支援。其中一位開發人員是 Lotum,他們最近重寫了他們非常成功的文字遊戲「[4 Pics 1 Word](https://play.google.com/store/apps/details?id=de.lotum.whatsinthefoto.us&hl=en_US&gl=US)」,這是一款在 50 個國家名列前茅的應用程式,僅 Android 版本的安裝次數就超過了 5000 萬次。他們選擇使用 Flutter 重寫,並使用 GMA SDK for Flutter 顯示插頁式廣告和獎勵影片。

應用程式 Flutter 開發人員 Petra Langenbacher 表示:

「我們已經對我們的應用程式進行了多年的微調和優化,我們想知道完整的重寫是否會影響我們的收益或使用者群體。但我們很驚喜地發現,情況並非如此:我們能夠進行這些更改,而不會產生任何負面影響!」

感謝 Lotum 和所有其他早期採用者提供寶貴的回饋。我們感謝您對此初始版本的幫助。

其他變現功能

除了廣告外,Flutter 還提供其他變現應用程式的方法。例如,[應用程式內購](https://pub.dev/packages/in_app_purchase) Plugin 讓您可以在您的應用程式中提供額外的內容,例如付費服務、數位商品和訂閱。Flutter 的 [Pay](https://pub.dev/packages/pay) Plugin 讓您的應用程式可以在 Android 設備上整合 Google Pay,在 iOS 上整合 Apple Pay。這使您能夠透過使用者在支付雜貨、零售商品和外送等事物時透過無縫體驗快速輕鬆地支援兩個平台。

有關我們的廣告或其他變現產品的更多資訊,請[查看我們新更新的網站](https://flutter.dev/monetization),您可以在其中找到範例、Codelab 和文件!

建立 Flutter 應用程式僅是開始。我們希望透過我們的變現功能套件,幫助您使用 Flutter 成功創業!


宣布 Google 行動廣告 SDK for Flutter 正式上市 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

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

宣布 DartPad 支援套件

今天,我們很高興地宣布,DartPad 現在支援套件!DartPad 是一個開源的、基於 Web 的程式碼遊樂場,可以直接在您的 Web 瀏覽器中運行 Dart 和 Flutter 應用程式。它允許您快速運行 Dart 程式碼以測試想法或編寫技術概念,而無需在您的本機系統上安裝 Flutter SDK 或任何工具。

自 DartPad 推出以來,最受歡迎的請求之一 就是加入支援直接在 DartPad 的編輯器中匯入套件,例如 Google FontsFirebase 驗證。在推出的第一階段,您可以從一組熱門套件中匯入。

為了幫助您入門,我們建立了幾個新的範例,您可以使用 DartPad 的範例選單找到這些範例。

Google Fonts 範例

透過在程式碼編輯器頂部加入匯入語句來開始使用套件。例如,要使用 Google Fonts 套件,請加入以下內容:

1
import 'package:google_fonts/google_fonts.dart';

DartPad 會為您處理 pubspec 細節,因此您只需要匯入語句即可。您可以使用建議的自動完成來變更字體,然後重新運行應用程式,就像在 IDE 中一樣。

套件支援如何運作

以下是 DartPad 中套件支援如何運作的快速概覽。DartPad 伺服器會取得支援的套件集,並使用 flutter pub get 來取得每個套件的最新相容版本。然後,伺服器會在分析和編譯您的 DartPad 指令碼期間使用這些套件版本。

此版本還支援最受歡迎的 Firebase 套件,因此您無需離開 DartPad 即可存取一系列後端服務。所有必要的 Firebase JavaScript SDK 都會在運行已編譯的應用程式之前載入到輸出面板中。

以下是一個使用 Firebase 的 簡單聊天應用程式

這個多使用者聊天應用程式僅使用在瀏覽器中運行(和編寫)的用戶端 Dart 程式碼實作,並使用 Firestore 資料庫在使用者之間共用訊息。雖然將資料庫直接開放給使用者似乎很危險,但實際上它很安全,因為它只允許使用一組特定文字的聊天訊息。閱讀 程式碼 中的註釋以進一步了解其運作方式。

要擴展聊天應用程式,您可以實作登入以識別誰說了什麼,方法是加入 Firebase 驗證。我們計畫加入更多 Firebase 功能,以擴展您在 DartPad 中使用 Firebase 可以執行的操作。

支援的套件

此第一階段的推出支援一組定義的熱門套件。要查看哪些套件可用(以及哪些版本),請點擊螢幕右下角的資訊圖示。

試試看!

立即在 dartpad.dev 上試用 DartPad 套件支援,並與我們的團隊分享任何 回饋。我們將會繼續擴展支援的套件列表。如果您對想要加入的套件有任何偏好,請 搜尋包含所需套件名稱的議題,並給它一個 👍「豎起大拇指」的反應。如果沒有您想要的套件的議題,請 建立一個議題,並將套件名稱放在標題中。

我們希望 DartPad 上的套件支援能夠讓您建立和展示您的 Flutter 設計、想法、小插圖等等。我們迫不及待地想看看您接下來會建立什麼!

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

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

關於網頁、社群和程式碼範例 - Q3 2021 調查結果

Flutter UX 團隊的季度調查報告回來了!這是我們第 14 次季度調查,在 8 月份持續了一週,透過各種管道宣佈,例如 IDE 彈出視窗、推特公告以及在 flutter.dev 上。我們收到了超過 8,000 位您的回應,一如往常,我們從中學到了很多關於您需求的資訊。

如果您想了解團隊如何分析資料,請查看此影片。

在本季度,我們發現 92% 的受訪者對 Flutter 感到滿意(39% 有些滿意 + 53% 非常滿意)。這個數字在過去 4 個季度一直很穩定,而 Flutter 開發人員的數量也在持續增長。我們仍然想聽聽您對 Flutter 各個部分的想法,因此在本季度的調查中,我們詢問了以下三個主題:

  • 開發人員社群
  • 網頁支援
  • 原始碼檔案中的程式碼範例。

請继续阅读,了解我們從調查中學到了什麼以及我們打算做些什麼。

開發人員社群

Flutter 很自豪能成為一個開源專案。Google 的 Flutter 團隊在社群計畫上投入了大量資源,以建立一個友善且包容的開發人員社群,並讓 Flutter 開發人員獲得成功。由於了解我們需要在哪些地方投入更多資源以及做得更好非常重要,因此我們詢問受訪者他們對 Flutter 開發人員社群的各種陳述的認同程度。當我們說「開發人員社群」時,我們指的是社交網路群組、問答論壇、聊天室、聚會等等。

49% 的所有開發人員表示,他們參與了某種形式的線上或線下社群。我們發現大多數開發人員在社群中感到受到歡迎(86%)並敢於提出問題(86%)。

大多數開發人員在社群中感到受到歡迎(86%)並敢於提出問題(86%)。

我們要感謝您,我們的開發人員社群,為建立一個安全和支持的空間。Flutter 旨在帶來 樂趣,而擁有一定的心理安全感,能夠嘗試新事物、犯錯,以及對自己能夠建造的東西感到驚奇,是獲得樂趣的重要組成部分。我們確定了 Flutter 團隊可以努力發揮影響力的幾個領域,例如讓更多問題得到解答,以及為社群中的領導者提供更好的曝光率。我們將與社群密切合作,共同改善兩者。

網頁支援

Flutter 團隊在今年早些時候宣佈 網頁支援已穩定。現在,在 6 個月後,大約 13% 的 flutter run 指令以及 11% 的 flutter build 指令都針對網頁。因此,我們想知道穩定版本發佈後,您對網頁支援的看法如何變化。我們在 2020 年第 3 季度也詢問了類似的調查問題,因此我們能夠比較一些數據點。

首先,我們發現 38% 的開發人員在調查前一個月中使用 Flutter Web 應用程式進行開發。此外,在所有開發人員中,有 52% 的開發人員在過去 6 個月(自穩定版本發佈以來)使用過 Flutter Web 應用程式。本節中的問題僅針對這組開發人員。

總體而言,有 63% 的開發人員對 Flutter 開發生產級別 Web 應用程式的能力感到滿意(23% 非常滿意)。當我們專門詢問 Flutter 應用程式在網頁上的效能時,67% 的開發人員感到滿意(23% 非常滿意)。雖然這個數字低於整體滿意度,但我們很高興地看到對網頁效能的滿意度從 2020 年第 3 季度的 59% 上升到 67%。

為了了解我們有哪些機會,我們詢問開發人員遇到了哪些效能問題。不出所料,初始頁面載入速度是最常見的效能問題(48%),其次是捲軸(32%)。在頁面載入方面,我們正在研究縮減 Canvas Kit 下載大小並提供啟動畫面的 API。在捲軸方面,我們正在解決許多行為問題以及由於圖片解碼造成的卡頓。您可以在 公開路線圖 中找到更多詳細資訊。

初始頁面載入速度是最常見的效能問題(48%),其次是捲軸(32%)。

我們還詢問了哪些功能需要改進。SEO 被最多開發人員選中(36%),其次是下載(套件)大小(27%)。雖然我們了解索引在網頁上的重要性,但我們最初發佈的網頁支援專注於 Web 應用程式的利基市場,這些應用程式更重視內容創作,因此不需要索引。Rive 使用的 rive.app 就是一個很好的例子。他們有一個用 HTML 編寫的登陸頁面,該頁面對 SEO 友好,而當使用者啟動用 Flutter Web 編寫的主要應用程式時,SEO 就變得不再必要。我們目前的計畫是首先提高 Flutter 在網頁上的品質,使其在 Web 應用程式中表現出色,然後再解決其他用例,例如更重視內容消費的應用程式或頁面。

SEO 被最多開發人員選中為需要改進的功能(36%),其次是下載(套件)大小(27%)。 

原始碼檔案中的程式碼範例

由於 Flutter 是一個開源專案,因此您可以在 IDE 中跳轉到 API 的定義並閱讀其程式碼範例,這些範例嵌入在原始碼中。但是,框架團隊正在考慮將程式碼範例從原始碼移到單獨的檔案中,以便啟用語法高亮顯示並將符號轉換為可點擊的連結。(有關更多資訊,請查看 中型程式碼範例測試程式碼範例 的設計文件。)由於這可能會影響您使用文件的方式,因此我們在本次調查中加入了一個部分,以了解有多少人可能會受到提議的設計的影響。

令我們驚訝的是,許多人經常使用原始碼檔案。事實上,有 70% 的開發人員每週至少閱讀一次原始碼檔案,如果不是每天的話。

70% 的開發人員每週至少閱讀一次原始碼檔案,如果不是每天的話。

我們想了解有多少人實際上閱讀並使用了 /// 註釋中的程式碼範例。結果表明,50% 的受訪者閱讀了程式碼範例,大約 21% 的受訪者複製了程式碼範例,即使現在這樣做不太容易。

50% 的受訪者閱讀了程式碼範例,大約 21% 的受訪者複製了程式碼範例。

然後我們詢問了與 /// 註釋中的程式碼範例互動時的相關問題。我們發現最大的問題是缺乏語法高亮顯示(27%)。此外,大量的程式碼範例塊使得閱讀其餘的文件變得困難(25%)。

最大的問題是缺乏語法高亮顯示(27%)。

這個結果支持將程式碼範例單獨儲存的益處,這將縮短實際 API 文件的長度,並啟用對語法高亮顯示和將符號轉換為可點擊的連結的支援。但是,由於許多人今天閱讀和複製文件中的程式碼範例,我們可能會考慮使用語法高亮顯示以內聯方式顯示程式碼;因此,在視覺上將程式碼範例與其餘文件隔開。

如果您有興趣關注這個主題,請關注與導航支援相關的以下問題: DartIntelliJ PluginVSCode Plugin

下次調查見!

我們看到越來越多的開發人員將 Flutter 作為其主要工作的一部分。這對我們來說是個好消息,我們致力於根據您的回饋,為您提供最佳的跨平台技術。

越來越多的開發人員將 Flutter 作為其主要工作的一部分。

請繼續將您的回饋意見發送給我們。但季度調查不是您唯一可以使用的管道。如果您有需要跟進的緊急問題,請在 GitHub 上提交。

Flutter UXR 團隊將繼續每季度進行調查。我們會在 flutter.dev、Flutter IDE Plugin 和 Twitter @FlutterDev 上宣佈調查。請繼續貢獻您的想法,因為團隊正在尋找重要問題的答案。您也可以透過 註冊即將進行的 UX 研究 來參與其他研究。

再次感謝所有參與本次調查並提供寶貴回饋的人。我們的目標是建立一個您喜歡的產品,我們感謝您抽出時間和精力幫助我們。


關於網頁、社群和程式碼範例 - Q3 2021 調查結果 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

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

Dart 診斷訊息

您是否曾經看到一條錯誤訊息,卻不知道它的含義以及您應該如何處理?實際上,可能比您想像的更多資訊可以幫助您回答這些問題。

讓我們舉一個相當常見的例子。以下程式碼中存在一個問題:

一個簡單的類別,在 `values.length` 中的 “length” 下方有一條紅色波浪線

在 IntelliJ IDEA 中,該訊息顯示在 Dart Analysis 視圖中:

IntelliJ IDEA 螢幕截圖,顯示錯誤訊息:屬性 `length` 無法無條件存取,因為接收器可以是 `null`。

在 Visual Studio Code 中,問題訊息顯示在「問題」面板中:

Visual Studio Code 中顯示與 IntelliJ IDEA 螢幕截圖相同的錯誤訊息

看起來很奇怪,因為我們剛剛在上一行檢查了 values 不是 null

該訊息告訴我們出了什麼問題,但並沒有真正幫助我們理解為什麼檢查不充分或如何回應錯誤。這些額外資訊實際上是可用的;只是可能不清楚如何找到它。本文的其餘部分將向您展示如何在 IntelliJ IDEA、Visual Studio Code 和 dart analyze 命令列工具的輸出中找到這些額外資訊的位置。

IntelliJ IDEA

如果您將滑鼠懸停在突出顯示的文字上,您可以獲得更多資訊:

IntelliJ IDEA 的螢幕截圖,其中包含以下文字中描述的內容

懸停包含我們上面看到的訊息(我們稱之為 問題訊息),但也包含其他有用的資訊:

  • 指向有關診斷的外部文件的連結
  • 一條 上下文訊息,解釋為什麼 null 比較不足以將屬性的類型提升為非空類型
  • 一條 修正訊息,描述您可以採取的一些措施來修正程式碼

上下文訊息包含與類型提升相關的額外文件的 URL,並告訴您欄位定義的行和檔案。遺憾的是,您無法從懸停導航到上下文位置,但您可以從 Dart Analysis 視圖導航。

雖然 Dart Analysis 視圖僅顯示問題訊息,但雙擊該訊息會將您導航到報告問題的帶有紅色波浪線的文字。對於其他有用的功能,請顯示上下文選單:

錯誤訊息的上下文選單的螢幕截圖

使用上下文選單,您可以導航到報告診斷的位置(使用 跳轉到來源,其工作方式與雙擊問題訊息相同)或導航到 values 的宣告(使用上下文訊息標記的選單項)。選擇 打開文件 將打開有關診斷的外部文件。

Visual Studio Code

在 Visual Studio Code 中,有兩種方法可以查看額外資訊。第一種是展開「問題」面板中的條目:

VS Code 的「問題」面板的螢幕截圖

第一行是我們之前看到的訊息(我們稱之為 問題訊息)。雙擊第一行或第二行會將您導航到出現問題的帶有紅色波浪線的文字。

第二行是一條 修正訊息,描述您可以採取的一些措施來修正程式碼。它還包含一個由診斷 ID 標記的連結,該連結會打開有關診斷的外部文件

第三行是一條 上下文訊息,解釋為什麼 null 比較不足以將類型提升為非空類型。雙擊上下文訊息會將您導航到 values 的宣告。上下文訊息包含與類型提升相關的額外文件的 URL。

您也可以透過將滑鼠懸停在突出顯示的文字上來查看此資訊,這會導致打開懸停文字:

VS Code 懸停文字的螢幕截圖

懸停文字包含與「問題」面板相同的資訊。它包含一個連結,可將您帶到外部文件,以及另一個連結,可導航到 values 的宣告。

dart analyze

命令列分析器 dart analyze 可以顯示與 IDE 相同的資訊,但您需要使用 --verbose 旗標才能查看所有資訊。

`dart analyze --verbose demo.dart` 輸出的螢幕截圖

總結

我希望本文能幫助您更輕鬆地找到理解分析器診斷所需的資訊。

如果您發現仍然難以理解的診斷訊息(因為訊息不清楚、需要上下文訊息來幫助您找到其他相關程式碼位置,或者文件不夠完整),請透過建立 dart-lang/sdk 議題告知我們。我們一直有興趣改進工具。


Dart 診斷訊息 最初發佈在 Dart 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

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

Google Summer of Code 2021 成果

Google Summer of Code (GSoC) 是一個全球性的計劃,旨在讓學生開發人員參與開放原始碼軟體開發。Google 贊助學生在夏季與一個指導性的開放原始碼組織合作進行一個為期 10 週的編程專案。在過去的 16 年中,已有超過 16,000 名學生參與了 Google Summer of Code。

2021 年是 Dart 組織第二次作為指導性組織參與 Google Summer of Code。繼我們在 3 月份 徵集學生提案 之後,我們收到了來自世界各地學生的 92 份專案提案,其中我們非常興奮地接受了 3 個專案。今天,我們很高興與大家分享我們的成果,由參與這些專案的學生進行描述。

Dart 的基於 Cronet 的 HTTP Client

作者:Soumyadip Mondal

cronet 套件是一個用於 Dart 原生平台的 HTTP 套件,由 Chromium 的網路引擎 支援。

當 Dart 已經在 dart:io 中支援 HTTP 時,您可能會問「為什麼要加入一個 HTTP 套件?」。其中一個原因是 package:cronet 可以使用 QUIC/HTTP3 協議,這是社群 強烈要求 的功能。除此之外,在許多情況下,package:cronetdart:io 更快

Cronet 的 Dart 繫結讓我們可以輕鬆存取其 功能,例如:socket 的可重用性、強大的快取和壓縮演算法、請求優先順序,以及 更可靠的 網路連線。各種 Google 產品——包括 YouTube、Chrome、Google 地圖、Google 相簿和 Google 應用程式——都已經依賴 Cronet 函式庫來滿足其網路需求。使用 package:cronet,您可以使用與 dart:io 類似 的 API 存取 Cronet 函式庫,只需對現有的 Dart/Flutter 應用程式進行很少或不進行程式碼更改。

查看 github.com/google/cronet.dart 以獲得 基準測試範例 以及與 dart:io比較。另請查看關於 package:cronet這篇部落格文章,以獲得技術概述和我們面臨的挑戰的討論。

Flutter 桌面工具

作者:Abdullah Deshmukh

在 Flutter 2 中桌面支援的 Beta 版發佈後,我們需要一個範例應用程式來示範如何編寫可以在 Windows、macOS 和 Linux 上運行的 Flutter 應用程式。我參與了該範例的開發,其形式是一個 Flutter linting 工具,可幫助您管理 Flutter 專案的 lint 規則。應用程式的原始碼顯示了您如何實現基本的桌面應用程式技術,例如讀寫檔案、實現響應式佈局、使用持久性儲存,甚至如何處理 YAML 檔案。此外,該範例還可以用於測試 Flutter 應用程式到各種桌面應用程式商店的分發。

如需更多詳細資訊,請造訪 GSoC ‘21:為 Flutter 建立桌面範例

A screenshot of the linting tool, displaying information for always_use_package_imports
Flutter linting 工具

pub.dev 的許可證檢測

作者:Bharat Biradar

pub.dev 上發佈的套件會根據各種指標進行評估,例如是否遵循 Dart 檔案慣例、是否有 CHANGELOG 檔案等。此分析由 pana(Dart 套件分析)完成。Pana 還負責檢測發佈套件的許可證識別碼。

到目前為止,pub.dev 上顯示的許可證名稱是透過簡單的正則表達式啟發式方法確定的,它們僅支援檢測少數許可證,準確性較差。此專案的任務是為 pana 建立一個許可證檢測器,以根據 SPDX 匹配指南檢測 SPDX 許可證

為 pana 建立的許可證檢測器使用與 v2_licenseclassifier 相同的方法,並進行了修改以更好地滿足我們的需求。

給定套件的 LICENSE 檔案,pana 使用三個步驟來檢測 SPDX 許可證識別碼:

  1. 從 SPDX 語料庫中消除明顯的不匹配: 將文字拆成標記(基本上是單詞),檢查 LICENSE 檔案是否有足夠數量的標記(至少 50%)與已知許可證相比,並消除所有不滿足條件的已知許可證。此步驟允許 pana 快速排除許多許可證,允許在步驟 2 中進行更昂貴的計算。
  2. 在未知許可證和剩餘的 SPDX 許可證中尋找匹配的子字串: 對於剩餘的已知許可證,在未知文字中尋找與已知許可證文字匹配的子字串。我們尋找子字串,因為未知文字可能包含多個許可證。在識別匹配的子字串時,我們忽略標記少於閾值 * known_license_中的_標記數的序列,因為此類序列沒有足夠的標記密度來構成匹配。如果對於給定的已知許可證找不到具有足夠標記密度的子字串,則我們知道它不是匹配項。
  3. 確定置信度分數: 此步驟估計找到的子字串的置信度分數(介於 [0,1] 之間)。首先,使用 levenshtain 單詞差異 將子字串與檢測到的 SPDX 語料庫許可證進行比較。然後,如果如下計算的置信度高於設定的閾值,則將許可證視為匹配項:
Confidence = 1 - (levenshtain_word_diff/number_of_tokens_in_known_license)

我們希望這能讓您對許可證檢測過程有所了解。如果您想試用許可證檢測器,您可以在 pana 儲存庫 中找到它。

非常感謝所有使用 Dart 申請 Google Summer of Code 2021 的人,感謝今年完成專案的學生,以及感謝幫助我們度過一個精彩的程式碼夏季的導師。如果您有興趣了解更多關於 Google Summer of Code 中 Dart 的資訊,請查看我們 2020 年的文章


Google Summer of Code 2021 成果 最初發佈在 Dart 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

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

免費學習 Flutter 的書籍,限時供應!

Screenshot of Flutter Apprentice cover

我們聽說很多人都想要學習 Flutter,但不知道從哪裡開始。所以我們有好消息要告訴你 - 我們將在接下來的 3 個月內免費贈送一本書,還可以參加讀書會來幫助您追蹤進度並回答問題。

《Flutter Apprentice》是為了在行動開發基礎之上建立而寫的。它將帶領您完成您的第一個完整的 Flutter 應用程式,包括設計複雜的 UI,以及更進階的概念,例如持久性、狀態管理,以及使用 Firebase 的雲端儲存。這本書甚至還涵蓋了在 iOS 和 Android 平台上發佈的內容。

《Flutter Apprentice》出自 Razeware,該團隊開發了 raywenderlich.com 的書籍、影片和教學課程。這本書的售價通常為 60 美元,但您可以在 2021 年 10 月 6 日到 2022 年 1 月 6 日之間免費存取《Flutter Apprentice》。

《Flutter Apprentice》是一本實用的書籍,有許多範例可以供您參考,以及您可以用在自己的應用程式中的程式碼。它基於最新的 Flutter 2.5 版本和 Dart 語言中的最新功能。無論您是想要深入了解 Flutter 更進階功能的經驗豐富的開發人員,還是您是應用程式開發新手並且有興趣將 Flutter 加入您的前端開發工具集中,我們相信您都能在其中找到很多有用的內容。

Image of Professor Dash

一起學習

我們很高興舉辦 《Flutter Apprentice 讀書會》,這是每週一次的機會,可以聆聽現場討論,並由這本書的作者和社群專家解答您的問題。我們將與 Flutteristas 和 Flutter 社群中的其他知名領袖合作,主持讀書會。每個週三下午 12 點(美國東部時間)/ 上午 9 點(太平洋時間)加入 Flutter Community YouTube 頻道 參加總結和討論。

關注我們,參加隨堂測驗、贏取您自己的 Dash 毛絨玩具的機會、與這本書的作者進行 AMA 等等。

取得存取權

若要開始,請前往 flutter.dev/apprentice-giveaway,您將在其中找到存取這本書的說明。

您也可以訂閱 Flutter 團隊的更新。我們期待在旅途中與您同行;一路順風!


使用 Flutter Apprentice 免費學習 Flutter! 最初發佈在 Flutter 上的 Medium,人們在這裡透過突出顯示和回應這個故事來繼續討論。