Voltar para artigos

O que é um Sliver, afinal?

Entenda o conceito que serve de base para todo o sistema de rolagem do Flutter.

6 min de leitura41 leituras
Flutter
Índice

No artigo anterior, vimos que o ListView consegue renderizar milhares de itens porque cria apenas o que realmente é necessário.

Também deixamos uma pergunta no ar:

Se o ListView é apenas um wrapper… o que existe por baixo dele?

A resposta é: Slivers.

Se você já pesquisou sobre scroll no Flutter, provavelmente encontrou esse termo acompanhado de APIs como SliverList, SliverGrid e SliverAppBar.

É comum pensar que Sliver é apenas “mais um widget” ou uma forma mais complicada de construir listas.

Mas isso está longe da realidade.

Na verdade, Sliver é um conceito arquitetural. Quando você entende esse conceito, várias APIs do Flutter passam a fazer muito mais sentido.


O que significa “Sliver”?

A palavra Sliver significa algo como:

Pequena fatia, um pedaço fino ou uma porção.

Esse nome não foi escolhido por acaso.

Imagine que toda a área rolável da sua tela seja formada por diversos blocos empilhados.

Cada bloco representa uma parte diferente da interface.

Por exemplo:

  • um cabeçalho;
  • uma lista;
  • um grid;
  • um banner;
  • um formulário.

Em vez de tratar tudo isso como uma única estrutura gigantesca, o Flutter divide a área rolável em pequenas partes independentes.

Cada uma dessas partes é um Sliver.


O viewport é a janela da sua tela

Existe outro conceito importante antes de continuar: Viewport.

O viewport representa simplesmente a área atualmente visível da interface.

Se a tela do celular possui 800 pixels de altura, esse é o espaço disponível para desenhar conteúdo.

Tudo o que está fora dessa janela não precisa aparecer naquele momento.

Visualmente podemos imaginar assim:

┌────────────────────────────┐
│                            │
│        Viewport            │
│                            │
└────────────────────────────┘

O viewport é como uma janela olhando para um conteúdo muito maior.

O usuário move essa janela quando faz scroll.


Onde entram os Slivers?

Agora imagine que o conteúdo rolável seja dividido em vários pedaços.

Cada pedaço é responsável por uma parte específica da interface.

┌────────────────────────────┐
│        SliverAppBar        │
├────────────────────────────┤
│        SliverList          │
├────────────────────────────┤
│        SliverGrid          │
├────────────────────────────┤
│     SliverToBoxAdapter     │
└────────────────────────────┘

Perceba uma mudança importante de mentalidade.

O Flutter não pensa em:

Tenho uma tela.

Ele pensa em:

Tenho vários Slivers que juntos formam uma área rolável.

Essa diferença parece pequena, mas muda completamente a forma como o sistema de scroll foi projetado.


Cada Sliver conhece apenas sua própria responsabilidade

Uma característica interessante da arquitetura do Flutter é que cada Sliver sabe fazer apenas uma coisa.

Um SliverList sabe organizar uma lista.

Um SliverGrid sabe organizar um grid.

Um SliverAppBar sabe expandir, recolher e reagir ao scroll.

Um SliverPersistentHeader sabe permanecer fixo quando necessário.

Eles não precisam conhecer uns aos outros.

Cada um calcula apenas sua própria parte da interface.

Isso segue um princípio que aparece diversas vezes no Flutter:

Cada componente possui uma responsabilidade bem definida.

Esse desacoplamento torna o sistema extremamente flexível.


O ScrollView não desenha nada

Esse é um detalhe que costuma surpreender quem está começando a estudar Slivers.

Quando pensamos em um CustomScrollView, é natural imaginar que ele seja o responsável por construir toda a interface.

Na verdade, não.

O ScrollView funciona muito mais como um maestro do que como um músico.

Ele não desenha listas.

Não desenha grids.

Não desenha cabeçalhos.

Seu trabalho é coordenar todos os Slivers.

