Daves Balthazar

090 – Criando uma ListView Infinita em Dart

Playlist: Curso Grátis de FLUTTER e DART Completo

Etapa 4: criar um ListView de rolagem infinito
Nesta etapa, você expandirá RandomWordsState para gerar e exibir uma lista de pares de palavras. Conforme o usuário rola, a lista exibida em um widget ListView cresce infinitamente. O construtor de fábrica do construtor ListView permite que você crie uma exibição de lista preguiçosamente, sob demanda.

Adicione uma lista de sugestões à classe RandomWordsState para salvar os pares de palavras sugeridos. Além disso, adicione uma variável _biggerFont para aumentar o tamanho da fonte.

lib / main.dart
content_copy
classe RandomWordsState estende estado MENOR RandomWords MAIOR
  final _suggestions = MENOR WordPair MAIOR [];
  final _biggerFont = const TextStyle (fontSize: 18.0);
  // ···

 Nota: O prefixo de um identificador com um sublinhado impõe a privacidade na linguagem Dart.

Em seguida, você adicionará uma função _buildSuggestions () à classe RandomWordsState. Este método cria o ListView que exibe o pareamento de palavras sugerido.

A classe ListView fornece uma propriedade de construtor, itemBuilder, que é um construtor de fábrica e uma função de retorno de chamada especificada como uma função anônima. Dois parâmetros são passados ​​para a função – o BuildContext e o iterador de linha, i. O iterador começa em 0 e incrementa cada vez que a função é chamada. Ele é incrementado duas vezes para cada par de palavras sugeridas: uma para o ListTile e uma para o Divider. Esse modelo permite que a lista sugerida cresça infinitamente à medida que o usuário rola.

Adicione uma função _buildSuggestions () à classe RandomWordsState:

lib / main.dart (_buildSuggestions)
content_copy
Widget _buildSuggestions ()
  retornar ListView.builder (
      preenchimento: const EdgeInsets.all (16.0),
      itemBuilder: / * 1 * / (contexto, i)
        if (i.isOdd) retorna Divider (); / * 2 * /

        índice final = i ~ / 2; / * 3 * /
        if (index MAIOR = _suggestions.length)
          _suggestions.addAll (generateWordPairs (). take (10)); / * 4 * /
        
        return _buildRow (_suggestions [index]);
      );

O callback itemBuilder é chamado uma vez por pareamento de palavras sugerido e coloca cada sugestão em uma linha ListTile. Para linhas pares, a função adiciona uma linha ListTile para o pareamento de palavras. Para linhas ímpares, a função adiciona um widget de divisão para separar visualmente as entradas. Observe que o divisor pode ser difícil de ver em dispositivos menores.
Adicione um widget divisor de um pixel de altura antes de cada linha no ListView.
A expressão i ~ / 2 divide i por 2 e retorna um resultado inteiro. Por exemplo: 1, 2, 3, 4, 5 se torna 0, 1, 1, 2, 2. Isso calcula o número real de pares de palavras no ListView, menos os widgets do divisor.
Se você alcançou o final dos pares de palavras disponíveis, gere mais 10 e adicione-os à lista de sugestões.
A função _buildSuggestions () chama _buildRow () uma vez por par de palavras. Essa função exibe cada novo par em um ListTile, que permite tornar as linhas mais atraentes na próxima etapa.

Adicione uma função _buildRow () a RandomWordsState:

lib / main.dart (_buildRow)
content_copy
Widget _buildRow (par do WordPair)
  return ListTile (
    título: Texto (
      pair.asPascalCase,
      style: _biggerFont,
    )
  );

Na classe RandomWordsState, atualize o método build () para usar _buildSuggestions (), em vez de chamar diretamente a biblioteca de geração de palavras. (O Scaffold implementa o layout visual básico do Material Design.) Substitua o corpo do método pelo código destacado:

lib / main.dart (compilação)
content_copy
@sobrepor
Construção de Widget (contexto BuildContext)
  Andaime de retorno (
    appBar: AppBar (
      title: Text (‘Gerador de nome de inicialização’),
    )
    body: _buildSuggestions (),
  );

Na classe MyApp, atualize o método build () alterando o título e alterando o widget home para ser RandomWords:

step3_stateful_widget → step4_infinite_list /lib/main.dart
@@ -6,15 +6,8 @@
66 class MyApp extends StatelessWidget {
77 @override
88 Construção de Widget (Contexto BuildContext)
99 retornar MaterialApp (
10 – título: ‘Welcome to Flutter’,
11 – casa: Andaime (
10 + título: ‘Gerador de nome de inicialização’,
11 + home: RandomWords (),
12 – appBar: AppBar (
13 – título: Texto (‘Welcome to Flutter’),
14 -),
15 – corpo: Centro (
16 – criança: RandomWords (),
17 -),
18 -),
1912);
2013