Flutter 官方 LLM 動態 UI 庫 flutter_genui 發布,讓 App UI 自己生成 UI

今日,Flutter 官方正式發布了它們關于 AI 大模型的 package 項目: genui ,它是一個非常有趣和前沿的探索類型的項目,它的目標是幫助開發者構建由生成式 AI 模型驅動的動態、對話式用戶界面

也就是它與傳統 App 中“寫死的”靜態界面不同,是一個可以基于 AI 模型,支持由 AI 根據與用戶的實時對話動態生成 UI 的 SDK 。

當然,它并不是一個完全 Free 的動態 UI 項目,雖然看起來它是動態的,甚至可以用來做熱更新,但是實際上也是存在限制條件。

首先它的作用是:應用能夠實時渲染由 AI 返回的結構化數據 ,也就是 JSON 數據,所以實際上 flutter_genui 是一個基于文本描述,然后經過 AI 返回結構化數據進行渲染驅動的過程:

在 SDK 里,主要是通過一個名為 UiAgent 的接口,它負責管理與 AI 之間的交互循環,簡化了開發流程

而對于 UI ,開發者可以定義一個 AI “允許使用” 的 Flutter Widget 詞匯表 Catalog ,AI 將基于這個 Catalog 來構建 UI,比如官方的 Demo 就提供了類似的 catalog 目錄來限制 UI 風格:

具體來說,就是定義好的各種 CoreCatalogItems 通過 GenUiManagercatalog 配置,讓 AI 知道應該用哪些組件來生成需要的 UI :

這其中 CatalogItem 就像是每個 Widget 的“角色卡”,它核心規定了三件重要的事情:

  • name: Widget 的名字(例如 “Column”, “Text”, “ElevatedButton”),這是給 AI 看的,AI 會通過這個名字來指定使用哪個 Widget
  • dataSchema: 一個 Schema 對象,它用 JSON Schema 的格式,精確定義了這個 Widget 需要的所有參數,包括參數名、類型(字符串、數字、布爾等)和是否必需,這為 AI 提供了結構化的指令
  • widgetBuilder: 它負責接收 AI 返回的、符合 dataSchema 規范的 JSON 數據,并將其真正地渲染成一個 Flutter Widget

如果么有定義任何自定義組件,而是直接使用了 CoreCatalogItems.asCatalog() ,那么 AI 在生成 UI 時就只能使用 flutter_genui 內置的最核心的幾個基礎組件。

具體效果如下圖所示,甚至在整個過程中,flutter_genui 能夠捕捉用戶的交互行為(如按鈕點擊、文本輸入),并將這些事件作為上下文信息發送回 AI,以便 AI 在下一輪對話中做出響應:

而對于 flutter_genui,主要的核心對象有:

  • UiAgent (門面): 這是開發者主要交互的入口點,它封裝了 GenUiManagerAiClient,是整個流程的協調者。
  • Catalog (Widget 目錄): 定義了 AI 可以使用的 Widget 集合,每個 CatalogItem 包含 Widget 的名稱、數據結構(Schema)和渲染它的構建函數
  • AiClient (AI 客戶端): 負責與大語言模型通信的接口,GeminiAiClient 是其針對 Gemini 模型的具體實現,可以拓展支持其他模型
  • GenUiManager (UI 狀態管理器): 管理所有動態生成的 UI 界面(稱為 “Surfaces”)的狀態,它提供了 addOrUpdateSurfacedeleteSurface 等工具供 AI 調用,并通過流(Stream)將更新通知給 UI
  • GenUiSurface (UI 渲染器): 一個 Flutter Widget,負責根據 GenUiManager 提供的 UiDefinition 遞歸地構建和渲染整個 UI 樹

比如以下是一個簡單的例字,展示了如何使用 UiAgent

