Alura > Cursos de Mobile > Cursos de Flutter > Conteúdos de Flutter > Primeiras aulas do curso Dart: sintaxe, coleções e dinamismo

Dart: sintaxe, coleções e dinamismo

Entendendo Sintaxe - Apresentação

Olá. Seja muito bem-vinda e bem-vindo ao curso de Dart: Sintaxe, coleções, dinamismo e encapsulamento. Meu nome é Ricarth Lima, sou instrutor da Alura e vou ser o seu instrutor durante esse curso. Por uma questão de acessibilidade, vou me autodescrever.

Sou um homem, tenho pele parda, tenho cabelo bem cacheado passando para o crespo, tenho sobrancelhas largas, uso óculos com armação escura, tenho um grande nariz e uso uma barba em tamanho mediano. Na maioria do curso vou usar essa camisa de cor cinza, mas também usarei uma camisa de cor azul bem escuro.

Durante esse curso, veremos os seguintes assuntos. Primeiro começando com sintaxe. O que é sintaxe para as linguagens de programação e o que isso afeta no próprio Dart. Logo na sequência vamos falar sobre algumas ferramentas que tornam o nosso código mais legível e mais fácil de dar manutenção. São elas as enums e os switches.

Logo depois vamos falar de coleções, sendo elas os sets. Vamos falar sobre os Iterables, que é a classe abstrata que rege tanto os sets, quanto as listas, os lists. Por fim, vamos falar de um tipo de coleção que é bem importante, que são os Maps. Na sequência, vamos falar sobre dinamismo e sobre como o Dart lida com as suas variáveis, os seus dados.

Então vamos falar da diferença entre Dynamic e Var. Vamos falar o que é uma variável estática contra o que é uma variável dinâmica, e vamos generalizar para não só o Dart, e sim o conceito de linguagem de programação estática e dinâmica. Por fim, falaremos do tema de encapsulamento que é muito importante quando queremos tornar a entrada e saída de dados de nossas classes cada vez mais controladas.

Então vamos falar o que é encapsulamento, vamos refatorar o código para usá-lo e falar sobre o que são os getters e os setters. Para seguir com todos esses temas, o nosso projeto vai ser baseado em uma aplicação criada pela Dandara, personagem que temos na nossa formação Dart. E ela vai fazer uma aplicação para gerenciar viagens. Vamos olhar isso no código.

Dentre as funcionalidades que aplicaremos, faremos algumas funções para que consigamos consultar e adicionar os locais visitados em uma viagem. Usaremos esses conceitos também para fazer uma forma de escolher o meio de transporte que será usado nessa viagem.

É bem importante comentar que, apesar de não ser estritamente necessário, é bem recomendável que você tenha feito os cursos anteriores de Dart. Ou seja, o curso de Dart: Introdução e principalmente o curso de Orientação a Objeto com Dart, pois vamos supor que você tenha esses conhecimentos. Te vejo no curso. Até lá.

Entendendo Sintaxe - Entendendo a sintaxe

Ao chegar nesse curso de Dart, é bem importante que você já tenha alguma base de Dart. Seja porque já mexeu com Dart por curiosidade, seja porque já programa em Flutter e quer aprender mais sobre Dart para melhorar no Flutter, ou porque você já fez os cursos anteriores a esse em Dart. Mas como já sabemos uma base, vamos pegar o que já aprendemos na prática e entender os conceitos por trás.

Isso vai tornar a nossa programação muito mais precisa, muito mais consistente. E nesse vídeo vamos falar sobre sintaxe e semântica, principalmente sintaxe no Dart e em geral. Primeiro vamos analisar a seguinte frase: e "Dandara. não é" estudiosa é preguiçosa. Essa frase não faz muito sentido. Tentei lê-la da melhor forma possível, você pode ler, e ela não faz nenhum sentido. Ela não quer dizer nada.

Não sabemos se está falando de Dandara, se é outra pessoa que está falando por causa das aspas, se é a própria Dandara que está falando, se ela é estudiosa, se ela é preguiçosa, se ela é, se ela não é. Não faz tanto sentido. Vamos olhar agora essa segunda frase. "Dandara é estudiosa e não é preguiçosa". Foi bem mais fácil de entender essa frase.

