【文章翻譯】Google Summer of Code 2025 Results

【文章內容使用 Gemini 2.5 Flash 自動翻譯產生】

Google Summer of Code 2025 成果

Google Summer of Code (GSoC) 計劃旨在讓全球的新開發者參與開源軟體開發。Google 贊助貢獻者在夏季與指導開源組織合作進行為期 12 週的程式設計專案。在過去的 20 年中,超過 20,000 名貢獻者參與了 Google Summer of Code。

2025 年,Dart 連續第六年作為指導組織參與 Google Summer of Code。今年,我們收到了來自世界各地潛在參與者超過 100 個專案提案。今天,我們將重點介紹今年夏天我們指導的一些專案。貢獻者在這篇文章中描述了他們的專案。

自訂 iOS 上下文選單項目

作者:Jing Shao

行動應用程式開發的一個關鍵目標是提供真正的原生體驗。在這個專案之前,iOS 上的 Flutter 應用程式有一個主要限制——開發者無法將自訂操作加入到原生 iOS 上下文選單中。在 GSoC 2025 期間,我成功地為 Flutter iOS 實作了自訂上下文選單支援,這顯著增強了 Flutter 應用程式在 iOS 上的互動能力。

這個專案建立了新的 IOSSystemContextMenuItemCustom API,允許開發者透過 TextFieldcontextMenuBuilder 屬性輕鬆地將自訂操作加入到原生 iOS 選單中;開發者可以加入帶有自訂標題和回呼的選單項目。實作將 Flutter 與原生 iOS UIMenu 系統橋接起來,確保自訂項目與標準 iOS 選單選項(複製、貼上)無縫整合,同時保持原生外觀和感覺。

有了這項改進,Flutter 開發人員現在可以建立更具表現力和功能豐富的應用程式。這項工作標誌著 Flutter 在提供出色的跨平台原生體驗方面向前邁出了重要一步,為開發人員提供了強大的工具來建立出色的應用程式。有關更多詳細資訊,請查看我在 GitHub 上的技術部落格和 PR。如有任何問題,請隨時與我們聯繫!我要感謝我的導師 JustinHuan 在整個專案中提供的寶貴指導和支援。

以下是一個範例,顯示了 清除文字加入愛心 ❤️大寫 等自訂選單項目與原生上下文選單中的標準 iOS 選單項目並列。

Dart TUI 框架

作者:Gedion Ezra

在這個專案之前,想要建立互動式終端應用程式的 Dart 開發人員通常必須轉向 Rust、Go 或 Python。Dart 中沒有成熟的基於文字的使用者介面 (TUI) 框架,這限制了開發人員只能使用 GUI 或靜態 CLI 工具。作為 GSoC 2025 的一部分,我們建立了 Pixel Prompt,這是一個受 Flutter 宣告式、基於元件的方法啟發的終端 UI 框架。Pixel Prompt 允許開發人員完全在 Dart 中建立動態互動式應用程式。

Pixel Prompt 引入了 Component 到 ComponentInstance 模型,其靈感來自 Flutter 的分層架構,將 Widget(在 Widget 層)映射到 Element 層,然後再映射到 RenderObject 層。Component 宣告式地描述 UI,而 ComponentInstance 管理狀態佈局和渲染。請查看簡化版的架構:

該框架支援有狀態和無狀態組件、輸入處理以及使用雙緩衝和 ANSI 差異化優化的渲染。這透過最大限度地減少終端重繪來提高性能,並透過虛擬終端解釋器實現可靠的黃金測試。

為了直觀地了解 Pixel Prompt 可以實現的功能,下面提供了一些演示的螢幕截圖。這些演示了框架支援的宣告式佈局、互動式元件和即時更新,顯示 Dart 現在無需離開其生態系統即可為完全互動的終端應用程式提供動力。

儘管 Pixel Prompt 已經能夠建立核心終端應用程式,但還有更多功能:支援複雜組件(如 TextAreaTables)、類似 flex 的佈局系統、專用的動畫 API 和視覺偵錯器都已計劃在未來貢獻。感興趣的開發人員可以在 pixel_prompt 儲存庫上探索未解決的問題並作出貢獻。

TestGen — 基於 LLM 的測試生成工具

作者:Amr Ahmed

TestGen 是一個實驗性專案,旨在自動化 Dart 的單元測試生成,其主要目標是透過生成專門針對程式碼庫中未覆蓋行的測試案例來提高測試覆蓋率。透過利用大型語言模型 (LLM) 生成有意義的測試,TestGen 減少了手動編寫測試所需的工作量,幫助開發人員實現更高的覆蓋率並提高程式碼品質。

使用 LLM 進行自動化測試生成的主要挑戰之一是決定向模型提供多少程式碼上下文。例如,如果一個函數需要測試,我們提供整個文件作為上下文,LLM 可能會不堪重負並產生不相關或不準確的測試。如果我們只提供函數本身,模型可能會遺漏函數內部的重要依賴項,導致測試不完整或損壞。為了解決這個問題,TestGen 使用 Dart 分析器將整個程式碼庫解析為 宣告,這些宣告是表示程式碼建構(如函數、變數、類別或 Mixin)的類別。解析後,它會建立這些宣告之間的依賴圖,這精確地顯示了給定宣告所依賴的程式碼片段。這是透過遍歷給定宣告的抽象語法樹 (AST) 並在訪問期間記錄其依賴項來完成的。使用此圖,TestGen 可以僅向 LLM 提供相關上下文(上下文感知提示),且深度可配置,幫助它生成準確且專注的測試,而無需額外噪音。

