ObservedObject,EnvironmentObject Và StateObject Trong Swift. Tất Tần Tật Về Cách Sử Dụng!

@ObservedObject

Khái Niệm

@ObservedObject là một property wrapper trong SwiftUI được sử dụng để theo dõi các đối tượng được đánh dấu là ObservableObject. Khi một thuộc tính bên trong đối tượng được đánh dấu là @Published thay đổi, SwiftUI tự động cập nhật giao diện người dùng.

Khi nào sử dụng

Sử dụng @ObservedObject khi bạn muốn tạo một view có khả năng phản ứng với các thay đổi từ một đối tượng mà không sở hữu đối tượng đó. Điều này thường xảy ra khi bạn truyền một đối tượng từ một view cha sang một view con.

Cách sử dụng hiệu quả

  • Không sử dụng @ObservedObject cho các đối tượng mà view sở hữu trực tiếp và chịu trách nhiệm khởi tạo.
  • Sử dụng @ObservedObject khi bạn muốn chia sẻ một nguồn sự thật giữa nhiều view.

Ví dụ

import SwiftUI
import Combine
// Một class tuân theo ObservableObject
class UserData: ObservableObject {
@Published var username = "Binh"
}
struct ContentView: View {
@ObservedObject var userData = UserData()
var body: some View {
Text("Username: \(userData.username)")
}
}

@StateObject

Khái Niệm

@StateObject cũng là một property wrapper được sử dụng cho các đối tượng ObservableObject, nhưng được sử dụng khi view đó chịu trách nhiệm khởi tạo đối tượng. SwiftUI sẽ tự động theo dõi và cập nhật view khi có bất kỳ thay đổi nào từ đối tượng.

Khi nào sử dụng

Sử dụng @StateObject khi bạn muốn view của bạn sở hữu và khởi tạo một đối tượng ObservableObject. Điều này đảm bảo rằng đối tượng chỉ được tạo một lần và duy trì qua các lần tái tạo view.

Cách sử dụng hiệu quả

  • Sử dụng @StateObject cho các đối tượng mà view sở hữu và cần theo dõi sự thay đổi.
  • Tránh sử dụng @StateObject khi đối tượng được truyền từ bên ngoài, thay vào đó sử dụng @ObservedObject.

Ví dụ

import SwiftUI
// Sử dụng giống như ví dụ @ObservedObject, nhưng thay @ObservedObject bằng @StateObject
struct ContentView: View {
@StateObject var userData = UserData()
var body: some View {
Text("Username: \(userData.username)")
}
}

Sự Giống và Khác Biệt giữa @ObservedObject và @StateObject

Giống Nhau

Cả hai đều được sử dụng để theo dõi sự thay đổi trong các đối tượng ObservableObject và cập nhật UI một cách tự động khi có sự thay đổi.

Khác Biệt

  • @StateObject nên được sử dụng khi view đó chịu trách nhiệm khởi tạo đối tượng. SwiftUI sẽ quản lý vòng đời của đối tượng và đảm bảo rằng nó không bị tái tạo lại mỗi lần view được tải lại.
  • @ObservedObject được sử dụng khi đối tượng được truyền từ một view khác hoặc khi view không chịu trách nhiệm khởi tạo đối tượng. Điều này có

EnvironmentObject

Trong Swift, EnvironmentObjectlà một trong các phần của SwiftUI. Nó là một cách để chia sẻ dữ liệu giữa nhiều view trong một ứng dụng SwiftUI. Khi một đối tượng được đánh dấu là EnvironmentObject, SwiftUI sẽ tự động chuyển nó xuống qua các view con mà không cần phải truyền nó qua các tham số hàm. Điều này giúp giảm sự phức tạp của mã và làm cho việc quản lý dữ liệu trở nên dễ dàng hơn.

Ví dụ, bạn có thể sử dụng EnvironmentObjectđể chia sẻ một đối tượng dữ liệu như một đối tượng xử lý dữ liệu, cài đặt ngôn ngữ hoặc cài đặt giao diện người dùng trong toàn bộ ứng dụng của mình mà không cần phải truyền chúng qua các tham số hàm.

Dưới đây là một ví dụ về cách sử dụng EnvironmentObject:

import SwiftUI
// Define a class to hold your data
class MyData: ObservableObject {
@Published var value: String = "Hello, World!"
}
// Define your first view
struct ContentView: View {
// Declare an @EnvironmentObject variable to hold the shared data
@EnvironmentObject var data: MyData
var body: some View {
VStack {
Text(data.value) // Display the shared data
SubView() // Embed another view
}
}
}
// Define another view
struct SubView: View {
// Declare an @EnvironmentObject variable to hold the shared data
@EnvironmentObject var data: MyData
var body: some View {
TextField("Enter new value", text: $data.value) // Modify the shared data
.padding()
}
}
// Define the entry point of your app
@main
struct MyApp: App {
// Create an instance of your data class
let myData = MyData()
var body: some Scene {
WindowGroup {
// Pass the instance to the environment
ContentView().environmentObject(myData)
}
}
}

Trong ví dụ trên, MyDatalà một class chứa dữ liệu cần chia sẻ. ContentViewvà SubViewđều sử dụng @EnvironmentObject để truy cập đối tượng MyDatamà không cần truyền nó qua các tham số hàm. Trong MyApp, chúng ta sử dụng .environmentObject(myData) để đưa myDatavào môi trường của ứng dụng, để những view trong ứng dụng có thể truy cập và sử dụng nó.

Author

trantiendatbk@gmail.com
Nếu bạn thấy bài viết này hữu ích, xin ĐỪNG donate cho mình. Thay vào đó, hãy quyên góp, ủng hộ cho các quỹ từ thiện. Như một lời cảm ơn từ mình, bạn sẽ nhận được một KHOÁ HỌC về bất kỳ chủ đề nào mà bạn thích. Hãy CLICK vào link này https://phaken.com/2024/07/22/thong-tin-cac-quy-tu-thien/

Để lại một bình luận