Achado — productCount = totalItems quebra a grid do detalhe (crash)
Severidade: Crítico (crash em runtime)
Decisão do design doc afetada: #4 — Detalhe Condicional por showCaseType
Status: Em aberto — aguardando confirmação do usuário
O que o design doc propõe
ShowCaseDetailScreenpassa props aoShowCaseDetailLayout:productCount = (showCaseType == 4) ? detail.totalItems : detail.showCaseItems.length
O que o código atual faz
Em lib/screens/show_case/widgets/show_case_detail_layout.dart:152-164, productCount é usado diretamente como itemCount do GridView.builder, cujo itemBuilder é o productItemBuilder fornecido pela tela:
GridView.builder(
...
itemCount: productCount,
itemBuilder: productItemBuilder,
),
Em lib/screens/show_case/show_case_detail/show_case_detail_screen.dart:46-62, productItemBuilder indexa a lista local items (== controller.detail.value?.showCaseItems ?? []):
final items = controller.detail.value?.showCaseItems ?? [];
...
productCount: items.length > 4 ? 4 : items.length,
productItemBuilder: (_, index) {
final showCase = items[index]; // acessa items[index], não um dado remoto
return _buildProductCard(showCase);
},
Hoje productCount é sempre min(4, items.length) — nunca maior que o tamanho real da lista carregada.
Por que a proposta quebra
Pelo contrato (context/frontend-contract-diff.md, seção GET /api/show-case-new/app/{showCaseId}):
showCaseType | showCaseitems | totalItems |
|---|---|---|
4 (SellerStock) | 4 primeiros produtos (preview) | Count total do estoque da loja no ES |
Ou seja, para SellerStock, items (showCaseitems) sempre terá no máximo 4 elementos, mas totalItems pode ser qualquer número (ex.: 87). Se productCount virar detail.totalItems (87) enquanto items continua com 4 elementos, productItemBuilder vai tentar items[4], items[5], ... até items[86] → RangeError: Index out of range, derrubando a tela de detalhe sempre que totalItems > 4 (o caso comum/esperado para uma vitrine de estoque completo).
Recomendação
Manter productCount sempre como min(4, items.length), igual à lógica atual, independentemente do showCaseType. O valor de totalItems deve alimentar somente o texto de contagem (productCountText), nunca o itemCount da grid.
Resolução
Decisão: productCount continua sempre min(4, items.length), independentemente do showCaseType. totalItems alimenta somente productCountText (nunca o itemCount da grid). Confirmado com o usuário na sessão de grilling.