Увеличение переменной в функции вызывает ошибку при предварительном просмотре (swiftui)

У меня есть этот код, внутри которого я вызываю функцию makeView, которая возвращает View, а в функции makeView я увеличиваю переменную id и передаю ее в View, но когда я это делаю, она показывает эту ошибку

«Обновление предварительного просмотра из SongsList_Previews в SongBook.app (2935) заняло более 5 секунд».

И что удивительно, когда я закомментировал строку «self.id += 1», все работает. Я новичок в SwiftUI, так что простите меня, если я упустил некоторую информацию.

      struct SongsList: View {
    @State private var id: Int = 0
    var body: some View {
        
        VStack{
            NavigationView {
            List(songs) {
                song in NavigationLink(
                    destination: SongMainView(song: song)) {
                        makeView(song: song)
                    }
            }
        }
    }
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .leading)
        .background(Color.orange.opacity(0.2))
        .edgesIgnoringSafeArea(.all)
    }
    
    func makeView(song: Song) -> SongsIndexView {
        self.id += 1;
        return SongsIndexView(song: song, id: self.id)
    }
}

1 ответ

Решение

Переменная отмечена значком @State оболочка свойств.

      @State private var id: Int = 0

Каждый раз, когда это значение изменяется, SwiftUI пытается обновить представление.

      func makeView(song: Song) -> SongsIndexView {
    self.id += 1;
    return SongsIndexView(song: song, id: self.id)
}

Это вызывает бесконечный цикл вроде -

  1. id = 1, updateView (но теперь из-за)
  2. id = 2, updateView (но теперь id = 3 из-за id += 1)

Вы никогда не должны изменять состояние во время обновления представления.

Другие вопросы по тегам