@state 变量更改后视图不更新

Posted

技术标签:

【中文标题】@state 变量更改后视图不更新【英文标题】:View not updating after @state variable changes 【发布时间】:2019-09-19 14:08:13 【问题描述】:
    struct Flashcard : View 
      @State var frontText = newArray[randomNum].kana
      @State var backText = newArray[randomNum].romaji

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

public struct Frontside: View

    @State public var kanatext: String = ""

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

在我上面的代码 sn-p 中,当我更新 @State var frontText 时,我希望我的视图能够刷新并显示 frontText。但是由于某种原因,它在我的 Frontside 结构中使用时不会显示新的 frontText。如果我只是在我的视图中打印 Text(frontText) ,它总是会随着变量的变化而刷新。每当 frontText 更新时,我错过了什么才能正确刷新?谢谢。

【问题讨论】:

【参考方案1】:

您必须将kanatext 声明为@Binding

@Binding public var kanatext: String

然后将绑定传递给您的状态,该状态由初始化程序中的父视图拥有:

Frontside(kanatext: $frontText)

基本上,当您在视图@State 中声明变量时 - 您表明该视图拥有它,并且它的绘制方式取决于它。当您希望此状态影响另一个视图时,您需要将其作为绑定($)传递。 IF 两者都引用相同的变量,因为 @State 每个都有自己的独立副本,因为它们都是值类型。

【讨论】:

以上是关于@state 变量更改后视图不更新的主要内容,如果未能解决你的问题,请参考以下文章

通过更改 SwiftUI 中的 @State 变量来刷新视图不起作用

使用 @State 变量不适用于从子视图更改 Body 中的视图状态

防止 updateUIView 在 @State var 更改时更新视图

基于 VIewModel 状态更新 SwiftUI 视图?

Angular2:变量更改时视图不更新

当从 GeometryReader 中进行更改时,SwiftUI 不会反映对 @Binding @State 变量的更改