E agora realmente ficou mais tranquilo. Qual é a diferença entre as essas duas frases? É a sintaxe. Vamos analisar de novo: 'e "Dandara. não é" estudiosa é preguiçosa' está em uma ordem que não sentido nenhum. Na Língua Portuguesa, convencionamos uma ordem para as palavras aparecerem. Quando elas aparecem nessa ordem, como na frase de baixo, que está em verde, tudo faz sentido, conseguimos compreender o que quer ser dito.

No caso, que Dandara é estudiosa e que não é preguiçosa. Se usarmos as mesmas palavras e até os mesmos caracteres e eles não seguem a ordem que definimos, isso não vai fazer sentido e não vamos entender o que a frase queria dizer. Essa é a diferença. E essas normas vem justamente do que chamamos de sintaxe, algo que existe tanto nas linguagens naturais, quanto nas linguagens de programação.

Afinal, o que é sintaxe? Na gramática, é o estudo das palavras, suas relações e ordem. Então é pegar cada categoria de palavra e entender como elas vão aparecer, como elas vão ser posicionadas para que tenhamos uma comunicação que todo mundo que fale aquela linguagem entenda. E na programação? Conversamos que temos que ter uma base de Dart.

Então você já deve saber como mostrar algo na tela no Dart, e sabemos que não é dessa forma. Essa forma poderia até ser em outra linguagem, uma forma de mostrar algo na tela, mas sabemos que no Dart isso não faz sentido nenhum. Por exemplo, essa String Eu gosto da Mulher Maravilha => print não é sequer uma String no Dart porque não tem as aspas.

Essa flecha, esse arrow, não quer dizer nada com nada porque não usamos esse tipo de sintaxe para isso no Dart. E o print também não quer dizer que é a função print que estamos acostumados. Então como seria isso no Dart? Agora sim, print(“Eu gosto da Mulher Maravilha”);. Print, que é o nome da função, os parênteses para delimitar os argumentos que a função vai receber e as aspas para dizer que um dos argumentos vai ser uma String e a String que queremos passar.

Finalizando no ponto e vírgula que mostramos que aquela linha acabou. Então a primeira linha não segue a sintaxe do Dart. Se rodássemos em Dart ia dar erro. Já a segunda linha segue perfeitamente a sintaxe do Dart e funciona muito bem. Então o que é sintaxe na programação? É um conjunto de normas que coordena e estruturam a construção das variáveis, funções, classes e etc.

Ou seja, tudo o que quisermos construir, tudo o que quisermos fazer com a linguagem precisa seguir a sintaxe, tanto para que o computador entenda o que queremos dizer, quanto para que outras pessoas programadoras que vão ler o nosso código também entendam. Para resumir, o que é sintaxe? Essas normas ditam como a lógica deve ser escrita, em que ordem devem ser escritas. Essa questão da ordem é bem importante, e quais são as palavras-chave.

O que queremos dizer com palavras-chave? Você deve lembrar do Dart, por exemplo, que tem algumas palavras que já vem da linguagem. Não podemos usar. Alguns exemplos, import, class, if, else, while, double, string. Todas essas palavras já vêm da linguagem e não podemos usá-las, porque elas são palavras-chave que vão ser determinante para que o programa, para que o computador entenda o que queremos falar.

No caso, para deixar bem claro, não é que não possamos usá-las. Nós usamos, mas não podemos criar nossas próprias funções, nossas próprias classes usando elas. São palavras que chamamos de termos restritos da linguagem. Então, para deixar bem claro, usamos elas com a sintaxe para criar nossos códigos, mas não podemos criar uma função ou uma variável usando esses nomes. Essas são as palavras-chave.

A ordem é justamente o que conversamos. É seguir uma ordem que faça sentido para o computador que vai ler as nossas instruções e definir a lógica das operações que queremos executar. E a tal da semântica, que sempre acompanha a sintaxe? Vamos dar uma pincelada, porque pode ter batido a curiosidade. Sempre falamos sintaxe e semântica. O que seria, de fato, semântica?

