Swift中调用MealView.refresh()无法更新列表数据的问题求助
问题根源
你调用MealView().refresh()时,是新建了一个完全独立的MealView实例,和当前屏幕上显示的实例没有任何关联。新实例的meals数据更新了,但界面上的旧实例完全不受影响,所以列表不会刷新。
解决方案
方案一:用ViewModel共享状态(推荐)
把数据和刷新逻辑抽成独立的ViewModel类,通过共享实例实现跨视图状态同步:
- 创建ViewModel类
class MealViewModel: ObservableObject { @Published var meals: [String] = [] func refresh() { sendGetRequest() } private func sendGetRequest() { meals = ["급식을 가져오고 있어요."] // 这里保留你的网络请求逻辑,请求完成后更新self.meals } }
- 修改MealView,用ViewModel管理数据
struct MealView: View { @ObservedObject var viewModel: MealViewModel var body: some View { NavigationView { VStack{ List(viewModel.meals, id: \.self) { meal in Text(meal) } .refreshable { viewModel.refresh() } } } } }
- 在App结构中共享ViewModel实例
@main struct mealtimeApp: App { @State private var selection = 1 @AppStorage("_isFirstLaunching") var isFirstLaunch: Bool = true @State private var settingsPresented = false @StateObject private var mealViewModel = MealViewModel() var body: some Scene { WindowGroup { MealView(viewModel: mealViewModel) .sheet(isPresented: $isFirstLaunch) { // 启动引导sheet内容 } .sheet(isPresented: $settingsPresented) { // 设置sheet内容 } .onDisappear { mealViewModel.refresh() print("dd") } } } }
方案二:用Binding传递刷新信号
如果不想用ViewModel,可以通过绑定变量触发刷新:
- 在App结构中添加刷新触发变量
@State private var shouldRefreshMeals = false
- 传递给MealView并监听变化
struct MealView: View { @State var meals: [String] = [] @Binding var shouldRefresh: Bool var body: some View { NavigationView { VStack{ List(meals, id: \.self) { meal in Text(meal) } .refreshable { sendGetRequest() } } } .onChange(of: shouldRefresh) { newValue in if newValue { sendGetRequest() shouldRefresh = false } } } // 保留原有的refresh和sendGetRequest方法 }
- 在sheet关闭时触发信号
.onDisappear { shouldRefreshMeals = true print("dd") }
内容的提问来源于stack exchange,提问作者moon7959
相关产品推荐
相关产品推荐

