@State 和 @StateObject 有什么区别

2023-11-29

我创建了一个这样的模型

import Foundation

class Play:ObservableObject{
    @Published var name:String="Tayle"
    @Published var age:Int=12
}

它将在两个视图中使用

例如:

struct Demo: View {
    //1
    @State private var play:Play = Play()
    //2
    //@StateObject private var play:Play = Play()
    var body: some View {
        NavigationView{
            NavigationLink(destination: PlayNameView(play: play)){
                Text("go to platnbame")
            }
        }
    }
}

struct PlayNameView:View{
    @ObservedObject var play:Play
    var body: some View{
        HStack{
            Text("Hello,\(play.name)")
            Button(action:{
                play.name="iop"
            }){
                Text("change the name to:iop")
            }
            
        }
    }
}

当我运行该项目时,他们有相同的行为。如果@StateObject可以做到,为什么还要选择@State


@State是一个变量,用于保存值类型,例如布尔值、整数、字符串、结构体等。苹果根本不打算@State用于引用类型,例如ObservableObjects,因为 State 再次意味着存储 Int 等值类型,而不是类的实例。苹果在文档中表示,

不要将状态属性用于持久存储,因为状态变量的生命周期反映了视图生命周期。相反,使用它们来管理仅影响用户界面的瞬态,例如按钮的突出显示状态、过滤器设置或当前选定的列表项。

简而言之,你可以使用@State例如,用于存储用户单击按钮的次数(自应用程序启动以来)的变量,但不存储另一个按钮ObservableObject。另外,如果你看一下this,文章表明使用带有状态的对象不会导致视图的实际变量更新。这是因为,再次引用这篇文章,

因为我们使用的是复杂的引用类型,所以状态本身的值永远不会改变。虽然 state 的属性 num 已更改,但 @State 属性包装器不知道,因为它只监视变量状态,而不监视其任何属性。对于 SwiftUI 来说,因为它只是观察状态,所以它不知道 num 已经改变,所以永远不会重新渲染视图。

An @StateObject另一方面,可以存储诸如ObservableObjects。当Object的值发生变化时,会引起视图更新,因为这一切都是由SwiftUI。这只会发生在@Published但是,属性以及这些属性的任何更改都将再次导致视图重新渲染。还有一个重要的注意事项:@StateObject每次视图出现时都会创建一个新实例。如果需要保留这些值,则需要从更根的视图传入对象。另外,一个@StateObject可以从视图外部更改,而@State变量只能是私有的和局部的。有关其原因的更多信息,请参阅 AppleState文档:https://developer.apple.com/documentation/swiftui/state

资源:

  1. https://story.tomasen.org/swiftui-difference-of-state-binding-environment-and-environmentobject-and-when-to-use-them-ff80699f45b7
  2. https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-stateobject-property-wrapper
  3. https://www.hackingwithswift.com/quick-start/swiftui/whats-the-difference- Between-observedobject-state-and-environmentobject
  4. https://levelup.gitconnected.com/state-vs-stateobject-vs-observedobject-vs-environmentobject-in-swiftui-81e2913d63f9#:~:text=Use%20%40%20State%20for%20very%20simple,比%20what%20%40State%20can%20handle.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@State 和 @StateObject 有什么区别 的相关文章