Você já ouviu essa: Uma pessoa falou para a outra, "Vá ao mercado e traga um litro de leite, se houve ovos, traga seis". Um tempo depois a pessoa chega do mercado com seis litros de leite. A pessoa que pediu pergunta, "O que houve" e ele diz, "Tinha ovos". É engraçada essa piada. É uma piada de computação. Não é a das mais engraçadas do mundo, mas ela serve para entendermos que essa frase é interpretativa.

Ou seja, vão ter interpretações diferentes para uma mesma frase. "Vá no mercado e traga um litro de leite e se houver ovos traga seis", pode ser interpretada da forma mais padrão, que normalmente interpretaríamos, e a graça da piada como, "Traga um litro de leite só e seis ovos", nos referíamos aos ovos como seis. Então seis ovos.

A forma como a pessoa interpretou, que na piada quer dizer que é uma forma mais computacional, digamos assim. Esse "Se houver ovos" está como se fosse um if, então, na piada a pessoa trouxe seis litros de leite. Isso tudo é porque semântica é sobre interpretação, "Vá no mercado e traga um litro de leite, se houver ovos, traga seis" pode ser baseado como a graça da piada, ser um problema de semântica.

Um problema de interpretação. E é por isso que as linguagens de programação não devem ser ambíguas. Aprendemos que, quando vamos escrever um algoritmo, ele é uma sequência de passos ordenados e não ambíguos, porque o computador não vai saber interpretar se você quer trazer seis ovos ou seis litros de leite. Você tem que deixar isso claro.

Por isso que as linguagens de programação elas não são ambíguas. Agora que aprendemos semântica e sintaxe, no seu conceito e no conceito de programação, vamos ver como isso se comporta no Dart? Te espero lá.

Entendendo Sintaxe - Entendendo sintaxe no Dart

No vídeo anterior, aprendemos o que é sintaxe no tanto na Língua Portuguesa, nas linguagens, quanto nas linguagens de programação, e pincelamos o conceito de semântica. Agora vamos focar na sintaxe do Dart. Como falamos no vídeo anterior, seria bem interessante que você chegasse nesse curso com alguma base de Dart.

Seja porque você já mexe com Dart, seja porque você já fez os outros cursos. Se você tem essa base, então vamos fazer alguns exercícios para exercitar esse conceito de semântica com o que você já sabe. Vamos lá. Vamos jogar um jogo. Como vai funcionar? Digo o que eu esperava que um código fizesse. Por exemplo, mostrar na tela "Eu gosto da Mulher Maravilha".

Depois vou dar três opções, uma certa, uma com erro de sintaxe e outra que está certa de sintaxe, ou seja, que rodaria em Dart, mas que não faz o que se pede. Vamos começar. Mostrar na tela "Eu gosto da Mulher Maravilha". Vou dar sempre esses cinco segundos para vocês depois de mostrar as opções e se você quiser você pausa o vídeo. Vamos lá.

Cinco, quatro, três, dois, um. Se quiser, pause o vídeo. Mas essa é bem fácil. Essa primeira, print("Eu gosto da Mulher Maravilha");, está certa. Por que ela está certa? Já aprendemos que o print é uma função. E como é uma função ela possui um nome pelo qual vamos chamar essa função e chamamos ela usando parênteses para passar alguns argumentos.

No caso do print, ele pode receber todo tipo de objeto como argumento. No nosso caso, queremos que ele receba uma String que sabemos que é uma String, e o programa também sabe que é uma String, por causa das aspas e dentro dessa String tem "Eu gosto da Mulher Maravilha". Termina com ponto e vírgula para delimitar a linha de código. E pronto, temos uma linha perfeitamente escrita em Dart.

Já a linha abaixo tem um erro de sintaxe. Claro, existem infinitos erros de sintaxe, porque qualquer outra forma que você escreva que fuja da sintaxe da linguagem, é um erro de sintaxe. Qual é o problema que está acontecendo nessa forma? Não estamos delimitando a String com aspas. Então o Dart não vai entender o que é isso. Não vai entender o que objeto é esse "Eu".

