第9章 常见问题解答
为什么文档质量这么差?
文档之所以不完善,是因为与大多数开源项目不同,iced 并不刻意迎合你的需求。
iced 并非那种随处可见的热门开源项目。它不隶属于任何公司,不是一个品牌,也不是一个商业实体。最关键的是,它也不是社区协作的成果。
iced 只是我的个人项目。我按照自己的节奏、利用自己的时间开发它,并作为开源项目免费提供给大众。
因此,我没有动力去提升库对新手和初学者的吸引力。我是否让你喜欢这个库无所谓,也没有理由试图说服你去使用它。
简单来说:
- 比起写文档,我更享受编码;
- 我不喜欢把用户当傻瓜似的“喂”知识;
- 我最终并不在乎是否会被广泛采用。
当我确实要写文档时,目的并非宣传。相反,我主要是为了测试自己能否用简单的语言——从问题出发——解释清楚这个库。这本书就是这种尝试的一次清晰体现!
因此,现有的文档并非为了迎合广泛受众或说服你在当前状态下使用该库而存在。它主要是为了让我巩固设计决策并从中找到乐趣,文档产出只是附带结果。
我相信,这种方式最终会为大家提供一套完备的学习资料,同时让我把精力浪费降到最低。但这需要时间!
为什么示例代码都无法编译?
每次向官方仓库推送提交时,GitHub CI 工作流 都会编译所有示例。它们极少出现损坏情况,即便发生,我也会迅速修复。所以,你搞错的可能性更大。这些示例是可以编译的。
许多新手常犯的一个初级错误是:假设可以从 master 分支复制代码,并期待它能与一年前的 crates.io 发布版本兼容。有些人甚至责怪项目方,认为这是他们的无知和无能所致。对此,我总是感到十分困惑。
版本标签存在的意义就在于此。
为什么每次发布都要彻底改变整个 API?
因为我是个糟糕的工程师,我想让你们和我一起受苦。
说笑归说笑,我一直在探索在 Rust 中构建 GUI 的最佳方式。我为什么要不改 API 呢?毕竟那些免费享受我成果的用户,我并没有欠他们任何东西。
如果你对此不满,尽管去要求退款,然后 fork 这个项目并自己维护它。
iced 真的被严肃地用于任何地方吗?
是的,确实有一些场景。
- Kraken 多年来一直向数千名用户分发桌面应用。
- System76 维护着一个软分叉,用于驱动他们全新的 COSMIC 桌面环境。
- 许多流行的开源项目都在使用它,例如 Halloy 和 Sniffnet。
- 许多用户每天在我们的 Discord 服务器上构建并分享各种酷应用。
如果你想了解更多,可以查看项目展示。
<插入功能> 什么时候开发?
iced 是一个一个人的项目。每一行代码要么是我写的,要么是我直接审查的。
我只是一个喜欢编码和造东西的家伙。我免费分享部分工作成果。我不设时间表,不做承诺,没有期待,也不授权给他人。我就喜欢这样。
话虽如此,这里有一份可视化路线图,能让你大致了解我目前对库未来发展的想法。不过我的想法经常变,路线图也可能随之改变!
我的 PR 什么时候会被审查?
我倾向于在发布前审查贡献。由于发布频率很低,所以可能要过几个月我才能看到你的代码。
我也可能会优先照顾某些人,比如我的朋友。我不打算对每个人都一视同仁。
不管怎样,如果你的贡献抱着“我必须热情地帮你审阅”的预期而来,那么请恕我直言:离我的开源项目远一点。
你为什么这么不专业、情绪化、还爱挖苦人?
你是在问我为什么玩得这么开心吗?这是我的个人项目,我想怎么表达就怎么表达。
我没有时间、精力,也没兴趣把文字改得四平八稳来讨好所有人。
这本书是用 AI 或 LLM 写的吗?
没有。这里的每一个糟糕的字都出自我手,我引以为傲——破折号也是。哔,啵。
大型应用该怎么组织结构?
把应用拆成多个页面,然后用简单的组合方式搭建起来。
The Pocket Guide 中有一个专门章节演示这种做法。
应用如何从 channel 接收更新?
可以用 Task::run 从异步 Stream 生成消息。
另外,如果 channel 的创建由你控制,也可以用 Subscription::run。
iced 支持从右到左的文字和 CJK 字符吗?
基础已经打好,但边界情况可能还没完全覆盖。
具体来说,文本编辑方面应该还有不少问题。不过自 0.14 版本起,已支持输入法编辑器(Input Method Editors)。
无论如何,完善的官方支持已在路线图中规划。
何时调用 view 和 subscription 函数?
每次消息批次处理完,以及 update 调用之后。
但这属于实现细节。你绝不应依赖于此。请将这两个函数视为声明式、无状态函数。
iced 会一直重绘吗?!
不会。不再会了!
过去,iced 在鼠标每次轻微移动时都会重绘整个窗口,但自 0.14 版本起,它默认支持并启用了响应式渲染。
我遇到 panic,提示没有运行的 reactor。怎么回事?
你很可能在使用 Task 执行需要 tokio 执行器的 Future:
there is no reactor running, must be called from the context of a Tokio 1.x runtime
你应该可以通过在 iced 库中启用 tokio 特性标志 来修复此问题:
iced = { version = "0.14", features = ["tokio"] }