
NavigationRail
NavigationRail é um controle de navegação que pode ser exibido ao lado (direito ou esquerdo) de um controle principal, servindo como um menu de escolha entre algumas poucas opções.
Exemplo básico
O exemplo abaixo mostra um aplicativo com uma linha (ft.Row) contendo uma ft.NavigationRail, uma linha divisória e uma coluna com um único texto. A ft.NavigationRail, por sua vêz, contém um texto inicial, 3 controles ft.NavigationRailDestination e um texto final.
import flet as ft
def main(page: ft.Page):
page.bgcolor=ft.Colors.GREY_400
page.add(
ft.Row([
ft.NavigationRail(
leading=ft.Text("Início"),
destinations=[
ft.NavigationRailDestination(icon=ft.Icons.WOMAN, label="Mulher"),
ft.NavigationRailDestination(icon=ft.Icons.MAN, label="Homem"),
ft.NavigationRailDestination(icon=ft.Icons.CHILD_FRIENDLY, label="Criança")
],
trailing=ft.Text("Final")
),
ft.VerticalDivider(width=1),
ft.Column([ ft.Text("Texto\ndo\nAplicativo!")])],
expand=True
)
)
ft.app(main)
O resultado da execução desse código está mostrado na figura 1.

Para fazer com que o NavigationRail apareça à direita vasta inverter a ordem de inserção dos objetos inseridos na linha ft.Row.
Propriedades de NavigationRail
| Propriedade | Descrição |
|---|---|
| bgcolor | a cor do Container com o conteúdo do NavigationRail. |
| destinations | define os itens de botão que são dispostos no NavigationRail. O valor é uma lista de 2 ou mais instâncias de NavigationRailDestination. |
| elevation | o tamanho da sombra abaixo do NavigationRail. O default é 0.0. |
| extended | Booleano com default False. Indica se NavigationRail deve ser estendido para ocupar o espaço disponível na página. No estado estendido o controle apresenta um padding lateral mais largo e os rótulos ficam ao lado dos ícones. Caso contrário esses rótulos ficam abaixo dos ícones e o container é mais estreito.
A propriadade min_extended_width é usada para definir a largura mínima do container quando estendido. No estado estendido deve-se definir |
| group_alignment | o alinhamento vertical para a lista de destinos dentro do container. Os controles filhos NavigationRailDestinations ficam dispostos entre os widgets postos em leading (no início da lista) e trailing (no fim da lista).
O valor deve ser um float entre |
| indicator_color | cor dos indicadores do NavigationRail. |
| indicator_shape | formato dos indicadores do NavigationRail. O valor é do tipo OutlinedBorder e o default é StadiumBorder(). |
| label_type | layout e o comportamento dos rótulos (labels) dentro do NavigationRail no estado default e não estendido. Os rótulos são sempre exibidos quando o controle está estendido.
O valor é do tipo NavigationRailLabelType e o default é |
| leading | um controle opcional colocado acima dos destinos no controle principal. Sua localização não é afetada por group_alignment.
O controle em leading geralmente é um FloatingActionButton, mas pode ser outro controle que não um botão, como uma imagem de um logotipo, por exemplo. |
| min_extended_width | a largura final quando a animação estiver concluída quando se ajusta extended=True. O default é 256. |
| min_width | a menor largura possível para o controle, independentemente dos tamanhos dos ícones ou rótulos dos destinos.
O default é |
| selected_index | índice selecionado na lista do NavigationRailDestination. Se selected_index=None nenhum destino é selecionado. |
| selected_label_text_style | o estilo TextStyle do rótulo de um destino selecionado. Quando o destino não está selecionado o estilo em unselected_label_text_style será usado. |
| trailing | Um controle opcional no NavigationRail, exibido abaixo dos destinos. Sua localização é afetada por group_alignment.
Pode ser usada uma lista de opções ou destinos adicionais que apenas é renderizada quando |
| unselected_label_text_style | o estilo TextStyle do rótulo de destino não selecionado. Quando o destino está selecionado o estilo em selected_label_text_style será usado. |
Evento de NavigationRail
| Evento | Descrição |
|---|---|
| on_change | dispara quando o destino selecionado é alterado. |
NavigationRailDestination
Propriedades
| Propriedades | Descrição |
|---|---|
| icon | ícone a exibir no destino.
# pode receber o ícone diretamente: icon=ft.Icons.CHILD_FRIENDLY # ou um controle flet.Icon icon=ft.Icon(ft.Icons.CHILD_FRIENDLY) Se selected_icon for fornecido, esse ícone só é exibido quando o destino não estiver selecionado†. |
| icon_content | idêntico à propriedade icon. Esse controle está obsoleto e será removido. Use icon. |
| indicator_color | cor do indicator_shape (descrito abaixo) quando o destino é selecionado. |
| indicator_shape | formato do indicador de seleção. O valor é uma instância da OutlinedBorderclasse. |
| label | string mostrada no rótulo do destino. Só é exibida se label_content (descrito abaixo) não é fornecido. |
| label_content | um controle usado como rótulo do destino. Se fornecido, label será ignorado.
O label deve ser fornecido no NavigationRail. Se for declarado |
| padding | espaço interno para o item de destino. O valor é uma instância da classe Padding. |
| selected_icon | nome do ícone ou controle alternativo exibido quando o destino é selecionado.
# usando o nome do ícone: selected_icon=ft.Icons.BOOKMARK # uso com controle: selected_icon=ft.Icon(ft.Icons.BOOKMARK) Se não for fornecido, o NavigationRail exibe icon em qualquer dos estados. |
| selected_icon_content | ícone alternativo quando o destino é selecionado. Obsoleto, use selected_icon. |
Nota: † Procure escolher ícones diferentes para estados diferentes, como ícones de traço e preenchidos para tornar o NavigationRail mais legível, como ft.Icons.CLOUD e ft.Icons.CLOUD_QUEUE. Ícones iniciais (icon) devem ser definidos para a versão com traço e selected_icon para a versão preenchida.
Exemplo de uso do NavigationRail
import flet as ft
def main(page: ft.Page):
page.bgcolor=ft.Colors.GREY_400
page.window.width=500
page.window.height=400
cidade=["Manaus", "Recife", "Olinda"]
destinos=[
ft.NavigationRailDestination(
icon=ft.Icons.LOCATION_CITY,
selected_icon=ft.Icons.AIRPLANE_TICKET,
label=cidade[0],
),
ft.NavigationRailDestination(
icon=ft.Icon(ft.Icons.random()),
selected_icon=ft.Icon(ft.Icons.AIRPLANE_TICKET_SHARP),
label=cidade[1],
),
ft.NavigationRailDestination(
icon=ft.Icons.LOCATION_HISTORY_SHARP,
selected_icon=ft.Icon(ft.Icons.AIRPLANE_TICKET_OUTLINED),
label=cidade[2],
),
]
def getBotao(i):
return ft.FloatingActionButton(
foreground_color=ft.Colors.YELLOW,
bgcolor=ft.Colors.BLUE_300,
icon=ft.Icons.NEW_LABEL if i==0 else ft.Icons.DELETE,
on_click=nova_rota if i==0 else apagar,
text="Nova Seleção" if i==0 else "Apagar Tudo",
)
def seleciona(e):
texto_corpo.value+=f"\nDestino Selecionado: {cidade[e.control.selected_index]}"
texto_corpo.update()
def nova_rota(e):
texto_corpo.value+=f"\n\nSelecione Nova Rota:\n{'-'*26}\n"
texto_corpo.update()
def apagar(e):
texto_corpo.value=f"Selecione a sua rota:\n{'-'*26}\n"
texto_corpo.update()
rail = ft.NavigationRail(
bgcolor=ft.Colors.BLUE,
selected_index=0,
label_type=ft.NavigationRailLabelType.ALL,
min_width=180,
min_extended_width=400,
leading=getBotao(0),
trailing=getBotao(1),
group_alignment=0.0,
destinations=destinos,
on_change=seleciona,
extended=False
)
texto_corpo=ft.Text(f"Selecione a sua rota:\n{'-'*26}\n", color=ft.Colors.INDIGO_900, size=16)
espaco_direita=ft.Container(
content=texto_corpo,
padding = ft.padding.all(15),
border=ft.border.all(3, ft.Colors.BLUE_600),
alignment=ft.alignment.top_left,
bgcolor=ft.Colors.GREY_50,
expand=True
)
page.add(ft.Row([rail, ft.VerticalDivider(width=2), espaco_direita,], expand=True,))
ft.app(main)
O resultado da execução desse código está mostrado na figura 2.

