跳到正文
本页内容

超越基础:自定义组件库

如何使用您自己的 React/Flutter 组件扩展 A2UI。学习构建像地图、图表这样的领域特定 Widget。

通俗类比:标准的 A2UI 组件就像标准的 乐高积木 (2x4, 1x2),它们通用且适合大多数场景。 自定义组件 就像是 3D 打印的专用零件。您为自己的飞船 (App) 专门设计了它们,它们能完美契合您的需求。

为什么需要自定义组件库?

标准组件库覆盖了 80% 的用例(按钮、文本、表格)。 但对于剩下的 20%,你需要更强大的武器:

  • 金融:一个 K 线图 <StockCandleChart />
  • 旅行:一个飞机选座器 <SeatSelector />
  • 地图:一个带定位的 <GoogleMapLocation />

A2UI 允许您注册 原生组件 (Native Components),而不是试图用一堆文本框凑出一个地图来。

核心机制:握手协议 (Handshake)

  1. 宿主应用 (Host App):“我有一个组件叫 flight-card。”
  2. 注册表 (Registry):将 flight-card 加入允许名单 (Allowlist)。
  3. Agent:发送 JSON { "type": "flight-card", "props": { ... } }
  4. A2UI 运行时:将字符串 flight-card 匹配到您的 React 函数并渲染它。

示例:构建一个地图组件

1. React 组件

这只是一个普通的 React 组件,里面没有任何 A2UI 的黑魔法。

// components/MapWidget.tsx
 export const MapWidget = ({ lat, lng }) => (
   <GoogleMap center={{ lat, lng }} zoom={12} />
 );

2. 注册条目

告诉 A2UI 这个组件存在。

// registry.ts
 const myCatalog = {
   'map-widget': MapWidget
 };

3. Agent 提示词

教会 AI 如何使用它。

 SYSTEM: 你可以通过发送以下 JSON 来展示地图:
 { "type": "map-widget", "props": { "lat": number, "lng": number } }

安全性:防火墙效应

这正是 A2UI 优于其他“UI 生成”方案的地方。

  • Agent 无法凭空创造新组件。
  • 如果 Agent 试图发送 <BitcoinMiner />(比特币挖矿机),A2UI 运行时会发现它不在注册表中,然后直接拦截
  • 您拥有对用户设备上运行的代码的绝对控制权。