
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
@ObservedObjectcho 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
@ObservedObjectkhi 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
@StateObjectcho các đối tượng mà view sở hữu và cần theo dõi sự thay đổi. - Tránh sử dụng
@StateObjectkhi đố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ó.







-
Tagged flutter, mobile-dev, react-native