SwiftUI和Redux:当某些数据在视图作用域之外发生更改时,如何在视图上执行操作?

vfhzx4xs  于 2023-06-06  发布在  Swift
关注(0)|答案(1)|浏览(147)

我正在使用SwiftUI和Redux,我想在显示的视图更新时添加一点动画,即应用程序以加载视图开始,然后在用我的API加载数据后,它被主视图替换,在这个替换过程中,我想动画显示一个黑色视图的出现和消失。
如果我可以在局部作用域上简单地做,我会这样做:

struct AppView: View {
    @State private var loaded = false
    @State private var isSwitchingView = false
    
    var body: some View {
        ZStack {
            if loaded {
                MainView()
            } else {
                LoadingView()
            }
            Color.black
                .opacity(isSwitchingView ? 1 : 0)
            }                
        }
        .edgesIgnoringSafeArea(.all)
        .onAppear {
            Task {
                // load() is an async function returning true if data is loaded correctly
                let loadedResult = await load()
                if loadedResult != loaded {
                    updateView(loadedResult: loadedResult)
                }
            }
        }
    }
    
    func updateView(loadedResult: Bool) {
        withAnimation(
            .linear(duration: 0.25)
        ) {
            isSwitchingView = true
        }
        delay(0.25) {
            loaded = loadedResult
            withAnimation(
                .linear(duration: 0.25)
            ) {
                isSwitchingView = false
            }
        }
    }
}

我遇到的问题是,由于我使用的是redux,所以我在AppView之外加载数据并更新预期的显示视图。
这是我的AppView在redux下的实际外观:

struct AppView: View {
    @EnvironmentObject var store: Store<AppState>
    
    var body: some View {
        ZStack {
            switch store.state.currentView {
            case .loading:
                AppLoadingView()
            case .main:
                MainView()
            }
            // how to animate this Color.black in that situation (when store.state.currentView changes)?
            Color.black
        }
        .edgesIgnoringSafeArea(.all)
    }
}

谢谢你的帮助!

c2e8gylq

c2e8gylq1#

最后通过使用.onChange(of: store.state.currentView)使其工作

相关问题