随机推荐

  • 模拟java开发的高CPU负载

    我正在开发一个 Java 应用程序 想看看它如何在较慢 超载的机器上运行 我怀疑可能存在一些线程不安全问题等被忽略 因为我的机器编译得足够快 有没有办法模拟 Java 应用程序的高 CPU 负载 限制可用 CPU 当然 我可以编写一个脚本来
  • C 全局匿名结构/联合

    我有一个 uint64 变量 通常只需要高位或低位 32 位访问 我正在使用 32 位 ARM Cortex M0 为了提高速度 我尝试将 uint64 变量与 C 中的两个 uint32 变量重叠 使用匿名结构 希望避免指针运算来访问成员
  • 如何调整 bash 函数以便省略双引号?

    一整天 我经常输入这样的内容 git stash push u m some phrase as a message 我更愿意输入 stpu some phrase as a message 所以在来自的帮助下这个答案 我在我的中创建了一个
  • 我应该在哪里放置数据库连接字符串以及如何处理连接池?

    我正在开发一个托管在 IIS 服务器上的 asp net 应用程序 要打开连接 我使用 SqlConnection con new SqlConnection Server INLD50045747A SQLEXPRESS Database
  • 加密货币、哈希值和密码问题,完全是菜鸟吗?

    我读过几篇关于这个主题的 stackoverflow 文章 特别是这个 PHP 密码的安全哈希和盐 但我还有一些问题 我需要一些澄清 请告诉我以下陈述是否属实并解释您的评论 如果有人可以访问您的数据库 数据 那么他们仍然需要弄清楚您的哈希算
  • 在 Ubuntu 上找不到 Tkinter 模块

    Python 2 7 1 r271 86832 Apr 11 2011 18 05 24 GCC 4 5 2 on linux2 Type help copyright credits or license for more informa
  • 加载自定义 True Type 字体

    在 Mac Firemonkey 应用程序 Delphi XE7 中 如何加载自定义 TrueType 字体 对于 Windows 我的应用程序安装程序将我的字体添加到 Windows 本身 我已经使用 FPC Lazarus 完成了此操作
  • 如何在搜索时添加加载图标? (Vue.js 2)

    我的组件是这样的
  • 内存对齐的目的

    不可否认 我不明白 假设您有一个内存 其内存字长度为 1 字节 为什么不能在未对齐地址 即不能被 4 整除 上的单次内存访问中访问 4 字节长的变量 就像对齐地址的情况一样 现代处理器上的内存子系统仅限于以其字大小的粒度和对齐方式访问内存
  • 强制 UITableView 滚动到顶部?

    如果 tableview 包含的单元格少于 10 个左右 您将如何强制 UITableViewCell 滚动到顶部 当 tableview 处于编辑模式时 我支持在 tableView 单元格中编辑托管对象上下文 不用说 如果单元格位于表格
  • 使用 for 循环迭代数据集 TF 2.0

    这个问题是关于如何迭代 TF 数据集 因为make initializable iterator 已弃用 我使用以下函数读取数据集 def read dataset new filename target delay ds tf data
  • 为什么 toPrecision 返回一个字符串?

    查看这段代码 function testprecision var isNotNumber parseFloat 1 3 toPrecision 6 alert typeof isNotNumber gt string 我本来预计会有一个数
  • spring集成sftp主机:写入文件失败;嵌套异常为 3:权限被拒绝

    我正在尝试使用 Spring 集成 sftp outbound gateway 将 sftp 文件发送到大型机 这是配置
  • 页面对象模式和替代方案

    当您自动化 Web UI 测试时 您希望组织您的测试 以便它们可维护并尽可能减少代码重复 要去的路上是页面对象模式 您在现实世界的项目中尝试过吗 还有其他选择吗 如何对复杂的网站进行建模 很少的嵌套母版页 弹出窗口 具有疯狂验证的大型表单
  • 如何在flutter中实现下拉列表?

    我有一个位置列表 我想在 Flutter 中将其实现为下拉列表 我对这门语言很陌生 这就是我所做的 new DropdownButton value selectedLocation onChanged String newValue se
  • 解决方案 - 实体类型 ApplicationUser 不是当前上下文模型的一部分

    我将这个问题作为文档发布 因为我花了很多时间才找到这个简单的问题 我正在使用 VS15 生成的原始 MVC 项目并尝试对其进行修改 错误 InvalidOperationException 实体类型 ApplicationUser 不是当前
  • MSDOS“你好世界”EXE

    我想编译一个 Hello World MS DOS exe 不是在 XP 16 位模式或 Windows 操作系统之上的 MS DOS 模式下运行的程序 我可以在我的 MS DOS 机器上运行的 HELOWRLD EXE I think D
  • 如何在 SQLite 中获取行号?

    我读过很多关于如何在 SQLite 中使用行号的文章 但没有一篇文章给了我我需要的答案 我知道如何使用此查询选择行号 SELECT SELECT COUNT FROM table WHERE title lt t title OR titl
  • 只能选择一个复选框

    我想一次只选择一个复选框 我的程序从文本文件中读取并根据文本文件中有多少个 答案 创建复选框 有谁知道代码有什么问题吗 public partial class Form1 Form string temp questions txt pu
  • @State 和 @StateObject 有什么区别

    我创建了一个这样的模型 import Foundation class Play ObservableObject Published var name String Tayle Published var age Int 12 它将在两个