Flutter 
- Trabalhando com abas (Tab bars)
    
    
    ![]()  | 
    Neste artigo veremos como trabalhar com guias/abas ou Tab bars em uma aplicação Flutter. | 
     
	  | 
  
O Flutter é um SDK de aplicativo móvel do Google que ajuda a criar aplicativos móveis modernos para iOS e Android usando uma única (quase) base de código.
Se você não conhece o Flutter veja o meu artigo : Flutter - Primeiros contatos e impressões
Apresentando Tab-bar
Trabalhar com 
guias é um padrão comum em aplicativos que seguem as diretrizes do 
Material 
Design. O Flutter inclui uma maneira conveniente de criar layouts de guias como 
parte da biblioteca do material.
Neste artigo vamos mostrar um exemplo prático com guias cumprindo as etapas a 
seguir :
Para que as guias funcionem, você precisa manter a guia selecionada e as seções de conteúdo em sincronia. Este é o trabalho do TabController.
Para criar um TabController manualmente ou automaticamente usamos o widget DefaultTabController.
O widget
DefaultTabController é um widget herdado que é 
usado para compartilhar um TabController com um TabBar 
ou um TabBarView. Ele é usado quando o 
compartilhamento de um TabController criado 
explicitamente não é conveniente porque os widgets da barra de guias são criados 
por um widget pai sem estado ou por widgets pais diferentes.
Usar DefaultTabController é a opção mais simples, 
pois cria um TabController e o torna disponível 
para todos os widgets descendentes.
		DefaultTabController(
  length: 3,
  child: 
);
		 | 
		
		Ao definir um 
		DefaultTabController usamos os argumentos:
  | 
	
Vejamos um exemplo prático.
Criando o projeto Flutter
No Visual Studio Code tecle CTRL+ SHIFT+P para abrir a paleta de comandos e a seguir selecione a opção : Fluter:New Project;
A seguir informe o nome do projeto : flutter_circleimage e tecle ENTER;
A seguir inclua o código abaixo no arquivo main.dart para criar o leiaute padrão usando os Widgets MaterialApp e Scaffold :
		import 'package:flutter/material.dart';
		void main() => runApp(MyApp());
		class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: Text("AppBar com guias"))
      ),
    );
  }
}
		 | 
		
		![]()  | 
	
Vamos definir o código envolvendo o widget Scaffold por um widget DefaultTabController com duas guias :
		import 'package:flutter/material.dart';
		void main() => runApp(MyApp());
		class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: DefaultTabController(
          length: 2,
          child: Scaffold(
          appBar: AppBar(
            title: Text("AppBar com guias"),
            bottom: TabBar(
              tabs: <Widget>[
                Text("Primeira Guia"),
                Text("Segunda Guia"),
              ],
             )
            )
        ),
      ),
    );
  }
}
		 | 
		
		![]()  | 
	
Neste código envolvemos o Scaffold pelo DefaultTabController que agora envolve tudo dentro do MaterialApp.
Na propriedade bottom definimos um TabBar com duas guias onde usamos o widget Text.
Podemos também exibir ícones ao invés de texto:
		import 'package:flutter/material.dart';
		void main() => runApp(MyApp());
		class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: DefaultTabController(
          length: 2,
          child: Scaffold(
          appBar: AppBar(
            title: Text("AppBar com guias"),
            bottom: TabBar(
            tabs: <Widget>[
               Tab(icon : Icon(Icons.android)),
               Tab(icon : Icon(Icons.cloud_download))
            ],
             )
            )
        ),
      ),
    );
  }
}
		 | 
		
		![]()  | 
	
Agora definimos duas Tabs com um ícone cada uma.
As
Tabs não teriam nenhum sentido, a menos que 
adicionemos algumas ações a ela. No entanto, percebemos que as ações relativas à 
seleção de uma guia se refletem no body do
Scaffold. E este mapeamento é feito pelo
DefaultTabController. No entanto, precisamos 
fornecer um widget no body chamado
TabBarView, que pode levar vários widgets filhos.
Por padrão, a sequência de declaração do widget filho será mapeada 
automaticamente para as guias, ou seja, o primeiro widget será chamado 
para a primeira guia, o segundo widget será chamado para a 
segunda guia e assim por diante.
Dessa forma cada existe uma correspondência entre o conteúdo de cada TabBar e do TabBarView.
		import 'package:flutter/material.dart';
		void main() => runApp(MyApp());
		class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: DefaultTabController(
          length: 2,
          child: Scaffold(
          appBar: AppBar(
            title: Text("AppBar com guias"),
            bottom: TabBar(
              tabs: <Widget>[
               Tab(icon : Icon(Icons.android)),
               Tab(icon : Icon(Icons.cloud_download))
              ],
             )
            ),
            body: TabBarView(
              children: <Widget>[
                Text("Primeira guia selecionada"),
                Text("Segunda guia selecionada")
              ],
            ),
        ),
      ),
    );
  }
}
		 | 
		
		![]()  | 
	
Para concluir, e mostrar a correspondência entre a TabBar e a TabBarView, vamos criar 3 guias com ícones e definir a navegação usando 3 Containeres com cor e texto para perceber o sincronismo do mapeamento:
		import 'package:flutter/material.dart';
		void main() {
  runApp(TabBarDemo());
}
		class TabBarDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DefaultTabController(
        length: 3,
        child: Scaffold(
          appBar: AppBar(
            bottom: TabBar(
              tabs: [
                Tab(icon: Icon(Icons.directions_car)),
                Tab(icon: Icon(Icons.directions_transit)),
                Tab(icon: Icon(Icons.directions_bike)),
              ],
            ),
            title: Text('Tabs Demo'),
          ),
          body: TabBarView(
            children: [
                new Container(
              color: Colors.deepOrangeAccent,
              child: new Center(
                child: new Text(
                  "Primeira Guia",
                  style: TextStyle(),
                ),
              ),
            ),
            new Container(
              color: Colors.blueGrey,
              child: new Center(
                child: new Text(
                  "Segunda guia",
                  style: TextStyle(),
                ),
              ),
            ),
            new Container(
              color: Colors.teal,
              child: new Center(
                child: new Text(
                  "Terceira guia",
                  style: TextStyle(),
                ),
              ),
            ), 
           ],
          ),
        ),
      ),
    );
  }
}
		 | 
		
		![]()  | 
	
Pegue o 
projeto dos arquivos aqui:  
 
main_tabbar.dart
							
Louvai ao Deus dos deuses; porque a sua benignidade dura para sempre.
Louvai ao Senhor dos senhores; porque a sua benignidade dura para sempre."
Salmos 136:1-3
| 
	
    
    Veja os 
    Destaques e novidades do SUPER DVD Visual Basic 
(sempre atualizado) : clique e confira ! 
 Quer migrar para o VB .NET ? 
 Quer aprender C# ?? 
 Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?  | 
  
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
Flutter - Lista Básica - Macoratti
Flutter - Apresentando o widget MaterialApp - Macoratti
Flutter - Apresentando Flutter Studio - Macoratti
Flutter - Apresentando Widgets - Macoratti
Flutter - Criando uma tela de login - Macoratti