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') 같은 분기가 없다 — 넣는 순간 서버가 도구를 하나 더 만들 때마다 호스트를 고쳐야 한다.