Voltando para células recicladas
Informe uma chave estável e um resolvedor returnTarget à entrada de navegação compartilhada. O Jolt busca a view atual depois do layout da página de retorno. Assim, a foto volta à miniatura correta mesmo após reordenação, rolagem ou reciclagem. A view salva na abertura não é usada como identidade de retorno.
Disponível desde a 0.1.0-rc.1. Recompile o aplicativo nativo. A referência usa um Core Frame, Core ListView e vue-router-ns 0.1.0-rc.2.
Resolução com prazo
import {
sharedNavigationEntry,
resolveListTarget,
} from '@rafaelaugusto/jolt/shared-navigation'
const entry = sharedNavigationEntry(frame, {
tag: `photo:${photo.key}`,
spring: 'smooth',
returnTarget: {
key: photo.key,
timeout: 1500,
resolve(context) {
return resolveListTarget(context, {
list,
// Índice atual da LINHA, inclusive em grades com itens agrupados.
indexOf: (key) => rows.findIndex((row) => row.some((p) => p.key === key)),
// Busque a tag atual nas células montadas; não guarde uma célula antiga.
viewForKey: (key) => findCurrentImage(list, `photo:${key}`),
})
},
fallbackFocus: () => collectionHeading,
},
back: async (options) => (await router.back(options)) === undefined,
})
await entry.open((options) => router.push(`/photos/${photo.key}`, options))findCurrentImage pertence ao aplicativo e percorre os filhos atuais da lista. Consulte o adaptador completo e o template de células nativas. O template atualiza a tag da imagem reciclada com a chave do novo item, mantém apenas células realizadas e respeita o cache de imagens.
O resolvedor recebe { key, tag, page, signal }. Pode devolver uma view, null, undefined ou uma promessa. signal oferece aborted, addEventListener('abort', callback) e removeEventListener, sem exigir o AbortController do navegador. Observe o cancelamento no trabalho do aplicativo. O prazo padrão é 1500 ms, com máximo de 5000 ms, incluindo realização e layout final. Resultados atrasados são ignorados. resolveListTarget rola até a linha atual e verifica novamente após o layout, exigindo a mesma célula e geometria em duas passagens, com até quatro tentativas se a identidade ou a posição estimada das linhas mudar.
Ao final, o Jolt exige uma única tag correspondente na página retornada e a mesma view carregada devolvida pelo resolvedor. Item ausente ou excluído, tags duplicadas, células antigas, falhas e timeout usam a transição comum/fade, preservando a decisão da rota. Rolagem recusada ou geometria incompatível também usam a alternativa. A view resolvida recebe o foco acessível; fallbackFocus pode indicar um título próximo quando o item sumiu.
Comportamento por plataforma
No iOS, Core/UIKit monta a página de retorno sob o detalhe. O movimento nativo mantém a pose inicial enquanto o resolvedor realiza a célula e depois ajusta a origem do restante do gesto, sem saltar. Cancelar durante a espera aborta a preparação e mantém o detalhe. Uma volta confirmada termina uma vez. Mudanças de identidade ou geometria da célula durante o voo encerram a apresentação com segurança.
No Android 14+, o gesto do sistema mostra uma prévia da página atual de detalhe. Cancelar restaura essa página sem chamar a rota nem resolver o destino. Após a confirmação do sistema, o Jolt captura imagem/página visíveis, chama o roteador uma vez, realiza a célula atual e executa o voo nativo. O destino reciclado ao vivo não é uma prévia interativa do predictive back: sua resolução ocorre após a confirmação. Diferentemente do modo estático de gestos compartilhados, esse modo não retém uma imagem antiga da grade durante toda a visita.
Os quadros dos gestos e animações continuam nativos. JavaScript participa da configuração, resolução e eventos de ciclo de vida. O orçamento combinado de pixels inclui a página temporária; conteúdo GPU/WebView/vídeo ou orçamento insuficiente usam navegação comum. Reduzir Movimento ainda resolve identidade/foco, sem o voo. Timeouts não cancelam promessas do aplicativo nem desfazem navegação externa tardia.
Na navegação programática, passe o mesmo returnTarget a sharedNavigation().navigate(). holdSource: true preserva uma captura limitada da página de origem enquanto o destino monta. onCaptured roda uma vez após a captura e antes do roteador, permitindo liberar as transformações de um controlador de foto suspenso. cancel() encerra apresentação e resolução; não desfaz uma rota confirmada.
Investigação do zoom do UIKit
O iOS 18 introduziu UIViewController.preferredTransition = .zoom(...). Seu provedor síncrono pode consultar repetidamente a view de origem atual; trabalha com controladores empilhados ou apresentados e controla o fechamento interativo. As opções públicas não expõem stiffness/damping/mass do Jolt nem este contrato de realização assíncrona. É uma possível implementação separada, não ativada por este adaptador. Consulte o provedor de origem do zoom e as orientações da Apple.
Esta entrega cobre imagens estáticas decodificadas/contêineres simples, um Frame/janela e geometria compatível alinhada aos eixos. Modais nativos, Frames aninhados/abas, troca de imagens de rede e paginação da galeria ficam fora desse contrato. Evidência de simulador/emulador não conclui a matriz de aparelhos físicos, leitores de tela e desempenho das #24/#117. Veja a reprodução e as verificações restantes.
Combine este resolvedor com zoom nativo e retorno a partir da pose de soltura na receita completa da galeria.