SwiftUI请求widgetFamily时始终返回.systemMedium是什么原因?
问题原因分析
你写的视图代码本身没有语法错误,固定返回.systemMedium通常是以下几种原因导致的:
- 使用场景不符合要求:
\.widgetFamily是Widget Extension专属的环境变量,仅在Widget的渲染上下文中会被系统注入正确值。如果你将MyView放到主App的普通视图层级中调用,系统没有对应环境值,会默认返回.systemMedium。 - 预览/调试时硬编码了固定值:如果是在Xcode预览中调试,没有给预览上下文指定正确的Widget尺寸,或者手动写死了
.environment(\.widgetFamily, .systemMedium),就会固定返回该值。正确的多尺寸预览写法参考如下:
import WidgetKit struct MyView_Previews: PreviewProvider { static var previews: some View { Group { MyView(entry: MyEntry()) .previewContext(WidgetPreviewContext(family: .systemSmall)) MyView(entry: MyEntry()) .previewContext(WidgetPreviewContext(family: .systemMedium)) MyView(entry: MyEntry()) .previewContext(WidgetPreviewContext(family: .systemLarge)) } } }
- Widget配置未声明支持的全尺寸:检查你的Widget主入口的配置,是否仅声明了
.systemMedium作为唯一支持的尺寸,需要手动添加所有你需要支持的尺寸:
@main struct MyWidget: Widget { let kind = "MyWidget" var body: some WidgetConfiguration { StaticConfiguration(kind: kind, provider: MyProvider()) { entry in MyView(entry: entry) } // 此处需要声明所有支持的尺寸 .supportedFamilies([.systemSmall, .systemMedium, .systemLarge, .systemExtraLarge]) } }
内容的提问来源于stack exchange,提问作者iOS Dev
相关产品推荐
相关产品推荐

