SwiftUI:ObservableObject在重绘时不会保持其状态

问题描述 投票:2回答:1

问题

为了获得App代码的清晰外观,我为每个包含逻辑的View创建ViewModel。

普通的ViewModel看起来像这样:

class SomeViewModel: ObservableObject {

    @Published var state = 1

    // Logic and calls of Business Logic goes here
}

并且使用方式如下:

struct SomeView: View {

    @ObservedObject var viewModel = SomeViewModel()

    var body: some View {
        // Code to read and write the State goes here
    }
}

当未更新Views Parent时,此方法很好。如果父级的状态更改,则此视图将重绘(在声明性框架中非常正常)。 但是也将重新创建ViewModel,并且此后不保存State。与其他框架(例如Flutter)进行比较时,这是不寻常的。

我认为ViewModel应该保留,或者State应该保留。

如果我将ViewModel用@State属性替换并直接使用int(在此示例中),它将保持不变,并且不会重新创建

struct SomeView: View {

    @State var state = 1

    var body: some View {
        // Code to read and write the State goes here
    }
}

这显然不适用于更复杂的国家。如果我为@State设置了一个类(例如ViewModel),那么越来越多的东西将无法正常工作。

问题

  • 是否有一种不每次都重新创建ViewModel的方法?
  • 是否有一种方法可以复制@State@ObservedObject Propertywrapper?
  • 为什么@State保留重绘状态?

我知道通常在内部View中创建ViewModel是不好的做法,但是可以通过使用NavigationLink或Sheet复制此行为。有时候,当您想到一个非常复杂的TableView时,将State保留在ParentsViewModel中并使用绑定是没有用的,其中Cells本身包含很多逻辑。对于个别情况总有一种解决方法,但是我认为如果不重新创建ViewModel会更容易。

重复问题

我知道有很多关于这个问题的问题,都在谈论非常特定的用例。在这里,我想谈谈一般性问题,而不必深入研究自定义解决方案。

问题为了获得App代码的清晰外观,我为每个包含逻辑的View创建ViewModel。普通的ViewModel看起来像这样:class SomeViewModel:...

swift swiftui declarative property-wrapper
1个回答
0
投票

是否有一种不每次都重新创建ViewModel的方法?

© www.soinside.com 2019 - 2024. All rights reserved.