A Vida Secreta do @State em Swiftui: Onde meus dados realmente vivem?
Compreendendo a verdade por trás do invólucro de propriedades mais incompreendidas de Swiftui. Por que isso importa que todo desenvolvedor Swifttu usa @state. É a “mágica” que faz sua atualização da interface do usuário quando os dados mudarem. Mas aqui está o problema: a maioria dos desenvolvedores não sabe onde esses dados são armazenados, como sobrevive ao View Recloads ou por que às vezes se comporta inesperadamente. O mal-entendido @state leva a: ❌ Visualizações não atualizando ❌ Redefinição inesperadamente de dados ❌ Hits de desempenho de renderizadores desnecessários Vamos levantar o capô. O básico – o que você acha que acontece contraria: veja {@state privado var count = 0 var corpo: alguma exibição {vStack {text (“\ (count)”) botão (“incremento”) {count += 1}}}} inserir o modo de tela cheia de saída de tela completa, é como: a contagem é apenas uma propriedade normal na estrutura da contadora. Quando a contagem muda, Swiftui renderiza magicamente a vista. Mas … essa não é a história toda. 1. Primeiro equívoco – “@State é apenas uma propriedade armazenada” não. Não é armazenado dentro da sua estrutura de visualização. As visualizações Swiftui são tipos de valor-elas são recriadas o tempo todo. Em vez disso, o @State é um invólucro de propriedade que armazena seus dados fora da visualização, em um armazenamento especial de heap swifttu-gerenciado. Pense assim: sua estrutura de visualização é o plano. O @State Storage é o contêiner oculto Swiftui gerencia. Os dois são conectados por um ID Swiftui atribui quando a hierarquia de visualizações é construída. 2. O que realmente acontece quando você declara @state quando o Swiftui cria pela primeira vez sua visão: aloca um objeto de armazenamento oculto (uma “caixa de estado”). Esse objeto vive enquanto a identidade da visão permanecer a mesma na hierarquia. Sua visualização recebe uma referência a essa caixa através do WrappedValue. Ponto -chave: visualize a identidade.Change a identidade (como trocar uma .ID por outra em uma lista) e o armazenamento desaparece – @state redefine para seu valor inicial. 3. O ciclo de vida em tempo real vamos rastreá -lo: Inicialização → Swiftui aloca armazenamento fora da estrutura. Mutação → Você atualiza o valor, o SwiftUi agenda uma renderização novamente. Recreação → Sua estrutura é substituída, mas a caixa @State é recolocada. Destruição → Alterações de identidade → O armazenamento é destruído. 💡 Armário do mundo real: se você estiver construindo UIs complexas com várias ramificações condicionais, poderá redefinir acidentalmente o estado ao alternar entre ramos. A realidade – a visão de Swiftui, a identidade Swiftui, são estruturas. Isso significa que são tipos de valor – novas cópias são criadas constantemente. Portanto, se o @State realmente vivesse em sua estrutura de visualização, você perderá seus dados toda vez que a visualização é atualizada. O truque? @State armazena seus dados fora da visualização – no sistema de armazenamento interno da Swiftui – e o vincula à sua visualização por meio da identidade. Como a identidade funciona quando o Swiftui torna uma visão: verifica se a visualização “nova” é a mesma identidade que a anterior. Se sim, ele reutiliza o mesmo armazenamento @state. Se não, joga fora o armazenamento antigo e começa fresco. A identidade é determinada por: Visualizar a posição do tipo na hierarquia de visualizações em qualquer .id (…) você define por que isso importa para visualizar o armazenamento do Estado Identityy está ligado à identidade da visão na hierarquia de visualização, não o nome da variável. @State) Exemplo: se alternar {myView () // obtém um novo armazenamento @state quando alternar mudanças} else {myView () // DIFERENTE IDENTITY => Estado redefine} Digite o modo de tela fullcreen Sair do modo de tela cheia: Dê visualizações uma identidade estável com .id (SomestableValue), se você deseja o estado de perseguir. É por isso que reordenar, envolver-se em novos contêineres ou mudar .id pode redefinir seu @state .—– 4. Onde ele mora fisicamente na memória? O wrapper @state está em conformidade com o DynamicProperty. Quando compilado, SwiftUi injeta uma estrutura oculta _state que referencia um objeto Statestorage na pilha. Esse armazenamento é de propriedade e rastreado pelo tempo de execução do Swiftui. Sua exibição estrutura → Na pilha seus dados @state → Na pilha (protegida com recriações constantes de visualização) 5. Problemas em tempo real você realmente atingirá 1eRSEFETIVOS DE DADOS NA NAVEGIAÇÃO NAVEGIATLINK (“Open Detalhe”, Destate: DetailView ()) Digite o modo de tela completa, o modo de tela completa, se o detalhe tive @State e você navega e você navega e você pode Nova identidade de visualização a cada vez. Correção: use @stateObject ou passe os dados de uma visualização de nível superior. 2️⃣ Estado não atualizando se o seu estado depende de algo que muda, mas a sua visualização de identidade permanece constante, o swiftui não se atualiza. 3️⃣ Várias cópias de estado colocam uma visão com @state dentro de uma lista? Cada linha recebe sua própria cópia do estado, ligada à sua própria identidade. Linhas de reordenação? Estado pode embaralhar ou redefinir. 6. Como pensar sobre @state Se o Uikit foi: “Vou me apegar a essa referência até que você me diga o contrário”, Swiftui com @state é: “Vou manter esse valor vivo enquanto a identidade da sua visão permanecer na árvore – mas quebre esse link e eu estarei jogando -o.” As principais regras do polegar para as principais takeaways usem @state para dados simples, de vida útil e de curta duração, se os dados sobreviverem a ver recriações, levantá-los ou usar @stateObject ter cuidado com .id (…)-ele pode redefinir o seu estado de identificação: a posição de identificação de sua posição de identificação para a sua identificação para o seu ponto de vista para o seu ponto de vista para o seu ponto de vista para o seu ponto de vista para o que o ponto de vista da sua saída para o seu ponto de vista para o seu ponto de vista para o seu ponto de vista para o seu ponto de vista para o seu caminho para o seu caminho. Depois de realmente entender isso, você parará de lutar contra Swiftui e começar a fazer funcionar para você.
Fonte
Publicar comentário