Flet: NavigationRail

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.

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 label_typedeve=none.

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 -1.0 e 1.0. Os valores de group_alignment significam: -1,0: os itens serão alinhados na parte superior do espaço disponĩvel; 0.0 itens alinhados no centro; 1.0itens alinhados em baixo. Default= -1.0.

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 é None (nenhum rótulo é exibido).

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 é 72. Este valor também define a largura mínima e a altura mínima dos destinos. Para criar um NavigationRailDestination compacto, defina min_width=56 junto com label_type=None.

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 extended=True.

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 NavigationRail.label_type=NavigationRailLabelType.NONE, o rótulo ainda é usado por questões semânticas e pode ser usado se NavigationRail.extended=True.

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.

Figura 2

Leave a Reply

Your email address will not be published. Required fields are marked *