Состояние гонки при использовании List с asyn c -загруженными строками и размещенными с помощью GeometryReader - PullRequest
0 голосов
/ 10 июля 2020

Это дополнительный вопрос от Приоритетное поведение объятий содержимого в SwiftUI .

У меня есть список с асинхронными c -загруженными изображениями для каждой строки, имеющей высоту установить с помощью GeometryReader. Полный код здесь :

struct CountryCell: View {
    let country: Country

    @State var childSize: CGSize = .init(width: 0, height: 50)

    var body: some View {
        HStack {
            AsyncImage(url: Endpoints.flag(countryCode: country.flagCode).url, placeholder: Image("flag"))
                .aspectRatio(contentMode: .fit)
                .frame(width: DeviceMetrics.size.width * 0.25, height: self.childSize.height)
            VStack(alignment: .leading, spacing: 5) {
                Text("Country: ").bold() + Text(self.country.name)
                Text("Capital: ").bold() + Text(self.country.capital)
                Text("Currency: ").bold() + Text(self.country.currency)
            }
            .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
            .background(
                GeometryReader { proxy -> AnyView in
                    DispatchQueue.main.async {
                        self.childSize = proxy.size
                    }
                    return AnyView(Color.clear)
            })
        }
    }
}

Запустите его, изображения не заменят заполнитель (возможно, 1 из 10 будет отображаться случайным образом), хотя сетевые запросы выполняются. Я не могу понять этого, но подозреваю, что это состояние гонки во время запуска макета GeometryReader и AsyncImage. Если вы замените:

.frame(width: DeviceMetrics.size.width * 0.25, height: self.childSize.height)

на:

.frame(width: DeviceMetrics.size.width * 0.25)

, изображения будут отображаться правильно. Точно так же, если вы закомментируете GeometryReader, все тоже начнет работать.

Любые подсказки будут очень благодарны.

...