import 'package:flutter/material.dart';
import 'package:flutter_genui/flutter_genui.dart';void main() {// 初始化 Firebase 等runApp(const MyApp());
}class MyApp extends StatefulWidget {const MyApp({super.key});State<MyApp> createState() => _MyAppState();
}class _MyAppState extends State<MyApp> {late final UiAgent _uiAgent;final List<GenUiUpdate> _updates = [];void initState() {super.initState();_uiAgent = UiAgent('You are a helpful AI assistant that builds UIs.',catalog: CoreCatalogItems.asCatalog(),onSurfaceAdded: _onSurfaceAdded,);}void _onSurfaceAdded(SurfaceAdded update) {setState(() {_updates.add(update);});}void _sendPrompt(String text) {if (text.trim().isEmpty) return;_uiAgent.sendRequest(UserMessage.text(text));}void dispose() {_uiAgent.dispose();super.dispose();}Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('GenUI Demo')),body: Column(children: [Expanded(//  渲染動態 UI 界面child: ListView.builder(itemCount: _updates.length,itemBuilder: (context, index) {final update = _updates[index];return GenUiSurface(host: _uiAgent.host,surfaceId: update.surfaceId,onEvent: (event) {// UiAgent 會自動處理事件},);},),),// 聊天輸入框 Widget ,調用 _sendPrompt// ····],),),);}
}

另外,在前面我們說過,AI 返回的是一個結構化的 JSON 數據,而對于 genui 來說,他底層會有一個dart_schema_builder 的基礎工具包支持,它的核心作用是讓你能夠用 Dart 代碼來創建和驗證 JSON Schema

可以把它理解成一個“翻譯器”,在 flutter_genui 的世界里,AI 需要知道它有哪些 UI 組件 (Widgets) 可以使用,以及每個組件需要哪些參數,這些規則就是通過 JSON Schema 來定義

簡單說,它的作用是:

  • 用 Dart 構建 JSON Schema: 開發者不需要手動編寫復雜的 JSON 文件來定義規則,而是可以通過 Dart 的鏈式調用來構建,例如,你可以定義一個“卡片”組件,規定它必須有一個 title (字符串類型) 和一個 description (也是字符串),還有一個可選的 imageUrl
  • 數據驗證: 它可以根據你定義的 Schema 來驗證一個 JSON 對象是否合法,這在接收 AI 返回的數據時至關重要,可以確保 AI 給出的 UI “指令”是完整且格式正確的,避免程序因數據格式錯誤而崩潰
  • 為 AI 提供“工具”的藍圖: flutter_genui 會將使用 dart_schema_builder 創建的 Schema 發送給大語言模型,這等于告訴 AI:“你可以使用這些工具(Widget),每個工具的參數和格式必須遵守這份說明書。”

也就是,對于 genui 底層,會使用 dart_schema_builder 為 Flutter Widgets (例如 InformationCard, ItineraryDay) 定義好 Schema,將這些定義好的 Widgets 注冊到 flutter_genuiCatalog

之后用戶輸入文本,UiAgent 啟動,AiClient 將對話和從 Catalog 中提取的 Schemas 發送給 LLM,LLM 返回一個符合某個 Schema 的 JSON 指令,UiAgentGenUiManager 解析該指令,更新 UI 狀態。

最后 GenUiSurface 監聽到狀態變化,使用 Catalog 中的構建函數,將 JSON 數據渲染成用戶可見的 Flutter 界面。

所以最終 UI 是通過 GenUiManager + GenUiSurface 渲染出來,具體大概流程為:

  • GenUiManager 負責管理所有 UI 界面的當前狀態,內部有一個 _surfaces map,用來存儲所有 UI 界面(Surface)的定義,每個 Surface 都有一個唯一的 surfaceId,其對應的值是一個 ValueNotifier<UiDefinition?>,這意味著當 UiDefinition 改變時,可以通知監聽者

  • 在 AI 更新時,GenUiManager 會更新 _surfaces map 中對應 surfaceIdUiDefinition,然后通過一個 StreamController (_surfaceUpdates) 發出 SurfaceAddedSurfaceUpdated 事件,這個廣播是 UI 能夠自動重建的關鍵。

  • GenUiSurface 是一個 StatefulWidget,它是將抽象的 UiDefinition 渲染為用戶可見界面的最終執行者,它監聽了 surfaceIdValueNotifier ,并有一個遞歸 _buildWidget 函數

  • GenUiSurface 會從根 widget ID 開始,從 UiDefinition 中查找 widget 的 JSON 數據,然后調用 widget.host.catalog.buildWidget 方法,buildWidget 方法會找到對應的 CatalogItem 并執行其 widgetBuilder,從而創建出 Flutter Widget

所以可以看到,genui 的核心是利用 AI 大模型的 UI 組織能力,讓它通過用戶的描述和已有的控件目錄,動態渲染和生成所需的 UI 控件。

話說回來,這里說到 AI 生成的核心產物是 UiDefinition 對象,它本質上是一個 JSON 結構,JSON 作為純文本數據其實是可以保存的,比如我們對這部分數據進行攔截緩存,并在啟動時加載渲染,實際上這也是一個有限能力的熱更新模型

另外,目前使用 flutter_genui 最方便的默認實現是基于 Firebase 使用默認的 FirebaseAiClient ,它實現了與 Firebase AI(特別是 Gemini 模型)進行通信的支持,官方默認提供的 simple_chattravel_app 都是使用它。

你也可以在通過 AiClient 抽象接口實現自己自定義的 client 。

所以,你覺得 genui 有前景嗎?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922230.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922230.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922230.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis常用數據結構及其底層實現

Redis常用數據結構主要有String List Set Zset Hash BitMap Hyperloglog Stream GeoString:Redis最常用的一種數據結構,Sting類型的數據存儲結構有三種int、embstr、raw1.int:用來存儲long以下的整形embstr raw 都是用來存字符串&#xff0c;其中小于44字節的字符串用embstr存 …

O3.4 opencv圖形拼接+答題卡識別

一圖形拼接邏輯導入必要的庫pythonimport cv2 import numpy as np import sys導入cv2庫用于圖像處理&#xff0c;numpy庫用于數值計算&#xff0c;sys庫用于與 Python 解釋器進行交互&#xff0c;例如退出程序。定義圖像顯示函數def cv_show(name, img):cv2.imshow(name, img)c…

SQL注入常見攻擊點與防御詳解

SQL注入是一種非常常見且危險的Web安全漏洞。攻擊者通過將惡意的SQL代碼插入到應用程序的輸入參數中&#xff0c;欺騙后端數據庫執行這些非預期的命令&#xff0c;從而可能竊取、篡改、刪除數據或獲得更高的系統權限。以下是詳細、準確的SQL注入點分類、說明及舉例&#xff1a;…

EKSPod 資源利用率配置修復:從占位符到完整資源分析系統

概述 在 Kubernetes 集群管理過程中,資源利用率的監控和優化是保證應用性能和成本效益的關鍵環節。近期,我們對 EKSPod 管理界面的資源利用率顯示功能進行了全面修復,將原先簡單的占位符文本升級為完整的資源分析系統。本文將詳細介紹這次修復的背景、方案、實現細節和最終…

Linux內核(架構)

文章目錄Linux內核架構概述核心子系統詳解1、進程管理2、內存管理3、虛擬文件系統(VFS)4、設備驅動模型掌握Linux內核核心技術階段1&#xff1a;基礎準備階段2&#xff1a;內核基礎階段3&#xff1a;深入子系統階段4&#xff1a;高級主題&#xff08;持續學習&#xff09;調試和…

基于數據挖掘的單純冠心病與冠心病合并糖尿病的證治規律對比研究

標題:基于數據挖掘的單純冠心病與冠心病合并糖尿病的證治規律對比研究內容:1.摘要 背景&#xff1a;冠心病和冠心病合并糖尿病在臨床上較為常見&#xff0c;且二者在證治方面可能存在差異&#xff0c;但目前相關系統研究較少。目的&#xff1a;對比基于數據挖掘的單純冠心病與冠…

即夢AI快速P圖

原圖&#xff1a; 模型選擇3.0效果比較好&#xff0c;提示詞“根據提供圖片&#xff0c;要求把兩邊臉變小&#xff0c;要求把臉變尖&#xff0c;要求眼妝變淡&#xff0c;眼睛更有神&#xff0c;要求提亮面部膚色要求面部均勻&#xff0c;面部要磨皮!鼻頭高光和鼻翼兩邊陰影變淡…

【辦公類-109-04】20250913圓牌卡片(接送卡被子卡床卡入園卡_word編輯單面)

背景需求: 為了發被子,我做了全校批量的圓形掛牌,可以綁在“被子包”提手上,便于再操場上發放被子時,很多老師可以協助根據學號發放。 https://blog.csdn.net/reasonsummer/article/details/149755556?spm=1011.2415.3001.5331https://blog.csdn.net/reasonsummer/arti…

Shoptnt 促銷計算引擎詳解:策略模式與責任鏈的完美融合

在電商系統中&#xff0c;促銷計算是業務邏輯最復雜、變更最頻繁的模塊之一。它不僅需要處理多種促銷類型&#xff08;滿減、折扣、優惠券等&#xff09;&#xff0c;還要管理它們之間的優先級和互斥關系。 Shoptnt 設計了一套基于 策略模式 (Strategy Pattern) 和 責任鏈模式…

【HTTP 請求格式】從請求行 到 請求體

引言 在前后端開發中&#xff0c;前端和后端之間的交互主要依賴于 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;。HTTP 是互聯網通信的基礎&#xff0c;它定義了客戶端&#xff08;通常是瀏覽器或App&#xff09;和服務器之間如何交換數…

【自記】SQL 中 GROUPING 和 GROUPING SETS 語句的案例說明

我們用一個生活中的例子來理解&#xff0c;比如你開了家小超市&#xff0c;想統計「銷售額」&#xff0c;但需要從多個角度看&#xff08;比如按 “日期 商品”、“僅日期”、“僅商品”、“整體總銷售額”&#xff09;。假設你的銷售數據長這樣&#xff08;簡化版&#xff09…

C語言第五課:if、else 、if else if else 控制語句

C語言第五課&#xff1a;if、else 、if else if else 控制語句if else 、if else if else 聯合使用編程快速學習平臺if else 、if else if else 聯合使用 代碼示列 #include <stdio.h> int main(){//設置中文編碼輸出到控制臺system("chcp 65001");//今天星…

七彩喜智慧養老:用科技溫暖晚年,讓關愛永不掉線

“當銀發潮遇見科技力&#xff0c;養老方式正在發生一場靜悄悄的變革。”你有沒有想過&#xff1a;當父母年邁獨居時&#xff0c;如何確保他們的安全&#xff1f;當老人突然摔倒&#xff0c;如何第一時間獲得救助&#xff1f;當慢性病需要長期管理&#xff0c;如何避免頻繁奔波…

window顯示驅動開發—為頭裝載和專用監視器生成自定義合成器應用(二)

顯示相關的 API 的比較 API用途和目標受眾DisplayInformation用于檢索 CoreWindow 的呈現和布局屬性。HdmiDisplayInformation用于枚舉和設置受限模式集的僅限 Xbox 的 API。 高度專用于 Xbox 媒體應用方案。DisplayMonitor用于查詢物理監視器設備的屬性。 不公開有關操作系統…

Linux 高性能 I/O 事件通知機制的核心系統調用—— `epoll_ctl`

epoll 是 Linux 上處理大量文件描述符 I/O 事件的高效模型&#xff0c;而 epoll_ctl 則是你用來指揮 epoll 實例&#xff08;epoll instance&#xff09;的“遙控器”&#xff0c;負責向它添加、修改或刪除需要監視的文件描述符&#xff08;FD&#xff09;及其感興趣的事件。1.…

mysql 必須在逗號分隔字符串和JSON字段之間二選一,怎么選

如果必須在逗號分隔字符串和JSON字段之間二選一&#xff0c;那么 JSON字段是明顯更好的選擇。以下是詳細的對比分析&#xff1a;對比結論&#xff08;直接看這里&#xff09;方面JSON字段逗號分隔字符串勝出方查詢能力? 豐富的JSON函數支持? 只能使用LIKE模糊查詢JSON數據驗證…

DPI和DIP的區別

DPI 和 DIP 是兩個在計算機圖形和移動開發領域常見的術語&#xff0c;它們都與屏幕顯示和尺寸有關&#xff0c;但含義和用途不同。 DPI (Dots Per Inch) 定義&#xff1a;DPI 的全稱是 Dots Per Inch&#xff0c;即每英寸點數。它是一個衡量物理密度的單位&#xff0c;表示在…

數據幫助我們理解未知世界

主持人 尼古拉安根&#xff1a; 大家好&#xff0c;我是挪威南方財富基金首席執行官尼古拉安根。今天非常榮幸能與大衛斯皮格爾哈爾特爵士對話。坦率地說&#xff0c;他不僅是世界上最優秀的統計學家之一&#xff0c;也是我見過的最佳風險溝通者。他撰寫了大量優秀著作&#xf…

在使用git的很多操作是保持工作區干凈

這是一條鐵律下面是錯誤操作&#xff1a;自己明明寫完了代碼&#xff0c;想要提交。此時你的工作區長這樣你的提交順序是&#xff1a;git pull -> git commit -> git push但是現實往往不這樣&#xff0c;萬一拉下來的代碼和你當前工作區的代碼有沖突&#xff0c;你必須要…

通過語法推導樹快速求短語,簡單短語和句柄

第一步&#xff1a;寫出規范推導&#xff08;最右&#xff09;序列 規范推導就是最右推導。我們的目標是從起始符號 E 出發&#xff0c;通過每步替換最右邊的非終結符&#xff0c;最終得到句型 R(Pi)。 文法 G[E]: E :: RP | PP :: (E) | iR :: RP | RP* | P | P* 推導過程&…