Как использовать переменные внутри инициализатора LinearGradient - SwiftUI - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь сделать это внутри структуры, которая использует cardGradient позже в коде. «1a» и «1b» - это цвета внутри папки ресурсов.

var color1 = "1a"
var color2 = "1b"

let cardGradient = LinearGradient(gradient: Gradient(colors: 
[Color(color1), Color(color2)]), startPoint: .leading, endPoint: .trailing)

Невозможно использовать элемент экземпляра 'color1' в инициализаторе свойства;инициализаторы свойств запускаются до того, как станет доступным 'self'.

Невозможно использовать элемент экземпляра 'color2' в инициализаторе свойства;инициализаторы свойств запускаются до того, как станет доступным 'self'

//

Решение: спасибо за помощь!

var color1 = "1a"
var color2 = "1b"

VStack {
     // ... some views here
}
.background(LinearGradient(gradient: Gradient(colors: 
[Color(color1), Color(color2)]), startPoint: .leading, endPoint: .trailing))

1 Ответ

0 голосов
/ 15 октября 2019

Я не уверен, насколько интенсивно создание LinearGradient на телефоне, но если это не проблема, вы можете просто сделать LinearGradient вычисляемую переменную:

var color1 = "1a"
var color2 = "1b"

let cardGradient: LinearGradient {
    LinearGradient(gradient: Gradient(colors: [Color(color1), Color(color2)]), startPoint: .leading, endPoint: .trailing)
}

Если это такинтенсивно используя вычислительные ресурсы, вы можете сделать его необязательным (или присвоить ему значение по умолчанию) и установить его в .onAppear представления, но тогда вам придется сделать градиент @State:

var color1 = "1a"
var color2 = "1b"
@State var cardGradient: LinearGradient?

var body: some View {
    VStack {
        // ... some views here
    }.onAppear {
        self.cardGradient = LinearGradient(gradient: Gradient(colors: [Color(color1), Color(color2)]), startPoint: .leading, endPoint: .trailing)
    }
}

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

...