為了將其納入情境,讓我們看看我如何將這種快取技術應用於我的範例應用程式 Commis,這是一個用於商業廚房和餐飲團隊的智慧助理。使用者體驗的核心是一個對話式聊天介面,廚師可以與 AI 助理討論即將到來的餐飲工作,以協調食譜分配和賓客數量。但是,當廚師第一次打開應用程式時,他們不應該從頭開始聊天。相反,我希望代理程式提供預先生成的 UI,其中包含與每項工作相關的資訊和操作。
void main() { final adminApp = FirebaseApp.initializeApp(); final firestore = adminApp.firestore();
runFunctions((firebase) { // NOTE: Firestore triggers (like onDocumentWritten) are currently // experimental in the Dart Cloud Functions SDK and are only supported // when running within the Firebase Emulator Suite. firebase.firestore.onDocumentWritten( (event) async { // Read the API key from the environment parameters final apiKey = StringParam( 'GEMINI_API_KEY', ParamOptions( defaultValue: '', label: 'Gemini API Key', description: 'API key to use when accessing the Gemini Developer API', ), ).value();
final jobId = event.params['jobId']; final jobData = event.data?.after?.data();
// Ensure we actually have post-write data to process if (jobData == null) { print('Could not find post-write job data.'); return; }
final jobBuffer = StringBuffer();
// ... // A whole bunch of lines that turn the job's properties into text for // the agent. // ...
try { final generator = ContentGenerator(apiKey); // Via a class that encapsulates the call to the LLM, generate A2UI. final message = await generator.generateFeed(jobData.toString());
if (message == noUiSentinel) { // Delete the cached document if the event is no longer upcoming await firestore.collection('feed').doc(jobId).delete(); print('No UI generated; deleting feed for $jobId.'); return; }
// Cache the generated A2UI message in the feeds collection await firestore.collection('feed').doc(jobId).set({ 'message': message, });
Future<void> _initAgent() async { // This repository is a class I use to hide away queries to Firebase. It's // really just grabbing values and providing a stream. final repository = context.read<FirestoreRepository>();
String? feeds;
try { // 1. Fetch active jobs and wait for their cached feed messages final jobs = await repository.getJobs(); final feedFutures = jobs.map((job) => repository.getFeedMessage(job.id)); final results = await Future.wait(feedFutures);
Web (72%)、Linux (73%) 和 Windows (74%) 的滿意度與 2025 年第四季度相比都有所提高。為了延續這一勢頭,仍有重大的路線圖計畫待執行,包括將 WebAssembly 作為預設的 Web 目標,以及與 Canonical 合作擴展多視窗桌面支援。這些基礎變革需要時間,這就是為什麼儘管總體趨勢朝著正確的方向發展,但滿意度差距尚未完全彌合的原因。
**工具和 IDE 體驗 (33%)**:主要圍繞著希望更深入的 Android Studio 整合:更多的 AI 工具、更多的原生支援、更好的視覺化。我們目前的 AI 投資主要集中在建立可與任何代理一起使用的 AI 工具,無論您的 IDE 是什麼。這包括 Dart MCP 伺服器和代理技能工作,這些工作早於本次調查的進行。話雖如此,當我們首次推出 Dart MCP 時,Android Studio 並不支援 MCP,但我們正在努力確保我們的工具也能在那裡運作。
當我們詢問是什麼建立了這種信任時,框架效能和穩定性以 26% 位居榜首,領先於社群規模和活動(20%)和文件品質(19%)。在評估一項全新功能時,更多人表示他們會信任它,因為它經過社群的「實戰考驗」(41%),而不是因為它是由 Google 工程師建立的(26%)。這對我們未來的方向來說是個好消息:我們建立的信譽是透過框架及其社群獨立贏得的。這正是我們希望在進一步開放維護者基礎時保護和成長的信任。
而且,儘管代理程式開發大幅降低了生產新軟體的成本,但它仍遠非免費。對於代理程式開發來說,時間就是金錢,這既是比喻意義上的,也是字面意義上的,因為查詢時間越長,意味著更多的令牌;這意味著更多的 AI 開支。有了 Flutter,成功完成編碼任務的代理程式無需重新開始支援另一個平台,從而為您節省了資金。
快速失敗,才能建造更好
我們知道我們想建造一個遊戲,您在其中駕駛月球著陸器,配備動態元素、自訂著色器和粒子效果。(我們不忍心將 Dash 本身置於冰冷的真空空間,所以,您將駕駛一艘船。) 當然,使用 AI 大大加速了這些概念的整合,但這並不妨礙稍後放慢速度並認真編寫高品質程式碼。如果有的話,透過 AI 進行的快速探索階段有助於您更快地達到該階段,因為您的許多失敗實驗可以在幾個提示的生命週期內來去,而不是花費數小時或數天的編程時間,只是為了了解某個特定的想法是否真的很有趣。如果這輩子有一件事無關緊要,那就是從未見天日的實驗性功能的程式碼品質。
**物理:** 因為這個遊戲發生在真空環境中,我們想要精確的反應控制系統 (RCS)。我們釋放了 Gemini Deep Research 來尋找我們需要的精確零大氣物理公式,它將這些公式編譯成 Google Doc。然後我們將該研究納入我們的語境中,Gemini 將方程式直接翻譯成 Dart。這些真的是正確的物理方程式嗎?可笑的是,我們不知道,因為我們不是物理學家!但是當您玩遊戲時,控制感肯定感覺正確。
**疊代原型**
我們從 AI Studio 的沙盒開始建立,以在提交架構之前生成快速、一次性的程式碼。這些豐富的原型可以作為模型以後的上下文壓縮,及早鎖定微觀決策。我們的一些原型具有更有趣的遊戲玩法,有些看起來更具吸引力,還有一些最清晰地捕捉了我們的零重力物理。對於我們的最終遊戲,我們將每個原型中最好的想法融合在一起。
我意識到核心問題是現代電腦架構的一個基本面向。您看,在現代多處理器 CPU 上,您可以告訴程式在未來精確的毫秒運行一段程式碼,但由於行程排程的性質,CPU 永遠無法保證完美精確度。而且,對我來說不幸的是,在重播期間啟動推進器的一毫秒延遲會從根本上改變飛船的模擬飛行路徑。我意識到,我不能僅僅記錄推進器時間戳,而是必須在每個推進器事件的精確時刻儲存著陸器物理狀態的完整表示,以校正重播期間的不準確性。Gemini 隨後整合了邏輯,以不斷將重播的即時模擬與這些物理檢查點進行比較,自動校正任何微小偏差。結果是完美無瑕、無崩潰的重播。
我們使用 Stitch 從單一提示生成了我們的行銷登陸頁面,並將我們正在運行的遊戲截圖作為上下文傳入。(誠然,如果生成優化的登陸頁面是我們的實際目標,我們會對此進行更多疊代。)使用一鍵匯出到 Antigravity,我們隨後下載了 HTML 並開始工作。因為我們是用 Dart 構建的,所以我們希望保持堆疊統一。我們使用 [Jaspr](https://pub.dev/packages/jaspr)(一個將 HTML 直接映射到 Dart 組件的 Web 框架)來無縫整合生成的 HTML。Gemini 完美處理了這種轉換,使我們能夠在遊戲和行銷網站之間共用程式碼,同時保留行業標準的 SEO 索引。