到第三篇为止,客户端知道该显示什么,是 因为我们写在这里了。这次不写。
三行
final read = await client.readResource('ui://desk');
final text = read.contents.first.text!;
final screen = jsonDecode(text) as Map<String, dynamic>;
ui://desk — 546 B, 6 lines, type "page", title "Desk"
nothing about this screen is written in the client
在 Flutter 宿主里,这之后就交给 MCPUIRuntime.initialize(screen)。课程样例保持纯 Dart,好让任何人都能跑,只确认 它到了,而且它是一块画面。
缺的是什么
这个文件里没有的东西:
- 控件树
- 颜色、字号
- 按钮文案
- 哪个按钮调哪个工具
全都在服务端给的那份文档里。客户端是 把那份文档接过来交给运行时的管道。
所以服务端改了画面,客户端什么都不用做。就像服务端第四篇把 fontSize 从 88 改成 120 时没有重启服务端一样,这一侧也不重新构建。
546 字节
一块画面 546 字节。六行。
这个数字看着小,正是要点。搬运画面的成本小,搬运就成了默认。 如果每次都要发一版应用,那画面就该在应用里;如果只是取一份文档,那它就该在外面。