Giuliopime
09/06/2023, 9:44 AMToggle
uses a boolean binding to manage it's state, and I can't use my object from the repository 'cause it's only a getter. So I need to create a separate state variable for the Toggle and somehow sync it with the repository. Anyone already found the more optimal way to do this, I just wanna avoid having invalid state due to state duplication.
Here is some of my code as a sample:
// Sample view model
@MainActor
class ZbViewModel: ObservableObject {
private let repository: ISettingsRepository
@Published var settings: ZbSettings = ZbSettings.Companion.shared.default_
init(repository: ISettingsRepository) {
self.repository = repository
Task {
do {
let sequence = repository.getSettingsFlow()
for try await settingsFromFlow in sequence {
self.settings = settingsFromFlow
}
} catch {
print("Failed getting settings from repository flow: \(error)")
}
}
}
func setEnabled(enabled: Bool) {
repository.setEnabled(enabled: enabled)
}
}
// This is a sample view
struct MenuBarWindow: View {
@StateObject private var viewModel = ZbViewModel(
repository: DefaultSettingsRepository()
)
@State private var enabled = false
init() {
enabled = viewModel.settings.enabled
}
var body: some View {
VStack(spacing: 8) {
Toggle(isOn: $enabled) {
Text("ZenBreak - \(enabled ? "enabled" : "disabled")")
.font(.title3)
.frame(maxWidth: .infinity, alignment: .leading)
}
.toggleStyle(.switch)
.keyboardShortcut(.defaultAction)
.onChange(of: enabled) { newValue in
viewModel.setEnabled(enabled: newValue)
}
// ...
As you can see the state for Toggle is duplicated and I don't know if this is the best way to do what I need, any help or tip is appreciated!Osman Saral
12/07/2023, 7:58 AMGiuliopime
12/07/2023, 11:28 AMOsman Saral
12/07/2023, 11:31 AM$
operatorGiuliopime
12/07/2023, 11:42 AMGiuliopime
12/07/2023, 12:35 PMprivate var skipping: Binding<Bool> { Binding(
get: {
viewModel.settings.breakSkip
},
set: { skip in
viewModel.setBreakSkip(skip: skip)
}
)}
Giuliopime
12/07/2023, 12:35 PMOsman Saral
12/07/2023, 12:36 PMGiuliopime
12/07/2023, 12:37 PMOsman Saral
12/07/2023, 12:37 PM