为什么@EnvironmentObject强制视图重新初始化?

xi溪

在此示例中,当我在屏幕上拖动时,为什么LabelViewRepresentable在每次“ updateUIView”调用之前都要重新初始化?如果我将计数器设为@State属性而不是@EnvironmentObject属性,则它只会初始化一次,就像我期望的那样。

import SwiftUI

class Counter: ObservableObject {
  @Published var count = 0
}

struct CounterView: View {
  @EnvironmentObject var counter: Counter

  var body: some View {
    LabelViewRepresentable(count: $counter.count)
      .gesture(DragGesture().onChanged({ _ in
        self.counter.count += 1
      }))
  }
}

struct LabelViewRepresentable: UIViewRepresentable {
  @Binding var count: Int
  private var view: UILabel

  init(count: Binding<Int>) {
    print("init")

    let label = UILabel()
    label.text = "0"
    self.view = label
    self._count = count
  }

  func makeUIView(context: UIViewRepresentableContext<LabelViewRepresentable>) -> UILabel {
    print("makeUIView")
    return view
  }

  func updateUIView(_ uiView: UILabel, context: UIViewRepresentableContext<LabelViewRepresentable>) {
    print("updateUIView")
    view.text = "\(count)"
  }
}
卢加加

当您查看有关EnvironmentObject的Apple文档时,您会发现:

一个动态视图属性,该属性使用一个由祖先视图提供的可绑定对象来使当前视图无效,只要可绑定对象发生更改。

这意味着,每次更改EnvironmentObject时,依赖于它的所有视图都会重新初始化和重绘。

它与State的工作原理略有不同,在Apple文档中描述如下:

给定类型的持久值,视图通过该值读取和监视该值。

当State更改时,视图将无法重新初始化,因为State值将被丢弃。受国家影响的部分将被重画。另一方面,具有State值作为绑定传入的视图的任何子级都将被重新初始化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Lambda重新初始化向量-为什么起作用?

来自分类Dev

为什么在更新模型时重新初始化Controller?

来自分类Dev

为什么在更新模型时重新初始化Controller?

来自分类Dev

为什么初始化指针时必须将数组强制转换为type []?

来自分类Dev

为什么Datareader无法初始化?

来自分类Dev

为什么要初始化JSONdecoder?

来自分类Dev

为什么无法初始化Datareader?

来自分类Dev

为什么不能重新分配已完全初始化的数组?

来自分类Dev

为什么要重新初始化多进程工作者?

来自分类Dev

与KnockoutJS结合使用时,为什么jQuery File Upload需要重新初始化?

来自分类Dev

为什么重新初始化变量后prevoius值仍然存在-PHP

来自分类Dev

为什么CALayer动画在加载视图之后而不是在初始化后才能工作?

来自分类Dev

为什么不在视图中初始化两个MPMoviePlayerController?

来自分类Dev

骨干视图为什么我不能在初始化中触发UI事件?

来自分类Dev

为什么我的基因剔除视图模型用不同的值初始化?

来自分类Dev

SwiftUI EnvironmentObject在视图初始化程序中不可用?

来自分类Dev

重新初始化主干视图后事件未触发

来自分类Dev

访问视图控制器,无需重新初始化

来自分类Dev

为什么零初始化不是c ++中未初始化变量的默认值?有编译器选项可以强制执行吗?

来自分类Dev

在视图中重新实例化@EnvironmentObject

来自分类Dev

重新初始化对象

来自分类Dev

JScrollPane重新初始化

来自分类Dev

重新初始化NSArray

来自分类Dev

JScrollPane重新初始化

来自分类Dev

重新初始化对象

来自分类Dev

重新初始化航点

来自分类Dev

为什么每次读取属性时都不会重新评估对象初始化器中的表达式?

来自分类Dev

为什么类数据成员不能通过直接初始化语法初始化?

来自分类Dev

数组不应由数组初始化程序静态初始化。为什么?

Related 相关文章

  1. 1

    Lambda重新初始化向量-为什么起作用?

  2. 2

    为什么在更新模型时重新初始化Controller?

  3. 3

    为什么在更新模型时重新初始化Controller?

  4. 4

    为什么初始化指针时必须将数组强制转换为type []?

  5. 5

    为什么Datareader无法初始化?

  6. 6

    为什么要初始化JSONdecoder?

  7. 7

    为什么无法初始化Datareader?

  8. 8

    为什么不能重新分配已完全初始化的数组?

  9. 9

    为什么要重新初始化多进程工作者?

  10. 10

    与KnockoutJS结合使用时,为什么jQuery File Upload需要重新初始化?

  11. 11

    为什么重新初始化变量后prevoius值仍然存在-PHP

  12. 12

    为什么CALayer动画在加载视图之后而不是在初始化后才能工作?

  13. 13

    为什么不在视图中初始化两个MPMoviePlayerController?

  14. 14

    骨干视图为什么我不能在初始化中触发UI事件?

  15. 15

    为什么我的基因剔除视图模型用不同的值初始化?

  16. 16

    SwiftUI EnvironmentObject在视图初始化程序中不可用?

  17. 17

    重新初始化主干视图后事件未触发

  18. 18

    访问视图控制器,无需重新初始化

  19. 19

    为什么零初始化不是c ++中未初始化变量的默认值?有编译器选项可以强制执行吗?

  20. 20

    在视图中重新实例化@EnvironmentObject

  21. 21

    重新初始化对象

  22. 22

    JScrollPane重新初始化

  23. 23

    重新初始化NSArray

  24. 24

    JScrollPane重新初始化

  25. 25

    重新初始化对象

  26. 26

    重新初始化航点

  27. 27

    为什么每次读取属性时都不会重新评估对象初始化器中的表达式?

  28. 28

    为什么类数据成员不能通过直接初始化语法初始化?

  29. 29

    数组不应由数组初始化程序静态初始化。为什么?

热门标签

归档