Ele vai tentar ler de objeto em objeto e vai tentar ver o que é esse "Eu". Não existe um objeto chamado "Eu". E outra, ele está recebendo vários parâmetros, mas não estão separados por vírgulas. Quando queremos passar vários parâmetros, separamos por vírgula. E por aí vai. Poderia explicar vários problemas que tem só nessa forma de escrever, porque ela não segue a sintaxe do Dart.

Mas o erro mesmo, digamos assim, se tivesse um problema de escrita, de digitação, seria a falta das aspas. Então esse código não funciona em Dart. Por último tem esse código que está com a sintaxe correta, mas não faz o que pedimos: print("Eu gosto do Super Homem");. Pedi que mostrasse na tela, "Eu gosto da Mulher Maravilha", e não "do Super Homem". Isso é um exemplo muito simples, mas que acontece muito em códigos mais complexos.

Imagine códigos que tenha vários loops, várias condições, que tenha entradas externas que você não controla. Então depois de passar por aquilo tudo, pode ter um resultado que não se espera. Então é bom começarmos a ter essa visão. É o que vamos ver nesse curso. Próxima.

Declarar uma variável double inicializada com 20.17. O número é fracionário. Então temos essa primeira opção ano:double = double 20.17;, essa segunda opção double ano = 2017; e a terceira opção double ano = 20.17;. Vou dar cinco segundos. Se você quiser você pausa o vídeo. Vamos lá. Cinco, quatro, três, dois, um. Essa primeira opção realmente não faz sentido nenhum em Dart.

Se você tentar pensar a respeito, poderia até ser a sintaxe de alguma linguagem mesmo. Na verdade, essa forma não é, mas lembra o Kotlin. Você vê que poderia ser a variável ano e que usamos os dois pontos para definir o tipo que está sendo inicializado, ou seja, com esse igual. A variável ano que tem os dois pontos para definir um tipo que está sendo inicializado por alguma coisa, no caso é 20.17, que é do tipo double.

Faria sentido, mas essa não é a sintaxe do Dart. Então se você joga isso em Dart, vai dar erro, porque não segue a sintaxe. Já nessa segunda tem o double para definir qual é o tipo da variável, tem o ano que é o nome da variável, tem a atribuição e depois o valor que é aceitável no double, ou seja, 2017 é aceitável no double. O double aceita esse tipo de valor. Se você colocasse, por exemplo, uma String, aí não aceitaria e seria um problema de sintaxe.

Esse código não tem problema de sintaxe, mas ele não faz o que pedimos. Pedimos para ele armazenar 20.17 e não 2017, então temos um erro de que ele não faz o que queremos. Por fim, temos a forma correta. O tipo, o nome da variável, o símbolo de atribuição, o valor que condiz com o tipo e o ponto e vírgula. Isso tudo do jeito que pedimos, do jeito que esperávamos.

Só mais uma. Vamos lá. Quero uma função que multiplica dois números e devolve esse resultado. Vou mostrar três opções e vou dar os cinco segundos para vocês. Se quiserem pausem o vídeo. Cinco, quatro, três, dois, um. Vamos lá. Vamos estudar direito. Primeiro, todas essas funções, os parâmetros delas, o que está entre os parênteses não estão passando algum tipo.

Então a e b não estão tendo o tipo definido. Mas sabemos que alguma dessas funções faz exatamente o que queremos no Dart. Isso não é mais um problema. Todas elas têm o tipo de retorno bem definido, ela devolve o double. Até aí tudo bem. E todas elas têm também os parênteses para delimitar os parâmetros, a virgula para separar cada um dos parâmetros e as chaves para delimitar o escopo, o espaço onde vamos digitar o código dessa função.

Então todas em Dart usam bem a sintaxe de função. Construímos boas funções. Então os problemas vão estar nas linhas. Vamos analisar primeiro a primeira. A primeira pega a vezes b e coloca, sabemos que esse símbolo de asterisco faz parte da sintaxe do Dart quando temos dois objetos numéricos, seja inteiro, seja double e queremos multiplicá-los. Então usamos o asterisco.

