第 3 讲把值送进了画面。反方向还没讲。
onTap 里没有代码
{ "type": "button", "label": "Call next", "onTap": { "type": "tool", "tool": "queue.next" } },
{ "type": "button", "label": "Take a ticket", "onTap": { "type": "tool", "tool": "queue.take" } }
onTap 是 { type, tool }。「按这个会调用一个叫 queue.next 的工具」就是全部,那工具做什么并没有写。
也写不了。这个文件是服务器课程里做的那台服务器发来的,活儿在那台服务器上干。
接住的一侧
rt.buildUI(
context: c,
// 名字到这儿。宿主不知道这名字是什么意思。
onToolCall: (tool, params) async => fired.add(tool),
)
这就是第 1 讲留成空函数的那个位置。在真实应用里,这里放的是客户端课程第 3 讲的一行。
onToolCall: (tool, params) async {
// 名字来自画面。原样传过去。
final r = await client.callTool(tool, params);
final state = jsonDecode((r.content.first as TextContent).text)
as Map<String, dynamic>;
state.forEach(rt.stateManager.set);
},
tool 原样传过去。没有 if (tool == 'queue.next') 这样的分支 — 一旦加进去,服务器每多一个工具就得改一次宿主。