Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

BottomNavigationBar e Navigator.push é possível?

Bom dia, estou fazendo alguns cursos de Flutter e gostaria de compartilhar uma dúvida sobre navegação entre telas, entender melhor pensando tb em boas práticas de desenvolvimento. No curso o professor comenta a importancia de trabalhar com Navigator.push e depois usar o POP para não ter sobreposição de telas de forma desnecessárias e isso impacta na performance do app.

Em outro curso de Flutter (Flutter: aplicando constraints e implementando layouts responsivos) o professor Matheus ensina a navegar entre telas usando a BottomNavigationBar, mas pelo que entendi o "header" com título e o bottom navigation bar ficam estáticos pq eu troco apenas o "miolo" da tela. Até ai eu consegui acompanhar numa boa e tudo funcionou, mas o que eu gostaria de entender como devo estruturar e fazer, pq da forma como imaginei não consigo evoluir.

No BottomNavigationBar eu usasse o Navigator.push, pois as telas (rotes) dos botões (BottomNavigationBarItem) do bottom navigation bar devem ter outros titulos, outros icons e não teriam o BottomNavigationBar. Por usar o Navigator.push eu usaria a seta que aparece no AppBar para retornar essa tela inicial, abaixo um cenário para facilitar a interpretação =)

Meu app tem a HOME que tem o Título: Home e o bottom navigationBar com 3 botões (Tarefas, Lições e Calculadora). Eu clico em Tarefas, e (imagino eu) que o app sobreporia a tela Tarefas sobre a Home, em Tarefas eu tenho o seta de voltar (POP), Título: Minhas Tarefas e o Icon + (add) e NÃO teria o bottom navigation bar.

Podem me ajudar a montar esse raciocíonio? Se preferir insiro imagens e códigos. Mto obrigado e bons estudos!

2 respostas
solução!

Oi Marcelo, tudo bem?

No Flutter, quando utilizamos o Navigator.push, estamos adicionando uma nova tela à pilha de telas do aplicativo. Isso significa que, se você usar o Navigator.push para ir da Tela1 para a Tela2 e depois usar novamente o Navigator.push para voltar para a Tela1, você estará adicionando uma nova instância da Tela1 à pilha. Isso pode gerar um loop de telas e, consequentemente, um consumo desnecessário de recursos.

A melhor prática, nesse caso, seria utilizar o Navigator.pop, que remove a tela atual da pilha e retorna para a tela anterior. Isso evita a criação de novas instâncias de uma tela que já existe na pilha.

Quanto ao uso do BottomNavigationBar em conjunto com o Navigator, é possível sim. O BottomNavigationBar é apenas uma forma de navegação que pode ser utilizada em conjunto com o Navigator. Você pode definir ações para cada botão do BottomNavigationBar que realizam o Navigator.push para a tela correspondente.

Por exemplo, ao clicar no botão "Tarefas" do BottomNavigationBar, você pode fazer algo como:

onTap: () {
  Navigator.push(
    context,
    MaterialPageRoute(
      builder: (context) => TelaTarefas(),
    ),
  );
}

E na TelaTarefas, você pode ter um AppBar com um botão de voltar que realiza o Navigator.pop, retornando para a tela anterior.

Espero que isso ajude a esclarecer sua dúvida e te dê uma ideia do que fazer.

Um abraço e bons estudos.

Bom dia Lorena,

Muito obrigado pela atenção e explicação dada, eu acredito que consegui resolver essa questão com base nas suas orientações. Conforme comentei, vou contar um pouco, assim fica de histórico caso alguém venha ter essa mesma questão.

Eu inclui o Bottom Navigator Bar e fiz extamente as instruções que o professor Matheus deu na Aula 11 do Módulo 2 do Curso Flutter Aplicando Constraints Layouts Responsivos, só que como eu disse, ele abre as demais telas dentro da Home, e eu quero que ele abra sobre, ai fiz isso no meu código no BottomNavigationBarItem:

onTap: (int index) {
          Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => pages.elementAt(index),
          ),);
        },

Utilizo uma lista conforme mencionado na aula. Pelo menos no simulador funcionou, não sei pequei com as boas práticas, mas funcionou =) Obrigado mais uma vez.