@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:
- 父视图保持
@State var frontText - 子视图声明为
@Binding var kanatext: String - 传值时用
Frontside(kanatext: $frontText)
但就你当前的展示需求来说,用普通的let属性就完全足够啦。
内容的提问来源于stack exchange,提问作者alamodey
相关产品推荐
相关产品推荐

