Ainda estou com dificuldade para entender como os modificadores de visualização funcionam no SwiftUI.
Até onde eu sei, os modificadores não alteram diretamente a visualização correspondente, mas, em vez disso, incorporam a visualização em uma nova visualização que aplica as alterações desejadas. Por exemplo, Text(...).padding()
NÃO altera algumas propriedades da Text
visualização para criar o preenchimento, mas, em vez disso, incorpora a Text
visualização em uma nova visualização que cuida dos preenchimentos. Portanto, os modificadores não modificam a visualização, mas criam uma nova visualização com as alterações desejadas.
Certo, isso faz todo o sentido.
Mas como funcionam os modificadores, que (parecem) alterar apenas propriedades específicas de uma visualização? Por exemplo, os modificadores .font
ou .tint
. Embora eu entenda como uma visualização circundante pode alterar propriedades "externas" como plano de fundo, preenchimento, escala, etc., não entendo como o mesmo é possível para propriedades "internas" como a fonte? Como a Text
visualização pode saber, a partir de sua visualização circundante, qual fonte deve usar? Ou como uma visualização circundante poderia recriar a Text
visualização com todas as suas propriedades, mas apenas uma fonte alterada?
Posso criar um personalizado Text("Some example").capitalize("aoe")
que crie um texto com todas as mesmas propriedades, como fonte, cor de primeiro plano, etc., mas com "ALGUM Exemplo"?
Não está claro quais outros modificadores de visualização você considera como "alterações de propriedades internas", então considerarei apenas
font
etint
. Outros modificadores de visualização podem ser implementados de forma diferente.Ambos
font
etint
são implementados definindo valores de ambiente. Ambos são inlinable, então suas implementações podem ser encontradas nos arquivos .swiftinterface do SwiftUI.\.font
aqui está ofont
valor do ambiente público, mas\.tint
se refere a uminternal
valor de ambiente, então você não pode usá-lo em seu próprio código.Então, visualizações como essas
Text
são apenas a leitura do valor do ambiente e a alteração de sua aparência de acordo.Mesmo sem olhar os arquivos .swiftinterface, você pode frequentemente inferir como algo é implementado por
print
ing oudump
ing uma visualização com esse modificador. por exemploA saída menciona um
_EnvironmentKeyWritingModifier
, então pode-se inferir que ele está modificando o ambiente.Note que há outro modificador chamado
font
que retorna aText
(ao contrário desome View
). Este modificador é declarado emText
si mesmo, então ele pode apenas criar uma cópia deself
, modificar algumas propriedades e então retornar a cópia modificada.Então a razão pela qual
font
/tint
pode mudar os "internos" de uma view é porque essas views estão lendo os valores de ambiente que os modificadores definem. Não há mágica. Você não pode criar talcapitalize
modificador da mesma forma (definindo seu próprio valor de ambiente), porqueText
ele não lê seu valor de ambiente personalizado.Claro, você sempre pode criar sua própria visualização que leia o valor do ambiente: