从Widget访问@Environment时获取值异常问题
问题原因与解决方案
核心原因
你在Widget结构体层级读取@Environment(\.supportedActivityFamilies)是错误的时机——Widget结构体的作用是定义Widget配置,而非承载实际的动态视图渲染逻辑。这个层级的环境变量是初始化阶段的静态值,不会根据Live Activity在Smart Stack中实际显示的尺寸(small/medium)更新,所以始终返回默认的[medium]。
正确的实现方式
需要将环境变量的读取逻辑放在实际渲染的视图内部,也就是ActivityConfiguration的content闭包中(或者针对不同尺寸的视图分支里)。
示例代码如下:
struct MyLiveActivity: Widget { var body: some WidgetConfiguration { ActivityConfiguration(for: MyActivityAttributes.self) { context in // 在这里的视图中读取环境变量 LiveActivityContentView() } dynamicIsland: { context in // Dynamic Island相关视图(如果需要) DynamicIsland { // ... } compactLeading: { // ... } compactTrailing: { // ... } minimal: { // ... } } .supportedFamilies([.activityCompact, .activityMedium]) // 明确声明支持的尺寸 } } struct LiveActivityContentView: View { @Environment(\.supportedActivityFamilies) private var supportedFamilies var body: some View { // 此处可获取到正确的[.activityCompact, .activityMedium]集合 Text("Supported families: \(supportedFamilies.map { $0.rawValue })") } }
额外优化建议
如果需要针对不同尺寸做视图适配,更推荐直接通过context.displaySize判断,比读取环境变量更直观:
ActivityConfiguration(for: MyActivityAttributes.self) { context in if context.displaySize == .compact { SmallLiveActivityView() } else { MediumLiveActivityView() } } // ...
内容的提问来源于stack exchange,提问作者Meyssam
相关产品推荐
相关产品推荐

