Os aplicativos para celular costumam ter várias categorias de conteúdo para oferecer. O aplicativo Google Play Store, por exemplo, apresenta seu conteúdo em categorias como jogos, aplicativos, filmes e livros. Em aplicativos Flutter, o widget BottomNavigationBar permite que os usuários vejam qualquer categoria conforme o aplicativo é iniciado e olhem rapidamente para as outras com apenas o toque de um dedo.

Neste tutorial, vamos contar tudo o que você precisa saber sobre BottomNavigationBar no Flutter. Demonstraremos como funciona, examinaremos alguns casos de uso e mostraremos como personalizar o widget BottomNavigationBar em seu aplicativo Flutter.

Aqui está o que vamos cobrir:

O que é BottomNavigationBar no Flutter?

BottomNavigationBar é um widget que exibe uma linha de pequenos widgets na parte inferior de um aplicativo Flutter. Normalmente, é usado para mostrar cerca de três a cinco itens. Cada item deve ter um rótulo e um ícone. BottomNavigationBar permite que você selecione um item por vez e navegue rapidamente para uma determinada página.

Agora, vamos percorrer o processo de criação de uma BottomNavigationBar simples, passo a passo. O produto acabado terá a seguinte aparência:

Produto finalizado

Mostrando BottomNavigationBar

O widget BottomNavigationBar é fornecido à propriedade bottomNavigationBar de Scaffold :

 Scaffold ( appBar: AppBar ( title: const Text ('BottomNavigationBar Demo'), ), bottomNavigationBar: BottomNavigationBar ( items: const  [ BottomNavigationBarItem ( ícone: Ícone (Icons.call), rótulo:'Chamadas', ), BottomNavigationBarItem ( ícone: ícone (Icons.camera), rótulo:'Câmera', ), BottomNavigationBarItem ( ícone: Ícone (Icons.chat), rótulo:'Chats', ), ], ),
);

BottomNavigationBar tem uma propriedade obrigatória chamada items . items aceitam um widget de um tipo BottomNavigationBarItem . BottomNavigationBarItem é simplesmente usado para mostrar o item real dentro de BottomNavigationBar.

O código acima exibe apenas a BottomNavigationBar com o primeiro item selecionado como padrão. Isso não muda a seleção ainda quando clicamos nos outros itens:

Primeiro item selecionado

Mostrando uma seleção de itens

Para mostrar a seleção de outros itens, usaremos duas propriedades: onTap e currentIndex .

 int _selectedIndex=0;//Novo
