Для моего виджета я хочу, чтобы пользователи могли выбирать цвет фона виджета по своему выбору, но я не могу заставить его работать.
Я пытаюсь сделать это с помощью ColorPicker
и @AppStorage
ColorPicker("Background Color", selection: Binding(get: {
bgColor
}, set: { newValue in
backgroundColor = self.updateColorInAppStorage(color: newValue)
bgColor = newValue
}))
.frame(width: 200, height: 50)
.font(.headline)
backgroundColor - это @AppStorage
переменная, которая содержит значения RGB.
В моем классе расширения Widget я использую эту переменную для установки цвета фона виджета в структуре @main:
@main
struct MyWidget: Widget {
@AppStorage("backgroundColor", store: UserDefaults(suiteName: "group.com.MyWidget")) var backgroundColor = ""
@State private var bgColor = Color(UIColor.systemBackground)
let kind: String = "Count"
var body: some WidgetConfiguration {
IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in
SubscriberCountEntryView(entry: entry)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(bgColor)
.onAppear {
if (backgroundColor != "") {
let rgbArray = backgroundColor.components(separatedBy: ",")
if let red = Double(rgbArray[0]), let green = Double(rgbArray[1]), let blue = Double(rgbArray[2]), let alpha = Double(rgbArray[3]) {
bgColor = Color(.sRGB, red: red, green: green, blue: blue, opacity: alpha)
}
}
}
}
.configurationDisplayName("Count")
.supportedFamilies([.systemSmall, .systemMedium])
}
}
Кажется, что это работает, только когда приложение впервые установлено на устройстве. После этого, сколько бы раз я ни выбирал цвет и не обновлял виджет, цвет фона не изменится. Если я удалю и снова установлю приложение, цвет изменится.
Есть идеи, как это сделать правильно?