Pegamos isso e atribuímos, com o símbolo de atribuição, na variável que estamos criando agora chamada result que é resultado em inglês, que é do tipo double. Até aqui está perfeito, faz todo o sentido. Qual é o problema dessa primeira função? É que em vez de ela devolver esse result, que teria o resultado, ele devolve a. Digamos, colocamos 2 vezes 4 e ela devolve 2.

Ela não faz o que pedimos. A sintaxe está perfeita, mas ela não faz o que pedimos. Portanto, tem um erro aí. Já a segunda é perfeita, simples e direta. Ela tem o return para devolver, tem a vezes b para fazer essa multiplicação com o asterisco. Então ela está perfeita. Vamos para a última. Qual será o problema da última? Sabemos que o problema não está na construção da função. Então deve estar nas linhas.

A primeira linha funciona. Apesar de ela ser meio estranha porque fazemos uma operação de multiplicação, mas não anota e nem mostra esse resultado em lugar nenhum. Isso não está em um print, isso não está sendo registrado em uma variável. Então, passada dessa linha, simplesmente se perde. Dá para fazer isso em Dart, não gera um erro, mas não cria situação alguma.

Já essa próxima linha que é um return com dois pontos gera um problema sim porque informamos que a função esperava um retorno do tipo double e aqui não está sendo devolvido isso. Então aqui temos um erro de sintaxe. Não vai funcionar. O que concluímos disso tudo? Temos sintaxe para tudo no Dart. Tudo tem uma sintaxe. Tudo o que você quiser fazer já tem uma sintaxe bem definida.

Variáveis, declaração de variáveis com os tipos ou com os modificadores, as condicionais, o if, o else, o else if, os vários tipos de loops que tem no Dart, todos eles vão ter uma delimitação, a forma que eles vão iterar, as funções, que vimos no exemplo como estruturamos e o código dentro delas. As classes que lembram as funções, mas como você pode ter visto no curso de orientação a objeto, tem toda uma estrutura para criarmos uma classe da forma correta.

E coisas que não vimos ainda, mas que existem no Dart, como coleções, erros, exceções e por aí vai. Tudo tem sintaxe e muito mais, é claro. Onde recorrer quando você tiver dúvidas de sintaxe? É bem importante falar sobre isso. A documentação de Dart é muito rica, é muito bem escrita. Então é bem legal que você tenha ela sempre em mãos. Estamos avançando. Esse já se torna um curso um pouco mais avançado de Dart. Então é bem legal que incentivemos você a consultar a documentação.

Deixa eu entrar nela só para mostrar. O Language tour do Dart vai ser onde você vai começar para aprender a sintaxe de tudo. Você vai ver que no lado direito em “Contents” vai ter de tudo, Numbers, Strings, Maps, Lists, Variáveis, Funções, Operadores, Controle de fluxo, Exceções, Classes. Está tudo aí, tudo para você estudar diretamente com todos os detalhes da documentação.

E se o Language tour não lhe der todos os detalhes, ele vai ter um link que vai dar todos os detalhes. "Não entendo inglês, não é algo que eu gosto muito". Primeiramente, fica o recado: acostume-se. Atualmente a língua inglesa é universal para falarmos de programação, então é bem interessante que você tenha uma base para, pelo menos, conseguir ler em inglês. É claro que sempre temos a opção de ir no navegador, clicar com o botão direito e traduzir para o português.

Recomendo só em um momento de muito desespero, porque às vezes vai traduzir o que não devia. Ele vai traduzir uma palavra-chave, vai traduzir um pedaço de código, não é legal. Se você tiver com muita dificuldade, você pode usar o "Traduzir", mas recomendo que tente, use, vá traduzindo de palavra em palavra, talvez usando o Google Tradutor para entender mais o inglês falado na programação.

É bem importante o Language tour, vai estar na parte textual do vídeo. O novo nos aguarda. Agora que temos essa base bem legal de sintaxe, podemos aprender mais coisas com o Dart. Te vejo lá.

Sobre o curso Dart: sintaxe, coleções e dinamismo

O curso Dart: sintaxe, coleções e dinamismo possui 140 minutos de vídeos, em um total de 46 atividades. Gostou? Conheça nossos outros cursos de Flutter em Mobile, ou leia nossos artigos de Mobile.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Flutter acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas