gpt4 book ai didi

ios - SwiftUI 无法绑定(bind)注入(inject)的值

转载 作者:行者123 更新时间:2023-12-01 21:46:08 24 4
gpt4 key购买 nike

我找到了this demo project这显示了如何在 swiftU 中使用 clean swift,所以我尝试自己做这样的事情。我在使用 Core Data 时遇到了问题。作为干净的 swift 架构,只有一个源(在我的例子中是 appState)可以将数据传递给查看。所以我创建了注入(inject)容器,它有 互动者应用状态 .
容器:

struct DIContainer: EnvironmentKey {

@ObservedObject var appState: AppState
let interactors: Interactors

init(appState: AppState, interactors: Interactors) {
self.appState = appState
self.interactors = interactors
}
class AppState: ObservableObject, Equatable {
var userData = UserData()
}

extension AppState {
class UserData: ObservableObject, Equatable {
@Published var places:[Place] = []
}

我注入(inject)这样的环境:
@Environment(\.injected) private var injected: DIContainer

最后查看使用它的 View :
var body: some View {
NavigationView {
ZStack {
List {
ForEach(injected.$appState.userData.places.wrappedValue){ place in
PlaceRow(place: place)
}
....

问题是即使数组被加载, View 也不会对此使用react。只有当我导航到其他 View 时它才会刷新。此外,当我向数组中删除或添加新元素时, View 没有任何变化。
如果您能给我一些想法,那就太好了。
我用谷歌搜索了 4 天,我发现的一切都不适合我。

最佳答案

如果您正在注入(inject) DIContainer进入您的View像这样:

@Environment(\.injected) private var injected: DIContainer

请记住,您的 View DIContainer 时不会刷新属性会改变。您必须手动观察它们。

您可以尝试以下解决方案之一:

1) 订阅 AppState .onReceive 中的属性更改:
@Environment(\.injected) private var injected: DIContainer

var body: some View {
NavigationView { ... }
.onReceive(injected.appState.userData.$places) { places in
// do something with places,
// eg. assign to a @State variable to be used in a `ForEach` loop...
}
}

2) 注入(inject) UserData直接作为 @EnvironmentObject :
@EnvironmentObject var userData: UserData

ContentView().environmentObject(container.appState.userData)

作为 UserDataObservableObject任何时候它都会改变 @Published属性(例如 places )被修改。

3) 订阅 AppState/ UserDataViewModel并观察唯一的 ViewModel在您的 View .

更详细的解释可见 this您在问题中链接的同一演示项目的版本。

关于ios - SwiftUI 无法绑定(bind)注入(inject)的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62182199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com