You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:42:07