Por que resolvi escrever este post
Eai galera DEV, tudo certo?
Vim aqui publicar mais um post pra poder estar contribuindo para nossa comunidade dev e adquirindo conhecimento.
Nessa semana eu tive que fazer um Snackbar para o meu app de TCC e eu não sabia como poderia ser feito. Na verdade eu não sabia nem o nome do widget, então eu fui pesquisando por “barrinha de alerta mobile” até que encontrei o nome que era utilizado. Depois disso eu fui até a documentação do framework e aprendi como ele funciona, também pesquisei no Design Material suas boas práticas de uso. Vale muito a pena dedicar seu tempo para ler, os links estão no final do post.
Não achei muita coisa em português e para mim não foi algo tão simples de utilizar, mas depois que eu percorri por vários posts, vídeos e documentação eu consegui entender. Então resolvi juntar tudo em um lugar o que eu aprendi.
Separei alguns pontos que considero mais fundamentais e importantes na hora de programar.
Entenda seu uso
O Snackbar é utilizado para informar ao usuário um processo que foi executado ou irá ser executado. Ele tem que aparecer temporariamente na parte inferior da tela para que não atrapalhe o uso do aplicativo.
Ele tem basicamente três princípios:
- Informativo: Fornece atualização do processo
- Temporário: Ele aparece temporariamente e desaparece por conta própria
- Contextual: É colocado na área mais adequada da interface.
Anatomia
- Etiqueta de texto
- Recipiente
- Ação (opcional)
Comportamento
O Snackbar aparece por tempo determinado e depois é fechado sozinho, mas cuidado ao realizar muitas chamadas. Ele tem que aparecer um de cada vez, não deixa fazer uma pilha de Snackbar.
Não altere o comportamento dos elementos da tela para mostrar seu Snackbar, isso pode ser uma péssima experiência para o usuário.
Colocação
O Snackbar deve ficar na na parte inferior da interface do aplicativo, mas tem que ter cuidado com o lugar. Ele não pode cobrir a barra de navegação.
Snackbar que abrange toda a largura eu diria que é o mais importante a ter cuidado para o uso, pois até mesmo na documentação do Flutter eles mostram a explicação do snackbar desta maneira.
Então isso quer dizer que não podemos usar esse modo que abrange toda a largura da interface?
Não!
Pode ser utilizado, mas temos que tomar muito cuidado ao utilizá-lo. Como o exemplo anterior é bem retratado, ele pode cobrir barra de navegação.
Uma boa prática de uso de um snackbar.
Mão na massa!
Para utilizar o snackbar é bem simples, basta chamar a função showSnackBar passando o snackbar por parâmetro.
Desta maneira:
class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Code Sample for Scaffold.of.', theme: ThemeData( primarySwatch: Colors.blue, ), home: Scaffold( body: MyScaffoldBody(), appBar: AppBar(title: Text('Scaffold.of Example')), ), color: Colors.white, ); } } class MyScaffoldBody extends StatelessWidget { @override Widget build(BuildContext context) { return Center( child: RaisedButton( child: Text('SHOW A SNACKBAR'), onPressed: () { Scaffold.of(context).showSnackBar( SnackBar( content: Text('Have a snack!'), ), ); }, ), ); } }
Mas como na vida nem tudo são rosas, você tem que ficar ligado que o ShowSnackbar é filho do Scaffold. E se você não usar um BuildContext diferente do pai do Scaffold pode dar ruim.
Snackbar Global
A maneira anterior de chamar o snackbar é para uma tela atual somente, isso quer dizer que se você fizer uma mudança de página não irá aparece-lo. Mas tem uma maneira de deixar ele global.
Passo 1
Colocar um Scaffold dentro do builder do seu MaterialApp.
class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), builder: (context, child) { return Scaffold( key: GlobalScaffold.instance.scafoldKey, body: child, ); }, initialRoute: '/', routes: { '/': (_) => MyHomePage(title: 'Flutter Demo snackbar global'), '/second': (_) => SecondPage(title: 'Segunda página') }, ); } }
Passo 2
Criar uma classe para fazer criar um Scaffold global.
class GlobalScaffold { static final GlobalScaffold instance = GlobalScaffold(); final scafoldKey = GlobalKey<ScaffoldState>(); void showSnackbar(SnackBar snackBar) { scafoldKey.currentState.showSnackBar(snackBar); } }
Passo 3
Criar a função responsável para invocar o snackbar.
void onClickSnackbarGlobal() { final snackbar = SnackBar( behavior: SnackBarBehavior.floating, elevation: 150.0, content: Text("Eu sou um Snackbar Global!")); GlobalScaffold.instance.showSnackbar(snackbar); }
Passa 4
Por último é somente chamar a função no seu widget
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: ListView( padding: EdgeInsets.all(20), children: [ RaisedButton( child: Text('Ir para segunda página'), onPressed: () { Navigator.pushNamed(context, "/second"); }), RaisedButton( child: Text('Mostrar Sanackbar Global'), onPressed: () => onClickSnackbarGlobal(), ) ], ), ); }
Resultado:
Conclusão
Espero que tenha ajudado, qualquer dúvida ou sugestão pode comentar que será de grande ajuda. Valeu!
Links úteis:
Material Design
Documentação do Flutter
Video do canal Flutter explicando o snackbar
Aula do canal Flutterando
Post no stackoverflow
Top comments (2)
Obrigado pela dica
Muito bom tutorial mano. Fica com Deus!