@state 变量更改后视图不更新
View not updating after @state variable changes
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)
}
}
在我上面的代码片段中,当我更新@State var frontText 时,我希望我的视图能够刷新并显示 frontText。但出于某种原因,当它在我的 Frontside 结构中使用时,它不会显示新的 frontText。如果我只是在我的视图中打印 Text(frontText),它将始终随着变量的变化而刷新。每当 frontText 更新时,我缺少什么才能正确刷新?谢谢。
您必须将 kanatext
声明为 @Binding
:
@Binding public var kanatext: String
然后将绑定传递给您的状态,该状态由初始化程序中的父视图拥有:
Frontside(kanatext: $frontText)
基本上,当您在视图中声明一个变量时 @State - 您表明该视图拥有它并且它的绘制方式取决于它。当您希望此状态影响另一个视图时,您需要将其作为绑定($)传递。 IF 都引用与@State 相同的变量,每个变量都有自己独立的副本,因为它们都是值类型。
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)
}
}
在我上面的代码片段中,当我更新@State var frontText 时,我希望我的视图能够刷新并显示 frontText。但出于某种原因,当它在我的 Frontside 结构中使用时,它不会显示新的 frontText。如果我只是在我的视图中打印 Text(frontText),它将始终随着变量的变化而刷新。每当 frontText 更新时,我缺少什么才能正确刷新?谢谢。
您必须将 kanatext
声明为 @Binding
:
@Binding public var kanatext: String
然后将绑定传递给您的状态,该状态由初始化程序中的父视图拥有:
Frontside(kanatext: $frontText)
基本上,当您在视图中声明一个变量时 @State - 您表明该视图拥有它并且它的绘制方式取决于它。当您希望此状态影响另一个视图时,您需要将其作为绑定($)传递。 IF 都引用与@State 相同的变量,每个变量都有自己独立的副本,因为它们都是值类型。