該圖顯示了給定 Dart 檔案生成的依賴圖。在測試 toBeTestedFunction 時,該圖幫助我們輕鬆檢索要包含在提示中的所有相關上下文。LLM 現在可以更好地理解該函數及其周圍環境,從而實現更有效和準確的測試生成過程。

為了使測試生成有效,TestGen 與 package:coverage 整合,以自動檢測程式碼中尚未測試的部分並針對這些部分。該工具透過 package:google_generative_ai 連接到 Gemini 模型使用 gemini-2.5-progemini-2.5-flashgemini-2.5-flash-lite 等變體來生成測試案例。然後,這些測試會經過驗證和回饋循環,在此期間它們會被執行並檢查錯誤。如果發現問題,錯誤會回饋到 LLM 中,以便它可以改進輸出,使最終測試更加準確和可靠。

這個套件還有更多內容,包括新功能、改進的測試和增加對 Flutter 專案的支援。您可以在 dart_testgen repo 上查看目前的問題列表。有關生成提示的範例,請參閱 default-prompt 範例。有關該專案的更多詳細資訊,請參閱完整的 GSoC 報告

LLM 驅動的 Android (Java/Kotlin) 文件翻譯成使用 JNIgen 綁定的 Dart

作者:Marshelino Maged

Android 函式庫和工具通常以 Java/Kotlin 程式碼片段記錄。儘管 JNIgen 可以為這些函式庫生成 Dart 綁定,但由於語言之間語法和結構上的差異,針對綁定編寫 Dart 程式碼可能具有挑戰性。這意味著開發人員無法直接重複使用官方 Android 文件和教學課程中找到的許多 Java/Kotlin 範例。native_doc_dartifier 專案旨在透過自動將 Android 文件中的 Java 和 Kotlin 片段翻譯成其 Dart 等效物來解決此差距。

範例 Java 片段。
範例片段翻譯。

該專案建立在 JNIgen 之上,JNIgen 透過外部函式介面 (FFI) 為 Java 和 Kotlin API 生成 Dart 綁定。因為 Java 和 Dart 在語法和語義上都存在差異,所以直接翻譯是不夠的。例如,Java 支援方法重載,而 Dart 不支援,這導致 JNIgen 使用重命名方法(例如 add$1add$2)來消除綁定歧義。為了生成準確的 Dart 程式碼,翻譯模型必須考慮這些綁定慣例,而不是依賴表面級別的轉換。

一個主要技術挑戰是規模:Android 函式庫的綁定通常包含數十萬行的 boilerplate 程式碼,遠遠超出即使是最大的語言模型(目前為 1M token)的輸入限制。為了解決這個問題,該專案引入了 抽象語法樹 (AST) 提取,它將綁定縮減到其公共 API 表面——結果約為原始大小的 6% ——同時保留了關鍵資訊。這與 檢索增強生成 (RAG) 相結合,其中每個類別的 AST 分開儲存,並且僅根據正在翻譯的程式碼片段檢索最相關的類別。

透過將 AST 提取與基於檢索的上下文選取 相結合,native_doc_dartifier 能夠生成既準確又與生成的綁定保持一致的 Dart 翻譯,同時在 LLM 上下文限制內保持高效。其結果是一個實用解決方案,可減少 Dart 開發人員處理 Android 文件時的摩擦,並加強 Java/Kotlin 和 Flutter 生態系統之間的互操作性。

由於翻譯由 LLM 生成,因此在編譯生成的 Dart 程式碼時偶爾會發生錯誤。為了提高可靠性,系統整合了一個回饋循環:編譯錯誤會回傳給 LLM 進行多次迭代,允許它細化和更正翻譯,直到生成一個可用的版本。這種迭代方法進一步增加了生成範例的穩健性。

欲了解更多資訊,請造訪 native_doc_dartifier 儲存庫。

將 TS 宣告翻譯成 Dart JS 互操作介面

作者:Nikechukwu Okoronkwo

Dart 透過 dart:js_interop 提供與 JavaScript 的強大互操作性,可用於與用 JavaScript 編寫的程式碼進行介面。然而,為大型函式庫和套件編寫綁定可能耗時且容易出錯。為了解決這個問題,我們建立了 JS 互操作生成器。它會自動從 TypeScript 宣告檔案 (.d.ts) 生成 Dart 包裝器。這有助於 Dart 在 Web 上的採用,並允許 Dart 和 Flutter 開發人員更輕鬆地利用來自 NPM 和其他地方的龐大 JS 函式庫生態系統。

該生成器的工作原理是解析 .d.ts 檔案,並將其 TypeScript 宣告轉換為其 Dart 等效項。這些宣告是根據 Dart 與 JS 互操作的方式生成的,確保在與 TS 宣告程式碼所代表的 JS 程式碼的互操作實現方面正確無誤,並且在可能的情況下盡可能接近 TS 宣告對程式碼的表示。

它支援廣泛的 TS 功能,包括變數、函數、列舉、類別、介面、命名空間和型別別名。該生成器生成 TS 型別的等效 Dart 表示,並在可能的情況下利用 dart:js_interoppackage:web 中的現有型別。這包括支援高級 TypeScript 功能,如匿名物件、匿名閉包、聯合、合併型別以及 typeof / keyof

您可以在 整合測試套件 中看到許多範例。我們已經成功使用生成器為諸如 nanoiduuid 等流行套件建立綁定。有關此內容的更多詳細資訊,請參閱 生成器測試結果

該專案位於 web repo 中的 web_generator 套件中。您可以透過執行 bin/gen_interop_bindings.dart 腳本來試用它。如果您遇到任何問題或錯誤,請隨時提交問題和/或作出貢獻!


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