BottomNavigationBar ( items: const  [ ... currentIndex: _selectedIndex,//Novo onTap: _onItemTapped,//Novo
)
//Novo
void _onItemTapped (int index) { setState (() { _selectedIndex=index; });
}

A variável _selectedIndex contém o valor do item atualmente selecionado. _selectedIndex é dado à propriedade currentIndex .

O retorno de chamada _onItemTapped () é atribuído a onTap de BottomNavigationBar, que retorna o índice quando o item é tocado. Simplesmente atribuindo um índice de item atualmente selecionado para _selectedIndex e fazendo setState irá mostrar o item como selecionado em BottomNavigationBar.

Selecionando item

Exibindo a página do item selecionado

No momento, não temos nenhuma página para mostrar com base no item selecionado. Então, vamos em frente e ótimo:

//Novo
Const static List  _pages= [ Ícone( Icons.call, tamanho: 150, ), Ícone( Icons.camera, tamanho: 150, ), Ícone( Icons.chat, tamanho: 150, ),
];
Andaime( appBar: AppBar ( title: const Text ('BottomNavigationBar Demo'), ), corpo: Centro ( filho: _pages.elementAt (_selectedIndex),//Novo ), bottomNavigationBar: BottomNavigationBar ( ... ),
);

_pages contém uma lista de widgets. Para simplificar, estamos apenas mostrando um grande ícone do próprio item.

Mostrar uma página no centro da tela de _pages com base no _selectedIndex do item fará o resto da mágica.

Agora temos BottomNavigationBar instalado e funcionando:

Navegação inferior funcionando

A ilustração abaixo mostra como o código se traduz no design:

Código traduzido para o design

Personalização da BottomNavigationBar

BottomNavigationBar tem várias opções para personalizá-lo de acordo com sua necessidade. Vamos dar um zoom em algumas das propriedades que você pode personalizar.

Cor de fundo

Você pode querer alterar a cor de fundo da BottomNavigationBar para corresponder à sua marca. Você pode fazer isso simplesmente usando a propriedade backgroundColor .

 BottomNavigationBar ( backgroundColor: Colors.blueAccent, items: const  [ ... ],
)

Blue Accent

Elevação

Por padrão, BottomNavigationBar é definido para elevar 8 pontos da superfície para que apareça no topo das páginas. Você pode definir esta propriedade com qualquer valor:

 BottomNavigationBar ( backgroundColor: Colors.white10, elevação: 0, items: const  [ ... ],
)

Elevation Value

Tamanho do ícone

Você pode reduzir ou ampliar o tamanho de todos os ícones de uma vez usando a propriedade iconSize :

 BottomNavigationBar ( iconSize: 40, items: const  [ ... ],
)

Tamanho do ícone atualizado

Cursor do mouse

Ao executar na web, você pode personalizar o cursor do mouse quando ele passa sobre um item na BottomNavigationBar:

 BottomNavigationBar ( mouseCursor: SystemMouseCursors.grab, items: const  [ ... ],
)

Mouse pairando sobre os ícones

Item selecionado

Você pode fazer o item selecionado parecer diferente de um não selecionado usando as várias propriedades selecionadas de BottomNavigationBar:

 BottomNavigationBar ( selectedFontSize: 20, selectedIconTheme: IconThemeData (color: Colors.amberAccent, size: 40), selectedItemColor: Colors.amberAccent, selectedLabelStyle: TextStyle (fontWeight: FontWeight.bold), items: const  [ ... ],
)

Ícones amarelos destacados

Itens não selecionados

Você também pode alterar a aparência dos itens não selecionados. BottomNavigationBar tem algumas propriedades não selecionadas que você pode usar:

 BottomNavigationBar ( unselectedIconTheme: IconThemeData ( color: Colors.deepOrangeAccent, ), unselectedItemColor: Colors.deepOrangeAccent, items: const  [ ... ],
)

Propriedades de ícones diferentes

Removendo rótulos

Se você deseja se livrar totalmente dos rótulos, pode usar showSelectedLabels e showUnselectedLabels :

 BottomNavigationBar ( iconSize: 40, showSelectedLabels: false, showUnselectedLabels: false, items: const  [ ... ],
)

Sem rótulos

Destacando o item selecionado

Você pode enfatizar o item selecionado definindo o tipo BottomNavigationBar como BottomNavigationBarType.shifting :

 BottomNavigationBar ( tipo: BottomNavigationBarType.shifting, selectedFontSize: 20, selectedIconTheme: IconThemeData (color: Colors.amberAccent), selectedItemColor: Colors.amberAccent, selectedLabelStyle: TextStyle (fontWeight: FontWeight.bold), items: const  [ ... ],
)

Seleção enfatizada

Como preservar o estado das páginas

Embora a versão básica do BottomNavigationBar esteja funcionando bem, temos um problema: qualquer ação-por exemplo, pesquisar, filtrar, inserir texto, rolar por uma lista, preencher um formulário de contato, etc.-está sendo executada na página serão perdidos ao selecionar outro item da BottomNavigationBar:

Estado das páginas sendo perdidas

Na demonstração acima, estamos tentando encontrar um contato. Quando mudamos para a seção de câmera antes de terminarmos nossa pesquisa e, em seguida, retornamos à seção de bate-papo, o texto inserido anteriormente desapareceu completamente.

Não tema-a solução é bastante simples. Basta substituir o widget existente por IndexedStack . O widget IndexedStack contém uma pilha de widgets, mas mostra apenas um de cada vez. Como todos os widgets ficam na pilha, o estado é preservado.

//Antes
Centro( filho: _pages.elementAt (_selectedIndex),
)
//Após
IndexedStack ( índice: _selectedIndex, filhos: _pages,
)

A propriedade index é usada para mostrar uma página de _pages , que é fornecida à propriedade children.

Index Property

Como incluir TabBar com BottomNavigationBar

Às vezes, uma única página não é suficiente para cobrir uma ampla gama de subcategorias em uma categoria pai dentro da BottomNavigationBar. Por exemplo, o aplicativo Google Play Store tem subcategorias rotuladas Para você, Top charts, Kids, etc. Um cenário como este exige o widget Flutter TabBar .

Para fins de demonstração, vamos tentar adicionar TabBar para chamadas recebidas, efetuadas e perdidas dentro da seção de chamadas, conforme mostrado abaixo:

Seções de chamadas recebidas, enviadas e perdidas

A estrutura geral de BottomNavigationBar permanece a mesma. Você pode precisar criar uma classe separada para a página na qual deseja incluir um TabBar. Para isso, a CallPage é criada e adicionada à lista de páginas.

 Const estática List  _pages= [ CallPage (), //página da câmera //página de bate-papo
];

A página de chamadas tem a seguinte aparência:

 DefaultTabController ( comprimento: 3, criança: Scaffold ( appBar: AppBar ( FlexibleSpace: Column ( mainAxisAlignment: MainAxisAlignment.end, crianças: [ Barra de abas( guias: [ Aba( texto:'Entrada', ), Aba( texto:'Saída', ), Aba( texto:'Perdido', ), ], ) ], ), ), body: TabBarView ( crianças: [ Página de entrada (), Página de saída (), MissedPage (), ], ), ),
);

Esta é a saída:

Ícones da página de chamadas

Ocultar a barra de navegação inferior na rolagem

Ao criar um aplicativo Flutter, você sempre deseja utilizar o espaço da tela da forma mais eficiente possível. Quando um usuário está rolando por uma longa lista de itens em uma das páginas do seu aplicativo, você pode ocultar a BottomNavigationBar suavemente. Esse comportamento melhora a experiência do usuário porque você está exibindo apenas o conteúdo necessário no momento.

A partir de agora, a BottomNavigationBar permanece como está enquanto rola pela lista de chamadas feitas:

Bottom Navigation Stays

Vamos examinar o processo de ocultação da BottomNavigationBar passo a passo.

Primeiro, envolva sua exibição de lista em NotificationListener widget. NotificationListener escuta a notificação de rolagem acontecendo no ListView.

 NotificationListener  ( onNotification: _handleScrollNotification, criança: Scaffold ( corpo: Centro ( filho: ListView.builder ( itemCount: items.length, itemBuilder: (contexto, índice) { return ListTile ( título: Texto ('$ {items [index]}'), ); }, ), ), ),
);

Em seguida, implemente o método _handleScrollNotification para determinar a direção da rolagem. Notifique a página que hospeda a BottomNavigationBar para ocultá-la quando o usuário rolar para baixo.

 bool _handleScrollNotification (ScrollNotification notification) { if (notification.depth==0) { if (a notificação é UserScrollNotification) { final UserScrollNotification userScroll=notificação; switch (userScroll.direction) { case ScrollDirection.forward: widget.isHideBottomNavBar (true); pausa; case ScrollDirection.reverse: widget.isHideBottomNavBar (false); pausa; case ScrollDirection.idle: pausa; } } } retorna falso;
}

Envolva BottomNavigationBar dentro do widget SizeTransition . SizeTransition anima o tamanho de BottomNavigationBar.

 AnimationController animationController= AnimationController (vsync: this, duration: Duration (milliseconds: 300));
SizeTransition ( sizeFactor: animationController, axisAlignment:-1.0, filho: BottomNavigationBar ( items: const  [ ... ], ),
)

Start hiding animation on receiving the callback from the page that has the ListView.

CallsPage( isHideBottomNavBar: (isHideBottomNavBar) { isHideBottomNavBar ? animationController.forward() : animationController.reverse(); },
)

Here is the result:

Scrolling Outgoing Calls

É isso! The full code for this Flutter BottomNavigationBar example can be found on GitHub.

Conclusão

In this tutorial, we showed how to integrate BottomNavigationBar and customize it. We also learned various use cases with examples that you’ll likely encounter while developing a full-fledged Flutter app. I hope the practical examples we examined in this article helped you understand these important concepts.

The post How to build a bottom navigation bar in Flutter appeared first on LogRocket Blog.