公司动态
Shaft框架核心概念实战教程:Widget、State与构建循环一次讲透
Shaft框架核心概念实战教程Widget、State与构建循环一次讲透【免费下载链接】ShaftA cross-platform GUI framework for Swift, built for demanding workloads and developer ergonomics项目地址: https://gitcode.com/gh_mirrors/sh/ShaftShaft 是一个用 Swift 编写的跨平台 GUI 框架专为高性能应用和开发体验而生。本文将带你快速上手 Shaft 框架的三大核心概念Widget组件树、State状态管理与构建循环Build Loop并通过内置的 Playground 示例看懂数据变化 → UI 自动刷新的完整链路。无论你是 Swift 新手还是从 Flutter / SwiftUI 转来的开发者这篇教程都能让你在 10 分钟内建立对 Shaft 的整体认知 一图看懂 ShaftSwift 跨平台 GUI 框架的运行现场先看 Shaft 框架实际跑起来的样子——官方内置的 Playground 应用同时充当交互演示和活文档左侧是导航、右侧是实时渲染的界面还支持多窗口与 3D 场景渲染只需 3 条命令即可运行macOS / Linux / Windows 均支持git clone https://gitcode.com/gh_mirrors/sh/Shaft cd Shaft swift run PlaygroundShaft 架构分层Widget 框架跑在哪里Shaft 把框架拆成了清晰的几层理解这张架构图就能明白 Widget 的构建循环由谁驱动Shaft Framework核心组件框架基本是把 Flutter 的 framework 层移植到 SwiftWidget、State、Element、构建循环等概念与 Flutter 高度相通Shaft.Backend平台抽象层提供事件循环、文本输入等能力如 SDLBackend.swiftShaft.Renderer图形抽象层屏蔽 Skia、CoreGraphics 等底层差异如 SkiaRenderer.swiftShaftKit内置的高层组件工具箱提供 Button、TextField、NavigationSplitView 等开箱即用的 Widget 对新手来说你 99% 的时间只会写 Framework ShaftKit 层的代码平台差异全部被封装掉了。核心概念一Widget——UI 是组件树不是视图本身在 Shaft 中Widget 只是对界面的一层描述是轻量、不可变的配置对象。它分为两种StatelessWidget无状态组件描述一段静态 UI框架调用build(context:)递归地把它拆解为更具体的子组件最终落到可渲染的节点上。核心定义见 Framework.swiftpublic protocol StatelessWidget: Widget { func build(context: BuildContext) - Widget }StatefulWidget有状态组件当 UI 需要在生命周期内动态变化计数、动画、输入框焦点等就用 StatefulWidget。它通过createState()生成一个独立的State对象来持有可变数据public protocol StatefulWidget: Widget { associatedtype StateType: StateSelf func createState() - StateType }一个最小的有状态组件长这样摘自内置文档页 Concept_ShaftKit.swiftfinal class Concept_ShaftKit: StatefulWidget { func createState() - some StateConcept_ShaftKit { Concept_ShaftKitState() } } final class Concept_ShaftKitState: StateConcept_ShaftKit { override func build(context: BuildContext) - Widget { ... } }核心概念二State——两种方式让 UI 跟随数据变化这是 Shaft 最省心的地方你几乎不需要手动管理状态框架提供两条互补的路径。方式 1setState 显式刷新State基类提供了setState回调会同步执行并立刻把当前组件标记为脏等待下一帧重建setState { myValue newValue // 数据先变再通知框架 }其内部实现只有两步Framework.swift执行闭包 →element.markNeedsBuild()。方式 2Observable 自动同步推荐 ⭐Shaft 直接基于 Swift 的 Observation 框架做响应式绑定——只要数据类打上Observable宏在 build 阶段读取它的属性就自动建立依赖值一变对应组件自动标记脏并在下一帧重建Observable class Counter { var count 0 } let counter Counter() class CounterView: StatelessWidget { func build(context: any BuildContext) - any Widget { Column { Text(Count: \(counter.count)) Button { counter.count 1 // 改数据即可无需手动 setState } child: { Text(Increment) } } } }嵌套的Observable对象同样支持——购物清单里每个条目都是独立可观察对象改数量只刷新用到它的组件。完整交互示例见 Concept_Observation.swiftPlayground 中 Observation 页可实时体验。核心概念三构建循环——一帧是如何画出来的理解了构建循环你就理解了整个框架的心跳。流程是标记脏节点setState或Observable属性变化 → 调用markNeedsBuild()组件进入脏列表dirtyElements调度帧SchedulerBinding.swift 的scheduleFrame()向 Backend 申请新帧重建Build PhasebuildScope把所有脏 Element 按深度排序后依次rebuild()——只重建脏的子树这就是性能的关键布局 绘制渲染树完成 layout/paint交给 Renderer如 Skia输出到窗口数据变化Observable / setState │ ▼ markNeedsBuild() ──► 脏列表dirtyElements │ ▼ 下一帧按深度排序 → 逐个 rebuild() → 布局 → 绘制这套机制保证了即使界面里有 1000 个组件数据只影响其中一个时也只有那一小块会重建。官方基准测试M1 Max2021 MacBook Pro显示 Shaft 在 CPU 与内存占用上都非常克制实战把三个概念串起来现在把前面内容组合成一个完整心智模型概念角色对应源码位置WidgetUI 的不可变描述组成组件树Framework.swiftState持有可变数据setState/ 观察数据同上ElementWidget 在树中的活实例脏标记打在这里同上Element类构建循环调度器 BuildOwner每帧只重建脏节点SchedulerBinding.swift想动手练习Playground 里 Concepts → Observation / ShaftKit 页面就是可交互的教程直接swift run Playground打开即可。新手上手路线建议 ️先跑起来swift run Playground逛一遍 Concepts 与 Demos 页面读内置文档Concept_Observation.swift 和 Concept_ShaftKit.swift 是最好的活文档理解分层对照架构图看 Backend.swift 与 Renderer.swift 两个协议写自己的应用从 ShaftKit 的高层组件Sources/Shaft/ShaftKit/开始用Observable做数据同步少用手动setState掌握 Widget、State 与构建循环这三块拼图你就拥有了阅读和扩展 Shaft 框架的完整地图——接下来无论是自定义 ShaftKit 样式还是接入自定义 Backend / Renderer都有据可依了。【免费下载链接】ShaftA cross-platform GUI framework for Swift, built for demanding workloads and developer ergonomics项目地址: https://gitcode.com/gh_mirrors/sh/Shaft创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考