首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI不能绑定注入值

SwiftUI不能绑定注入值
EN

Stack Overflow用户
提问于 2020-06-03 20:28:48
回答 1查看 176关注 0票数 1

我找到了这个演示项目,它展示了如何在swiftU中使用干净、快捷,所以我尝试自己做这样的事情。我在使用Core数据时遇到了问题。作为干净、快捷的体系结构,只有一个源(在我的例子中是appState)可以将数据传递给视图。所以我创建了注入容器,它有interactorappState。集装箱:

代码语言:javascript
复制
struct DIContainer: EnvironmentKey {

    @ObservedObject var appState: AppState
    let interactors: Interactors

    init(appState: AppState, interactors: Interactors) {
        self.appState = appState
        self.interactors = interactors
    }
代码语言:javascript
复制
class AppState: ObservableObject, Equatable {
    var userData = UserData()
}

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

我注射了这样的环境:

代码语言:javascript
复制
@Environment(\.injected) private var injected: DIContainer

最后查看使用它的情况:

代码语言:javascript
复制
var body: some View {
        NavigationView {
            ZStack {
                List {
                    ForEach(injected.$appState.userData.places.wrappedValue){ place in
                        PlaceRow(place: place)
                    }
....

问题是,即使数组是loade,视图也不会对此做出反应。只有当我导航到其他视图时,它才会刷新。另外,当我删除或添加数组中的新元素时,视图没有任何更改。如果你能给我一些想法,那就太好了。我在谷歌上搜索了4天,发现的一切都不适合我。

EN

回答 1

Stack Overflow用户

发布于 2020-06-06 12:51:40

如果您要像这样将DIContainer注入您的View中:

代码语言:javascript
复制
@Environment(\.injected) private var injected: DIContainer

请记住,当View属性更改时,DIContainer不会刷新。你必须手动观察它们。

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

1)订阅AppState属性在.onReceive中的更改

代码语言:javascript
复制
@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)UserData直接注入为@EnvironmentObject

代码语言:javascript
复制
@EnvironmentObject var userData: UserData

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

因为UserData是一个ObservableObject,所以每当它的@Published属性发生变化时(例如。对places)进行了改性。

3)订阅ViewModel中的AppState/UserData,并观察View中唯一的ViewModel

更详细的解释可以在您在问题中链接的同一个演示项目的版本中找到。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62182199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档