名称: gpui-实体
描述: GPUI中的实体管理和状态处理。用于处理实体、管理组件状态、协调组件之间的交互、处理带状态更新的异步操作或实现反应式模式。实体提供安全的并发访问应用状态。
概述
Entity<T> 是类型 T 的状态句柄,提供安全的访问和更新。
关键方法:
entity.read(cx)→&T- 只读访问entity.read_with(cx, |state, cx| ...)→R- 使用闭包读取entity.update(cx, |state, cx| ...)→R- 可变更新entity.downgrade()→WeakEntity<T>- 创建弱引用entity.entity_id()→EntityId- 唯一标识符
实体类型:
Entity<T>: 强引用(增加引用计数)WeakEntity<T>: 弱引用(不阻止清理,返回Result)
快速入门
创建和使用实体
// 创建实体
let counter = cx.new(|cx| Counter { count: 0 });
// 读取状态
let count = counter.read(cx).count;
// 更新状态
counter.update(cx, |state, cx| {
state.count += 1;
cx.notify(); // 触发重新渲染
});
// 弱引用(用于闭包/回调)
let weak = counter.downgrade();
let _ = weak.update(cx, |state, cx| {
state.count += 1;
cx.notify();
});
在组件中
struct MyComponent {
shared_state: Entity<SharedData>,
}
impl MyComponent {
fn new(cx: &mut App) -> Entity<Self> {
let shared = cx.new(|_| SharedData::default());
cx.new(|cx| Self {
shared_state: shared,
})
}
fn update_shared(&mut self, cx: &mut Context<Self>) {
self.shared_state.update(cx, |state, cx| {
state.value = 42;
cx.notify();
});
}
}
异步操作
impl MyComponent {
fn fetch_data(&mut self, cx: &mut Context<Self>) {
let weak_self = cx.entity().downgrade();
cx.spawn(async move |cx| {
let data = fetch_from_api().await;
// 安全地更新实体
let _ = weak_self.update(cx, |state, cx| {
state.data = Some(data);
cx.notify();
});
}).detach();
}
}
核心原则
总是在闭包中使用弱引用
// ✅ 好:弱引用防止循环引用
let weak = cx.entity().downgrade();
callback(move || {
let _ = weak.update(cx, |state, cx| cx.notify());
});
// ❌ 坏:强引用可能导致内存泄漏
let strong = cx.entity();
callback(move || {
strong.update(cx, |state, cx| cx.notify());
});
使用内部上下文
// ✅ 好:使用闭包中的内部 cx
entity.update(cx, |state, inner_cx| {
inner_cx.notify(); // 正确
});
// ❌ 坏:使用外部 cx(多重借用错误)
entity.update(cx, |state, inner_cx| {
cx.notify(); // 错误!
});
避免嵌套更新
// ✅ 好:顺序更新
entity1.update(cx, |state, cx| { /* ... */ });
entity2.update(cx, |state, cx| { /* ... */ });
// ❌ 坏:嵌套更新(可能恐慌)
entity1.update(cx, |_, cx| {
entity2.update(cx, |_, cx| { /* ... */ });
});
常见用例
- 组件状态:需要反应性的内部状态
- 共享状态:多个组件之间共享的状态
- 父子协调:相关组件之间的协调(使用弱引用)
- 异步状态:管理从异步操作改变的状态
- 观察:对其他实体的变化作出反应
参考文档
完整API文档
- Entity API:参见 api-reference.md
- 实体类型、方法、生命周期
- 上下文方法、异步操作
- 错误处理、类型转换
实现指南
-
模式:参见 patterns.md
- 模型-视图分离、状态管理
- 跨实体通信、异步操作
- 观察者模式、事件订阅
- 模式选择指南
-
最佳实践:参见 best-practices.md
- 避免常见陷阱、内存泄漏
- 性能优化、批量更新
- 生命周期管理、清理
- 异步最佳实践、测试
-
高级模式:参见 advanced.md
- 实体集合、注册表模式
- 防抖/节流更新、状态机
- 实体快照、事务、池