如何将.onChange()抽离为可复用视图以避免重复编写冗余代码
实现方案:封装SwiftUI ViewModifier
你可以通过自定义ViewModifier将这部分onChange逻辑完全抽离封装,既可以保留访问环境状态的能力,又能实现全局复用,无需重复编写逻辑:
步骤1:定义自定义Modifier
import SwiftUI struct WalletReloadModifier: ViewModifier { // 如需使用环境状态,直接在此处通过@Environment注入即可 @ObservedObject var walletVM: WalletDataStoreHandlerViewModel let user: User func body(content: Content) -> some View { content .onChange(of: walletVM.walletsReceivedNewValue) { newValue in guard !walletVM.reloadingWallets else { return } walletVM.reloadingWallets = true print("🟢 Reloading wallet....") Task { try await walletVM.getUserWallets(user: user) } } } }
步骤2:添加View扩展实现链式调用
extension View { func autoReloadWallets( viewModel: WalletDataStoreHandlerViewModel, user: User ) -> some View { modifier(WalletReloadModifier(walletVM: viewModel, user: user)) } }
调用方式
后续所有需要添加该逻辑的视图,只需要加一行修饰符即可:
// 你的原有视图代码 YourCustomView() .autoReloadWallets(viewModel: walletDataStoreHandlerViewModel, user: user)
优化说明
如果user参数已经注册为环境值,你可以直接在Modifier内通过@Environment(\.currentUser) private var user注入,不需要调用时手动传参,进一步简化调用代码。
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

