You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@State变量更新后SwiftUI子视图未刷新问题咨询

问题分析与修复方案

这问题我之前也踩过坑!核心问题出在你子视图里用错了属性包装器——@State根本不是用来接收父视图传递过来的动态值的~

为什么子视图不更新?

@State的设计目的是让视图管理自己的内部可变状态,一旦初始化完成,它就会和父视图的传值“解绑”。当你把父视图的frontText传给子视图的@State var kanatext时,只有第一次初始化会生效;后续父视图更新frontText,子视图的kanatext因为是自己的内部状态,完全不会同步新值,自然就不会刷新了。

修复步骤

只需要把子视图里的@State改成普通的只读属性即可(因为你这里只是展示父传过来的值,不需要子视图修改它):

修改后的完整代码

struct Flashcard : View { 
    @State var frontText = newArray[randomNum].kana 
    @State var backText = newArray[randomNum].romaji 
    // 补充原代码中用到但未声明的状态变量
    @State var showResults = false

    var body: some View { 
        ZStack { 
            Frontside(kanatext: frontText) 
                .background(Color.yellow) 
                .rotation3DEffect(.degrees(showResults ? 180.0 : 0.0), axis: (x: 0.0, y: 1.0, z: 0.0)) 
                .zIndex(showResults ? 0 : 1) 
                .frame(width: 300, alignment: .center) 
                .cornerRadius(25) 
        } 
    } 
} 

public struct Frontside: View { 
    // 移除@State,改用普通的let属性接收父视图传值
    public let kanatext: String

    public var body: some View { 
        Text(kanatext) 
            .font(.title) 
            .fontWeight(.black) 
            .padding(32) 
    } 
}

额外说明

如果之后你需要子视图能修改这个值并同步回父视图,那就要用@Binding:

  1. 父视图保持@State var frontText
  2. 子视图声明为@Binding var kanatext: String
  3. 传值时用Frontside(kanatext: $frontText)

但就你当前的展示需求来说,用普通的let属性就完全足够啦。

内容的提问来源于stack exchange,提问作者alamodey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:58:10