Verständnis der Abhängigkeitsinjektion in Swiftui, um eine doppelte Instanz -Erholung im Blickwinkeln zu vermeidenIOS

Programmierung für iOS
Anonymous
 Verständnis der Abhängigkeitsinjektion in Swiftui, um eine doppelte Instanz -Erholung im Blickwinkeln zu vermeiden

Post by Anonymous »

Ich denke, ich habe ein allgemeines Missverständnis darüber, wie man mit Abhängigkeiten in Swiftui arbeitet, wenn man häufige Ansichtsrückfahrzeuge in Betracht zieht, nicht nur im Sichtkörper, sondern auch in Navigationsmethoden.

Code: Select all

.navigationDestination(item: self.$viewModel.selectedUserId) { selectedUserId in
ProfileView(viewModel: ProfileViewModel(userId: selectedUserId))
}
Aber die .navigationDestination -Methode löst hier mehrmals (dreimal um genau) aus, wodurch doppelte Abhängigkeiten erstellt werden. Der Init (ViewModel: ProfileViewModel) {self._viewModel = StateObject (WrapedValue: ViewModel)} Muster hilft nicht, da wir jedes Mal eine neue Ansichtsinstanz erstellen. Und mein Verständnis ist es nach Entwurf, obwohl andere Navigationsmethoden und ältere API nur einmal auslösen könnten, sollten Sie nicht wirklich auf sie zählen, da es ein Teil des internen Verhaltens von Swiftui ist. Ich weiß, dass es viele Lösungen für dieses spezifische Problem gibt. Ich habe unterschiedliche Arbeiten gemacht, indem ich mich auf andere Navigationsmethoden beziehe, die nur einmal ausgelöst, alle Arten von booleschen Überprüfungen und Abhängigkeiten, Umwelteinspritzungen, Fabrik-/Montagemuster usw., das allgemeine Prinzip der Arbeit mit Abhängigkeiten in Swiftui, die alles gereinigt und getrennt haben, versäumt haben. Soll View alle Kinder- und Navigationsansichten speichern? Oder nur ihre Abhängigkeiten?

Code: Select all

import SwiftUI

struct User: Identifiable, Hashable {
let id: String
let name: String
}

class UsersListViewModel: ObservableObject {
@Published var selectedUserId: String?

let users = [
User(id: "1", name: "John"),
User(id: "2", name: "Jane"),
User(id: "3", name: "Bob")
]
}

class ProfileViewModel: ObservableObject {
@Published var userId: String

deinit {
print("❌ \(String(describing: type(of: self))) destroyed")
}

init(userId: String) {
print("✅ \(String(describing: type(of: self))) created")

self.userId = userId
}
}

struct ContentView: View {
@StateObject private var viewModel = UsersListViewModel()

var body: some View {
NavigationStack {
List(viewModel.users) { user in
Button(action: {
viewModel.selectedUserId = user.id
}) {
HStack {
Image(systemName: "person.circle")
.foregroundColor(.blue)
Text(user.name)
.foregroundColor(.primary)
Spacer()
Image(systemName: "chevron.right")
.foregroundColor(.gray)
.font(.caption)
}
}
}
.navigationDestination(item: self.$viewModel.selectedUserId) { selectedUserId in
let _ = print("➡️ .navigationDestination trigger")
ProfileView(viewModel: ProfileViewModel(userId: selectedUserId))
}
}
}
}

struct ProfileView: View {
@StateObject private var viewModel: ProfileViewModel

init(viewModel: ProfileViewModel) {
self._viewModel = StateObject(wrappedValue: viewModel)
}

var body: some View {
Text("Profile: \(viewModel.userId)")
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post