SwiftUI NavigationLink зависает, когда представление содержит значение среды `dismiss`IOS

Программируем под IOS
Ответить
Anonymous
 SwiftUI NavigationLink зависает, когда представление содержит значение среды `dismiss`

Сообщение Anonymous »

При нажатии на NavigationLink в NavigationStack мое приложение зависает и его невозможно восстановить:

Код: Выделить всё

import SwiftUI

@main
struct State_BugApp: App {
var body: some Scene {
WindowGroup {
NavigationSplitView {
List {
Section {
Text("Home")
}
}.listStyle(.insetGrouped)
} detail: {
NavigationStack {
MainView()
}
}
}
}
}

struct MainView: View {
@Environment(\.dismiss) private var dismiss
@State var action: String = "Open child"

var body: some View {
List {
NavigationLink {
listDestination()
} label: {
Text(action)
}
}
}

@ViewBuilder func listDestination() -> some View {
ChildView(action: { value in foo() })
}

func foo() {
self.action = "Updated action"
}
}

struct ChildView: View {
@StateObject var viewModel: ChildViewModel = ChildViewModel()
var action: (String) -> Void

init(action: @escaping (String) -> Void) {
self.action = action
}

var body: some View {
List {
Text("Text")
}
}
}

class ChildViewModel: ObservableObject {
var title: String = "Child"
}
Если вы удалите @Environment(\.dismiss), это сработает, однако тогда я вообще не смогу закрыть свое представление….
Проблема связана с тем, что значение отклонения не является равным и поэтому вызывает цикл, поскольку представление бесконечно перерисовывается при нажатии на ссылку NavigationLink. Это описано здесь https://hachyderm.io/@teissler/112533860374716961 и здесь https://forums.developer.apple.com/foru ... oblem%20if, для%20построения%20%20представленного%20представления. но я не могу понять, как можно решить проблему использования отклонения.

Подробнее здесь: https://stackoverflow.com/questions/787 ... ment-value
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»