Ele decide:

  • Qual Sliver está entrando na tela;
  • Qual Sliver está saindo;
  • Quanto cada um deve ocupar;
  • Como o scroll deve avançar.

Cada Sliver executa sua própria lógica. O ScrollView apenas organiza tudo.


Por que essa arquitetura existe?

Agora imagine um aplicativo moderno.

Talvez você tenha algo parecido com isso:

  • uma AppBar expansível;
  • um banner promocional;
  • uma lista de categorias;
  • um grid de produtos;
  • uma seção de recomendações;
  • um rodapé.

Sem Slivers, seria necessário combinar vários widgets roláveis diferentes.

Provavelmente surgiriam problemas como:

  • scrolls concorrentes;
  • widgets tentando ocupar altura infinita;
  • perda de performance;
  • necessidade de usar shrinkWrap, muitas vezes de forma inadequada.

Com Slivers, tudo passa a fazer parte de uma única área rolável.

Cada componente contribui apenas com sua própria fatia.

O resultado é uma arquitetura muito mais previsível.


O ListView também é um Sliver (indiretamente)

Lembra do artigo anterior?

Dissemos que o ListView era apenas um wrapper.

Agora isso começa a fazer sentido.

Quando você escreve:

ListView.builder(
  itemCount: 100,
  itemBuilder: (context, index) {
    return ListTile(title: Text('Item $index'));
  },
)

O Flutter, internamente, converte essa ideia em uma estrutura baseada em Slivers.

Você não precisa enxergar, mas é exatamente isso que acontece.

ListView.builder({
     required NullableIndexedWidgetBuilder itemBuilder,
     ...,
})childrenDelegate = SliverChildBuilderDelegate(itemBuilder, ...),
  super(...);

Ou seja, mesmo que você nunca tenha usado um CustomScrollView, você provavelmente já utilizou Slivers centenas de vezes sem perceber.

Em Slivers puro ficaria assim:

CustomScrollView(
  slivers: [
    SliverList(
      delegate: SliverChildBuilderDelegate(
        (context, index) {
          return ListTile(
            title: Text('Item $index'),
          );
        },
        childCount: 100,
      ),
    ),
  ],
)

Repare que não mudamos a ideia da tela. Continuamos exibindo uma lista. A diferença é que agora estamos usando diretamente o “bloco” que o ListView utiliza internamente.


O verdadeiro modelo mental

Depois que entendemos o conceito, fica muito mais fácil visualizar uma tela Flutter.

Em vez de imaginar:

Uma tela contendo vários widgets.

Passe a imaginar:

Um viewport observando uma sequência de Slivers.

Cada Sliver representa um trecho da experiência de scroll.

Cada um calcula seu próprio layout.

Cada um informa quanto espaço ocupa.

E todos trabalham juntos para formar uma única superfície rolável.

Esse é o modelo mental utilizado pelo próprio framework.


Conclusão

Slivers não são uma coleção de widgets exóticos para casos específicos. Eles são a base sobre a qual praticamente todo o sistema de scroll do Flutter foi construído.

Quando entendemos que cada Sliver representa uma pequena parte da área rolável e que o ScrollView apenas coordena essas partes, começamos a enxergar a arquitetura do Flutter da forma como ela realmente foi projetada.

Essa mudança de perspectiva torna muito mais fácil entender APIs avançadas, diagnosticar problemas de layout e construir interfaces complexas sem recorrer a soluções improvisadas.

No próximo artigo vamos conhecer o componente responsável por fazer essa coordenação acontecer.

Agora que entendemos o conceito, vamos descobrir quem organiza todos esses Slivers.

Compartilhar:XLinkedInWhatsApp
Wellington Eugenio dos Santos

Escrito por Wellington Eugenio dos Santos

Engenheiro de Software focado em criar soluções robustas de alto desempenho para Web e Mobile.
Criador de bibliotecas open-source como signal_form e lucid_validation.