O Flutter é uma das tecnologias de rápido crescimento quando se trata de desenvolvimento de plataforma cruzada, e o ingrediente secreto por trás da criação de um aplicativo Flutter é a linguagem Dart.
Embora você possa começar a desenvolver um aplicativo Flutter mesmo se não estiver familiarizado com o Dart, este tutorial cobrirá a sintaxe essencial e as informações que você precisa saber para se sentir confortável ao criar um aplicativo Flutter.
O que é Dart?
Dart é uma linguagem versátil e otimizada para o cliente para aplicativos de desenvolvimento rápido em qualquer web ou plataforma móvel e pode ser usado em dispositivos desktop e embutidos. O principal objetivo da linguagem Dart é fornecer a você um conjunto de ferramentas e uma linguagem de programação que o torna produtivo e evolui conforme os requisitos e necessidades dos desenvolvedores aumentam.
Dart é uma linguagem abrangente e oferece excelentes recursos de linguagem, como Future, Stream, Sound Null Safety, etc. .
O Dart foi projetado para ser familiar à maioria dos desenvolvedores com várias experiências em programação. Portanto, não importa se você tem experiência em JavaScript e TypeScript ou se já foi um programador orientado a objetos, trabalhará com o Dart é familiar.
E, por causa da arquitetura do Dart, o recurso matador, o hot reload e a programação declarativa são possíveis no Flutter.
Mais importante, o Dart também vem com muitas bibliotecas integradas, como dart: async, dart: convert, dart: html, dart: io, etc., bem como um ecossistema fantástico e excelente gerenciador de pacotes pub.dev .
Quer você queira usar o Flutter ou não, o Dart seria uma ótima escolha para aprender e usar em seu próximo aplicativo.
Se quiser experimentar rapidamente, você pode usar dartpad.dev online.
Como usar o Dart
Antes de começar a criar um aplicativo Flutter, você deve conhecer alguns conceitos do Dart:
1. Função principal ():
O ponto de entrada de cada aplicativo é a função a main ()
. Mesmo se você quiser imprimir algo no console, você deve ter uma parte main ()
.
void main () { var list=['maçãs','bananas','laranjas']; list.forEach ((item) { print ('$ {list.indexOf (item)}: $ item'); }); }
No Flutter, você iniciará seu aplicativo a partir da função main ()
em PROJCT_ROOT/lib/main.dart
, onde você passa seu widget principal para runApp ()
que o anexará à tela. Esse é o primeiro ponto de entrada principal.
void main () { runApp (MyApp ()); }
2. :
(ponto e vírgula):
Você precisa de ;
(ponto e vírgula) no Dart, como você pode ver no exemplo acima:
runApp (MyApp ());
3. Tipos e segurança nula
Dart é uma linguagem segura de digitação. Ele usa verificação de tipo estático e verificações de tempo de execução. Quando você aprende a sintaxe, entende o código Flutter mais rápido. Aqui está a anatomia de uma variável simples:
[MODIFICADOR] [TIPO] [VARIABLE_NAME]=[VALOR];
//por exemplo: nome da string final="Majid Hajian";
Embora os tipos sejam obrigatórios, as anotações de tipo são opcionais devido à inferência de tipo. Então, você pode encontrar isto:
var name="Majid Hajian";//a partir de agora `nome` é uma String;
Os modificadores de variáveis de inicialização mais comuns no Dart são var
, final
, const
e late
, mas lembre-se de que você pode usar todos os modificadores, exceto var
, ao usar o tipo antes do nome da variável.
var name="Majid Hajian"; Nome da string="Majid Hajian"; nome da string final="Majid Hajian"; const String name="Majid Hajian";
Usar var
ou nenhum modificador cria uma variável flexível, o que significa que você pode alterar o valor a qualquer momento. Se você nunca pretende modificar a variável, você deve usar final
, que define a variável apenas uma vez, ou const
, que forma uma constante de tempo de compilação.
Mas existem situações mais complexas. Vamos dar uma olhada na definição de tipo Mapa
e Lista
:
//Tipo de lista (matriz): Lista//por exemplo: Listar nomes=['Majid','Hajian']; //Tipo de mapa (valores-chave): Mapa //por exemplo: Map age={'sara': 35,'susan: 20};
Em muitos casos, você pode não fornecer informações suficientes ao analisador Dart e pode enfrentar um erro de fundição de tipo. Vejamos um exemplo:
var nomes=[];
Os tipos de variáveis inferem que List
e dynamic
podem ser de qualquer tipo porque não fornecemos o tipo possível da matriz quando inicializamos a variável. Portanto, o Dart lança o tipo em List
onde poderia ser qualquer coisa. Ao adicionar uma anotação ao valor ao inicializar ou lançar a variável, podemos evitar esse tipo de erro.
nomes finais=<> []; //Ou Lista final <> nomes=[];
A partir do Dart 2.12, o Dart é uma linguagem segura e nula, o que significa que os tipos em seu código não são anuláveis por padrão, e isso indica que uma variável não pode conter null
a menos que você diga que podem.
final String name=null; //ou nome final da string;
Observe que a variável acima não é mais válida porque inicializamos uma variável com um valor null
. Como não especificamos isso ainda, os erros de desreferência nula de tempo de execução se transformam em erros de análise de tempo de edição.
É aqui que ?
é útil. Para atribuir a variável com o valor null
, podemos usar ?
para sua declaração de tipo.
String
final? nome=nulo;
Você verá essa sintaxe com frequência no Flutter 2.0.0+ junto com o Dart 2.12.0+.
Finalmente, os tipos integrados mais comuns no Dart que você encontrará em um aplicativo Flutter são os seguintes:
- Números (int, double)
- Strings (String)
- Booleanos (bool)
- Listas (lista, também conhecida como matrizes )
- Conjuntos (conjunto)
- Mapas (Mapa)
- Símbolos (símbolo)
- O valor nulo (nulo)
4. Aulas
Dart é uma linguagem orientada a objetos com classes e herança de base combinada. Isso significa que você pode criar tipos abstratos
, classe
, usar implementar
e extends
. Você também pode ver com
onde deseja usar um mix-in.
Em classes Dart, o nome do construtor
é igual a className
, assim:
classe MyApp { MyApp ();//construtor }
Você não precisa ter um construtor se não precisar inicializar a variável de instância ou criar um objeto. Caso seja necessário, você deve passá-los por meio de parâmetros do construtor.
classe MyApp { MyApp (this.title); String final? título; }
No Dart 2, você não precisa usar a palavra-chave new
para instanciar uma classe.
final myapp=MyApp ('Majid Hajian'); imprimir (meuaplicativo.title);
Todos os widgets em Flutter são uma classe estendida de StatelessWidget
ou StatefullWidget
. Portanto, você pode criar seu widget (classe):
class MyApp extends StatelessWidget { }
Ambos StatelessWidget
e StatefullWidget
têm o método build ()
para construir suas telas. Portanto, para implementar seus widgets a serem construídos, você deve @override
o método build ()
.
class MyApp extends StatelessWidget { @sobrepor Construção de widget (contexto BuildContext) { return Container (); } }
A convenção é iniciar className
com uma letra maiúscula.
5. Parâmetros no Dart
É fundamental aprender como você pode definir parâmetros, seja em uma classe ou em uma função, pois é uma das partes cruciais do desenvolvimento do Flutter.
- obrigatório
No Dart, se você deseja definir um parâmetro obrigatório, pode passá-lo para um construtor ou função.
String getUrl (String prefix, String host) { Retorna''; } //OU class MyApp { MyApp (this.title); String final? título; }
Em ambos os casos, você precisa passar os parâmetros corretamente para a posição esperada. Isso também é o que chamamos de parâmetros posicionais.
- opcional
Em muitas situações, você descobrirá que deseja tornar um parâmetro opcional. Por exemplo, para alterar o código acima, podemos codificar assim:
String getUrl ({String? prefix, String? host}) { Retorna''; } //OU class MyApp { MyApp ({this.title}); String final? título; }
Usamos {}
para definir nossos parâmetros opcionais que são nomeados conforme descrevemos. Agora, para usar os parâmetros nomeados, use o nome dos parâmetros e atribua o valor.
getUrl (host:'', prefixo:''); //Ou MyApp (título:'Majid');
Como você pode ver, a principal vantagem de usar essa abordagem é que você não precisa passar o valor para a posição exata do parâmetro.
Mais importante, suas funções e parâmetros de classe são autodocumentados. Em outras palavras, você pode simplesmente definir o nome do parâmetro e passar o valor. Definir parâmetros de nome é útil quando você deseja especificar muitos parâmetros para um método ou classe.
Você encontrará parâmetros nomeados no Flutter com frequência. Aqui está um exemplo do widget Texto
no Flutter:
Texto ( this.data, { Chave chave, esse estilo, this.strutStyle, this.textAlign, this.textDirection, this.locale, this.softWrap, this.overflow, this.textScaleFactor, this.maxLines, this.semanticsLabel, this.textWidthBasis, this.textHeightBehavior, })
O this.data
é posicional, o que significa que o primeiro argumento é obrigatório para passar, mas o resto dos parâmetros são opcionais, pois são definidos em {}
.
Você não pode perguntar como um parâmetro nomeado pode ser necessário em vez de opcional. No Dart 2.12+, agora você tem a palavra-chave required
que torna um argumento obrigatório para ser transmitido. Vejamos o exemplo acima.
classe MyApp { MyApp ({this.title});//parâmetro nomeado opcional String final? título; }
Mas se você usar a palavra-chave required
antes do argumento, tornaremos obrigatório transmiti-la, mesmo que seja um parâmetro nomeado.
classe MyApp { MyApp ({obrigatório this.title}); String final? título; }
Se agora você instanciar a classe MyApp ()
, você também deve passar o title
; caso contrário, o compilador gerará um erro.
print (MyApp (title:'Majid'));
6. Formatação de Dart
O Dart vem com uma ferramenta de formatação que ajuda a tornar seu código mais legível. Aqui está uma dica que o ajudará a formatar seu código muito melhor, especialmente no Flutter, onde você terá muitos widgets aninhados. Use ,
onde puder!
Coluna ( mainAxisAlignment: MainAxisAlignment.center, filhos:[ Texto ('Você pressionou o botão tantas vezes:'), Texto ('$ _ counter', estilo: Theme.of (context).textTheme.headline4), ], ),
Aqui está um widget de Coluna
que tem dois filhos Texto
. Nenhum dos filhos usa ,
onde passam argumentos. O texto é apertado e não é facilmente legível, mas se você usar ,
no final do último parâmetro em cada widget de Texto
, ele será formatado e mais amigável.
Coluna ( mainAxisAlignment: MainAxisAlignment.center, filhos:[ Texto( 'Você pressionou o botão tantas vezes:', ), Texto( '$ _counter', style: Theme.of (context).textTheme.headline4, ), ], ),
Você obterá a formatação pronta para uso gratuitamente com a ferramenta de formatação na linha de comando ou o editor de sua escolha junto com o plug-in Dart.
7. Funções
Você pode definir uma função dentro de uma classe-ou seja, métodos-ou no nível superior. Criação de uma função tão simples quanto a sintaxe abaixo.
//nível superior getMyname () { //lógica } //OU class MyClass () { getMyName () { } }
7. Async/Await
O Dart fornece programação assíncrona via Future ou Stream. Para definir um Futuro
, você pode usar a palavra-chave async
.
FuturogetUrl ({String? prefix, String? host}) async { return'd'; }
E para esperar até que o valor seja resolvido, você pode usar a palavra-chave await
.
main () async { url final=espera getUrl (prefixo:'', host:''); }
Você deve usar a palavra-chave await
envolvida em uma função/método com a palavra-chave async
.
Para criar um Stream
, você usará a palavra-chave async
. Agora, você pode se inscrever no stream e obter o valor sempre que for emitido, até cancelar a inscrição.
getUrl (prefixo:'', host:'').listen ( (Valor da string) { imprimir (valor); }, );
Observe que a função listen ()
aceita uma função, ou seja, um retorno de chamada, e como tudo é um objeto no Dart, você pode transmiti-los até mesmo em funções. Isso é comumente usado no Flutter quando eventos estão ocorrendo, como onPress
.
TextButton ( onPressed: () { //pressionado //lógica }, filho: Texto ('Enviar'), )
Compreendendo uma árvore de widgets Flutter
Agora, você deve ser capaz de ler, entender e escrever o código Flutter. Para provar isso, vamos dar um exemplo:
class MyCustomWidget extends StatelessWidget { MyCustomWidget ({this.counter}); String final? balcão; @sobrepor Construção de widget (contexto BuildContext) { Centro de retorno ( filho: coluna ( mainAxisAlignment: MainAxisAlignment.center, filhos:[ Texto( 'Você pressionou o botão tantas vezes:', ), Texto( '$ counter', style: Theme.of (context).textTheme.headline4, ), ], ), ); } }
Primeiro, você criará seu widget personalizado onde usa extends
. Em seguida, você @override
o método build ()
. Você retornará Center
, um widget predefinido do Flutter com vários parâmetros de nome, incluindo o child
onde você atribui Column
.
Coluna
tem vários parâmetros de nome onde você usa apenas mainAxisAlignment
e children
. Você terá dois widgets Texto
onde eles têm parâmetros posicionais e nomeados e assim por diante.
Você verá agora como é fácil entender este código e agora pode até escrever o seu!
Conclusão
Flutter é uma tecnologia fantástica que ajuda você a criar um aplicativo de plataforma cruzada e o Dart é sua base. O Dart é fácil de aprender quando você sabe por onde começar e o que aprender primeiro.
Neste artigo, revisamos os fundamentos mais amplamente usados no Flutter para que você possa abrir um aplicativo Flutter e não apenas entender a sintaxe inicial, mas também escrever seu código Dart.
A postagem Introdução ao uso do Dart no Flutter apareceu primeiro no LogRocket Blog .