SwiftUI - Как избежать обновления sh списка при изменении состояния var из той же структуры - PullRequest
1 голос
/ 11 февраля 2020

У меня есть основной вид, который содержит тело с TabView, и каждая вкладка показывает свой список. Кроме того, в верхней части основного класса я объявил состояние var только для контроля, должен ли я отображать модальное представление или нет.

Проблема заключается в том, что при изменении значения этого состояния var, все тело основного вида перерисовывается с анимацией. Это нежелательное поведение, потому что я не изменяю данные, связанные с обновлением списка, которые изменяются.

struct HomeView: View {
    @State private var selection = 0
    @State var modalShown = false //This is the problematic var that makes a list to be updated with an animation

    @EnvironmentObject var filters: UserFilters
    @EnvironmentObject var filtersViewController: FiltersViewController

    init() {
        UITabBar.appearance().backgroundColor = #colorLiteral(red: 0.03921568627, green: 0.03921568627, blue: 0.03921568627, alpha: 1)
        UITabBar.appearance().barTintColor = #colorLiteral(red: 0.03921568627, green: 0.03921568627, blue: 0.03921568627, alpha: 1)
    }

    var body: some View {
        return ZStack {
            TabView(selection: $selection){
                IncidencesView(modalShown: $modalShown) //A view that contains a list that is being refreshing

По крайней мере, есть ли способ избежать анимации обновления списка?

Спасибо!

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

По крайней мере, есть ли способ избежать анимации обновления списка?

Предоставленный моментальный снимок кода не тестируется, поэтому просто на лету ... попробуйте следующее

IncidencesView(modalShown: $modalShown.animation(nil))
0 голосов
/ 11 февраля 2020

Попробуйте это.

Сделайте ваше мнение, я считаю, в этом случае IncidencesView, соответствует Equatable. Это потребует от вас перегрузки оператора == и точного указания SwiftUI, при каких обстоятельствах представление изменилось, а когда - нет.

Как только вы это сделаете, в HomeView измените IncidencesView с помощью .equitable() модификатор представления, чтобы сказать его родителю HomeView, чтобы проверить, равен ли IncidencesView его старому я, когда происходит изменение состояния. Если он по-прежнему равен своему старому я, не перерисовывать.

Теперь, даже если selection изменится, SwiftUI проверит, равен ли текущий IncidencesView версии в этом новом условии. Он увидит, что это так (потому что selection, вероятно, не влияет на результат функции ==), и поэтому новая версия представления не будет воссоздана и прорисована.

Смотрите эту отличную статью: https://swiftui-lab.com/equatableview/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...