quinta-feira, 23 de junho de 2022

Docker. O que é? Porque Utilizar?

 O que é o Docker?

 

Docker é uma plataforma open source que facilita a criação e administração de ambientes isolados. Ele possibilita o empacotamento de uma aplicação ou ambiente dentro de um container, se tornando portátil para qualquer outro host que contenha o Docker instalado.

Ele permite, criar, implantar, copiar e migrar de um ambiente para outro com muita flexibilidade.

A ideia do Docker é subir apenas uma máquina, ao invés de várias. E, nessa única máquina, você pode rodar várias aplicações sem que haja conflitos entre elas.

O Docker é algo parecido com uma máquina virtual extremamente leve, mas não se trata de uma máquina virtual. O Docker usa containers que possuem uma arquitetura diferente, permitindo maior portabilidade e eficiência. O container exclui a virtualização e muda o processo para o Docker.  

Nota: Docker é uma empresa especializada no provisionamento de um conjunto de tecnologias e ferramentas para a criação e gestão de containers. O trabalho da Docker foi tão bem sucedido que a tecnologia criada por ela acabou se tornando o mecanismo padrão no mercado para containers.

 

O que são esses containers?

Um container é um ambiente isolado utilizado para empacotar aplicações. Um container contém um conjunto de processos que são executados a partir de uma imagem, que fornece todos os arquivos necessários.

Os containers compartilham o mesmo kernel e isolam os processos da aplicação do restante do sistema.

Sua aplicabilidade serve como base para o modelo DevOps e auxilia as áreas de Operações e Desenvolvimento. No desenvolvimento, os containers empacotam aplicações com suas dependências, permitindo serem acessíveis e compartilhadas. Já em operações, são processos de aplicações rodando em um kernel compartilhado, mais simples que máquinas virtuais.

Como o container possui uma imagem que contém todas as dependências de um aplicativo, ele é portátil e consistente em todas as etapas de desenvolvimento. Essa imagem é um modelo de somente leitura que é utilizada para subir um container.

Vale lembrar que, apesar do Docker ter sido desenvolvido inicialmente com base na tecnologia LXC (Linux Containers), hoje essa tecnologia tornou-se independente de sistema operacional: podemos utilizar o Docker em ambientes Linux, Windows e até mesmo MacOS.

 

Por que utilizar o Docker?

Pelas vantagens que ele oferece como:

Economia de recursos;

Melhor disponibilidade do sistema (compartilhamento do SO e de outros componentes);

Possibilidades de compartilhamento, simplicidade de criação e alteração da infraestrutura;

Manutenção simplificada (reduzindo o esforço e o risco de problemas com as dependências do aplicativo.

 

 

Testando serviços Web API com Postman

Tem se tornado muito comum no universo do desenvolvimento de sistemas a criação de serviços sendo construída sob o modelo REST,  realizando a troca de mensagens através de requisições HTTP.

Neste cenário, os serviços HTTP não possuem interface gráfica com o usuário. Então, para testar esse tipo de aplicação você poderá utilizar o Postman, Imagine, você não precisa usar seu tempo e recursos criar uma interface gráfica para testar um serviço.

O Postman, permite realizar requisições HTTP a partir de uma interface simples e intuitiva, facilitando o teste e depuração de serviços REST.

Veja como é fácil testar um serviço ASP.NET Web API, enviando e recebendo dados no formato JSON.

 

Instalando o Postman

Ele pode ser instalado a partir da Chrome Web Store. Aqui ele será usado como um aplicativo externo ao Chrome, diferente das versões anteriores em que era aberto em uma aba como extensão. Se você desejar poderá criar uma conta e armazenar suas informações em um servidor do Postman, compartilhando assim seus testes e variáveis entre vários dispositivos onde você fizer login;

Ser usado na Web;

Ser baixado para o Windows.

 

Nota: O Postman pode ser usado para testar qualquer serviço HTTP RESTful.

Se você estiver usando o Microsoft Visual Studio, você poderá criar um novo projeto utilizando o template API Web do ASP.NET Core

Execute a aplicação e abra o Postman. Faremos uso dos verbos http para testar nossa API Web.

 

Apenas um lembrete:

GET  - listar dados

POST  - adiciona novos dados

PUT - substitui dados existentes

DELETE  - exclui dados existentes

PATCH - atualizar alguns campos de dados existentes


Para fazermos o teste, devemos adicionar o endereço de nossa aplicação, seguido de /api/ e o nome da entidade (exemplo: /api/Book)

O Postman, nos permite ver o status da operação (200, 204, ...)

No caso do POST, precisaremos fazer algumas configurações antes. Definir como Body, selecionar a opção “raw” (pois informaremos o conteúdo da mensagem) e o formato que poderá ser “JSON (application/json)”

Se você tentar inserir um novo registro com um ID que já existente, um status 409 – Conflict será retornado

 Para usar o  PUT o formato é bem semelhante as configurações anteriores. Porém se você usar um ID inexistente, um status 404 – Not Found, será retornado

O DELETE, é o mais simples adicione o id no final da URL e o ID que deseja excluir

Outra particularidade do Postman, é podermos trabalhar em equipes, customizar ambientes de teste, importar arquivos com requisições pré-definidas, entre outras.

O Postman ajuda a simplificar os testes,  pois ele nos podemos facilmente enviar requests HTTP para serviços RESTful, enviando parâmetros e recebendo as devidas respostas, além de analisar o tempo gasto em cada requisição, o que também pode auxiliar na localização de problemas de desempenho.

A ferramenta possui ampla documentação. Ele ainda conta com uma versão paga com recursos adicionais que irão ajudar aos desenvolvedores mais avançados.

quarta-feira, 15 de junho de 2022

Task - namespace System.Threading.Tasks

     Uma tarefa (task) representa uma unidade de trabalho que deverá ser realizada. Esta unidade de trabalho pode rodar em uma thread separada e é também possível iniciar uma task de forma sincronizada a qual resulta em uma espera pela thread chamada. Com tasks, você tem uma camada de abstração mas também um bom controle sobre as threads relacionadas.

    As tasks permitem muito mais flexibilidade na organização do trabalho. Por exemplo, você pode definir continuar o trabalho, que deve ser feito depois que uma tarefa esteja completa. Isso pode diferenciar se um tarefa foi executada com sucesso ou não. Você também pode organizar as tarefas em uma hierarquia onde uma tarefa pai pode criar novas tarefas filhas que pode criar dependências e assim o cancelamento da tarefa pai também cancela suas tarefas filhas.

    Para iniciar uma tarefa, você pode usar a classe TaskFactory ou o construtor da classe Task e o método Start().

    O construtor Task lhe dá mais flexibilidade na criação da tarefa. Ao iniciar uma tarefa, uma instância da classe Task pode ser criada e o código que deve ser executado pode ser atribuído com uma Action ou delegate Action<object> tanto sem parâmetro como com um parâmetro object.

    A classe Task também fornece construtores que inicializam a tarefa, mas que não a agendam para execução. Por razões de desempenho, o método StartNew da classe TaskFactory deve ser o mecanismo preferido para criação e programação de tarefas, mas, para situações em que a criação e programação devem ser separadas, os construtores podem ser usados, e o método Start() da tarefa pode então ser utilizado para programar a tarefa para execução em um momento posterior.

    O método Task.WhenAll aguarda assincronamente múltiplas operações assíncronas que são representadas através de uma coleção de tarefas. Usamos o método Task.WhenAll em um conjunto de tarefas. A aplicação de WhenAll retorna uma única tarefa que não está completa até que cada tarefa na coleção seja concluída. As tarefas parecem ser executadas em paralelo, mas não são criados novas threads.

segunda-feira, 13 de junho de 2022

IEntityTypeConfiguration

Namespace:: Microsoft.EntityFrameworkCore

Assembly:: Microsoft.EntityFrameworkCore.dll

Ele se aplica as versões: 2.0, 2.1, 2.2, 3.0, 3.1, 5.0, 6.0

 

Permite que a configuração de um tipo de entidade seja fatorada em uma classe separada, e não em linha OnModelCreating(ModelBuilder)

Implemente essa interface, aplicando a configuração para a entidade no método  Configure(EntityTypeBuilder<TEntity>) e, em seguida, aplique a configuração ao modelo usando ApplyConfiguration<TEntity> em: OnModelCreating(ModelBuilder).

O parâmetro é do tipo: TEtity (O tipo de entidade a ser configurado)

Default Column Type

 Permite definir o padrão do tipo de dados da coluna no banco de dados.


protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var property in modelBuilder
.Model
.GetEntityTypes()
.SelectMany(
e => e.GetProperties()
.Where(p => p.ClrType == typeof(string))))
{
property.Relational().ColumnType = "varchar(100)";
}
}


Para definir o tipo de dados da coluna no banco de dados necessitamos utilizar o seguinte código:

property.Relational().ColumnType = "varchar(100)";



segunda-feira, 11 de abril de 2022

SQL - VEIRFICAR SE EXISTE REGISTROS DUPLICADOS

Veja como é simples verificar se existe algum registro duplicado um tabela


SELECT [NomeArquivo], Count(*) FROM [colpo_RegistroItens]

GROUP BY [NomeArquivo]

HAVING Count(*) > 1

sexta-feira, 8 de abril de 2022

NODE JS

O Node.js é um ambiente de runtime JavaScript do lado do servidor, de software livre e multiplataforma baseado no mecanismo JavaScript V8 do Chrome, originalmente criado por Ryan Dahl e lançado em 2009. Sim, ele é uma tecnologia usada para executar código JavaScript fora do navegador.

Com ele podemos construir aplicações web em geral, desde web sites até APIs e microsserviços. Isso é possível graças a união do ambiente de execução de JavaScript fornecido pelo próprio Node.js e o motor de interpretação e execução de JavaScript presente no Google Chrome, chamado de V8.

 

O Node.js funciona no Windows?

Sim. O Windows dá suporte a dois ambientes diferentes para o desenvolvimento de aplicativos com o Node.js:

 

O que você pode fazer com o NodeJS?

O Node.js é usado principalmente para criar aplicativos Web rápidos e escalonáveis. Ele usa um modelo de E/S controlado por evento e sem bloqueio, tornando-o leve e eficiente. É uma ótima estrutura para aplicativos em tempo real que usam muitos dados e que são executados em dispositivos distribuídos. Aqui estão alguns exemplos do que você pode criar com o Node.js.

  • SPAs (aplicativos de página única) : são aplicativos Web que funcionam dentro de um navegador e não precisam recarregar uma página sempre que você usá-la para obter novos dados. Alguns exemplos de SPAs incluem aplicativos de rede social, aplicativos de mapa ou email, texto online ou ferramentas de desenho etc.

  • RTAs (aplicativos em tempo real) : são aplicativos Web que permitem aos usuários receber as informações assim que publicadas por um autor, em vez de exigir que o usuário (ou software) verifique uma fonte periodicamente em busca de atualizações. Alguns exemplos de RTAs incluem aplicativos de mensagens instantâneas ou salas de chat, jogos com vários jogadores online que podem ser reproduzidos no navegador, documentos de colaboração online, armazenamento da Comunidade, aplicativos de videoconferência etc.

  • Aplicativos de streaming de dados: são aplicativos (ou serviços) que enviam dados/conteúdo à medida que chegam (ou são criados) e ao mesmo tempo mantêm a conexão aberta para continuar baixando dados, conteúdo ou componentes adicionais, conforme necessário. Alguns exemplos incluem aplicativos de streaming de vídeo e áudio.

  • APIs REST: são as interfaces que fornecem dados para interação com o aplicativo Web de outra pessoa. Por exemplo, um serviço de API de Calendário pode fornecer datas e horas para um local de show que poderia ser usado pelo site de eventos locais de outra pessoa.

  • Aplicativos SSR (renderizados do lado do servidor): esses aplicativos Web podem ser executados no cliente (no navegador/front-end) e no servidor (o back-end), permitindo que as páginas dinâmicas exibam (gerem HTML para) qualquer conteúdo conhecido e extraiam rapidamente conteúdo não conhecido quando disponível. Eles são frequentemente chamados de aplicativos "isomórficos" ou "universais". Os SSRs utilizam métodos SPA, de modo que não precisam ser recarregados toda vez que forem usados. No entanto, os SSRs oferecem alguns benefícios que podem ou não ser importantes para você, como fazer com que o conteúdo do seu site apareça nos resultados da pesquisa do Google e fornecer uma imagem de visualização quando os links para seu aplicativo são compartilhados em mídias sociais, como o Twitter ou o Facebook. A possível desvantagem é que ele exige um servidor Node.js em constante execução. A título de exemplo, um aplicativo de rede social com suporte a eventos que os usuários desejam que apareçam nos resultados da pesquisa e em mídias sociais pode se beneficiar de SSR, mas aplicativos de email podem se beneficiar mais de SPA. Você também pode executar aplicativos não SPA renderizados pelo servidor, como um blog do WordPress. Como podemos ver, conforme as coisas vão ficando complicadas, você precisa decidir o que é importante.

  • Ferramentas da linha de comando: permitem automatizar tarefas repetitivas e, em seguida, distribuir sua ferramenta pelo vasto ecossistema Node.js. Um exemplo de ferramenta de linha de comando é cURL, que representa a URL do cliente e é usada para baixar conteúdo de uma URL da internet. A cURL geralmente é usada para instalar itens como Node.js ou, em nosso caso, um gerenciador de versão do Node.js.

  • Programação de hardware: embora não seja tão conhecido quanto os aplicativos Web, o Node.js vem crescendo em popularidade para usos de IoT, como coletar dados de sensores, sinalizadores, transmissores, motores ou qualquer item que gere grandes quantidades de dados. O Node.js pode habilitar a coleta e análise de dados, a comunicação entre um dispositivo e um servidor e a execução de ações com base na análise. O NPM contém mais de 80 pacotes para controladores Arduino, Raspberry Pi, Intel IoT Edison, vários sensores e dispositivos Bluetooth.

quarta-feira, 30 de março de 2022

O Que É SDK?

 SDK refere-se a um kit de desenvolvimento de software que permite aos desenvolvedores de software criar um aplicativo para uma plataforma ou linguagem de programação específica. Além disso, podemos defini-lo como um kit de ferramentas que possui uma coleção de APIs como um pacote que pode ser montado facilmente para desenvolver um aplicativo. No entanto, este kit varia de setor para setor, dependendo de seus requisitos específicos.

terça-feira, 22 de março de 2022

Report Viewer – Instalação no Microsoft Visual Studio 2019

Para usar o Report Viewer você irá precisar primeiro incorporar na IDE do Visual Studio o tipo de arquivo RDLC, o qual é responsáveis pela extensão do relatório. 


Depois, você terá que  adicionar as referências do Report Viewer, para criar relatórios do tipo Web e/ou Desktop. Para finalizar inserir na “Caixa de Ferramentas” todos os componentes do gerador de relatório.

1. Localize o item de menu Extensões/Gerenciar Extensões e pesquise por rdlc.

Instale o Microsoft RDLC Report Designer. Depois reinicie o Visual Studio. Quando abrir  Clique no botão “Modify”. 


2. Instalar as referências menu Ferramentas/Gerenciador de Pacotes do Nuget/Gerenciar pacotes do Nuget para a Solução... e na caixa de pesquisa por reportviewercontrol.

 

Verifique se elas foram instaladas:

Microsoft.ReportViewer.Commom
Microsoft.ReportViewer.Design
Microsoft.ReportViewer.WinForms

4. Adicionar os componentes na Caixa de Ferramentas. Localize a guia Geral, clique com o  botão direito e selecione Escolher Itens ..., selecione  a guia  Componentes do .NET Framework e no botão Procurar.

 

Navegue até a pasta raiz do seu projeto e abra o diretório Packages (este diretório contém todos os pacotes instalados da sua aplicação). Abra o diretório:

 

Microsoft.ReportingServices.ReportViewerControl.Winforms.150.1400.0\lib\net40

Em seguida selecione  a DLL Microsoft.ReportViewer.WinForms.dll” e clique em abrir.


Se desejar você pode escolher ou criar uma nova guia.
Agora é só usar. Espero poder ter ajudado

 

 

 

domingo, 6 de março de 2022

Multiverso

Multiverso, podemos dizer que é um termo usado para descrever o conjunto hipotético de universos possíveis, incluindo o universo em que vivemos. 

Juntos, esses universos compreendem tudo o que existe: a totalidade do espaço, do tempo, da matéria, da energia e das leis e constantes físicas que os descrevem. É geralmente usado em enredos de ficção científica, mas também é uma extrapolação possível de algumas teorias científicas para descrever um grupo de universos que estão relacionados, conhecidos como universos paralelos

A ideia de que o universo que se pode observar é só uma parte da realidade física deu luz à definição do conceito "multiverso".

Em 1952, Edwin Schrödinger deu uma palestra, em Dublin, onde avisou com entusiasmo a audiência que o que estava prestes a enunciar o que a princípio  poderia parecer algo "lunático".  Ele disse que, quando as equações que lhe renderam o prêmio Nobel pareciam descrever várias histórias diferentes, estas não eram "alternativas, mas que tudo realmente acontece simultaneamente". Esta é a primeira referência conhecida ao multiverso.

De forma simples podemos dizer, que o multiverso é a última fronteira da fantástica aventura da ciência na investigação das maiores escalas do cosmos, surfando nas ondas da relatividade.

quarta-feira, 23 de fevereiro de 2022

O que é uma API?

API refere-se à Interface de programação de aplicativos que atua como uma ferramenta intermediária que permite que dois aplicativos se comuniquem. A implementação dessas APIs simplifica o desenvolvimento de aplicativos economizando dinheiro e tempo. As APIs fornecem flexibilidade e simplificam o design para uma abordagem inovadora da tecnologia.


As Interfaces de Programação de Aplicações (APIs) são uma espécie de ponte que viabiliza a comunicação eficiente de sistemas que possuem linguagens diferentes. Essa integração permite uma melhor transição de dados, fornecendo como maiores benefícios a segurança e a organização das informações.


As APIs são ótimas ferramentas e devem ser usadas pelas mais variadas empresas e prestadores, principalmente em razão da constante necessidade de transitar informações. Por meio dessas interfaces, é possível indicar os dados específicos que um terceiro poderá acessar outro sistema, tornando assim, esse intercâmbio mais seguro e assertivo.

DART - Tipo de dados

Em Dart todos os tipos são objetos. Isso nos permite ter acesso a um grande conjunto de funções para processamento de dados, mesmo em objetos de tipos mais básicos, fornecidos pelo ambiente de execução do Dart. Esses tipos são:

Number

Dart oferece três tipos para armazenar valores numéricos. 

int, utilizado para o armazenamento de qualquer número inteiro, seja ele negativo ou positivo. 

double, que é utilizado para o armazenamento de números de pontos flutuantes. 

Ambos, int e double, são subtipos de num. Ao declarar uma variável como num ela pode ser tanto um inteiro quanto um número de ponto flutuante:

num pi = 3;

pi = 3.14;

Se declarar uma variável como um inteiro, ela não poderá receber um decimal. Vejamos:

int pi = 3;

pi = 3.14;

Error: A value of type 'double' can't be assigned to a variable of type 'int'.

Quando encontramos um número ou texto no código, como no exemplo acima, esse valor é chamado literal. 

Um literal é um valor que não precisa de avaliação por parte do compilador para ser atribuído a uma variável. Assim sendo, o compilador cria uma instância de num adequada a esse valor. Naturalmente, o mesmo também ocorrerá com o resultado de uma expressão.

Além disso, o tipo numint e double também fornecem diversos métodos e propriedades que podem ser utilizados para a transformação e checagem de dados. Eles também dispõem de capacidades para expressões utilizando os operadores + (adição)- (subtração)* (multiplicação)/ (divisão) e outros. 


Métodos para operações matemáticas:

Método

Descrição

abs()

Retorna o valor absoluto do número.

ceil()

Retorna o último inteiro imediatamente superior.

ceilToDouble()

Retorna o último número imediatamente superior com o tipo double.

clamp(num limiteInferior, num limiteSuperior)

Se o número estiver dentro do limite, retorna o número. Se não, retorna o limite o qual ele extrapolou.

compareTo(num outro)

Compara com outro número, retornando 1 quando forem diferentes e 0 quando forem iguais.

floor()

Arredonda o número para o inteiro anterior.

floorToDouble()

Arredonda o número para o número inteiro anterior no tipo double.

remainder(num outro)

Retorna a sobra da divisão com outro número.

round()

Arredonda o número para o inteiro mais próximo.

roundToDouble()

Arredonda o número para o valor inteiro mais próximo no tipo double.

toDouble()

Converte o número para Double.

toInt()

Converte o número para Int.

toString()

Converte o número em uma String.

toStringAsExponential([int digitos])

Converte para string com exponencial.

toStringAsFixed(int decimais)

Converte para String contendo N casas decimais.

toStringAsPrecision(int digitos)

Converte para String contendo N dígitos.

truncate()

Retira as casas decimais, retornando um inteiro.

truncateToDouble()

Retira as casas decimais, retornando um double.

Propriedades que permitem realizarmos checagens de valores:

isFinite (retorna true quando o número for finito)

isInfinite (retorna true quando o número for infinito) 

isNegative (retorna true quando o número for negativo)

double euler = 0.5772156649;

print(euler.isFinite); // true

print(euler.isInfinite); // false

print(euler.isNegative); // false

String

Strings são cadeias de caracteres que podemos representar com aspas duplas ou aspas simples.:

String nome_usuario = "Ton";

String sobrenome_usuario = 'Fontes';

print(nome_usuario); // Ton

print(sobrenome_usuario); // Fontes

Esse objeto String fornece diversos atributos e métodos para a verificação e transformação de cadeias de caracteres, tais como:

toUpperCase, que transforma os caracteres do texto em maiúsculas

toLowerCase, que transforma todos os caracteres em letras minúsculas

trim, que remove os espaços vazios do início e fim do texto, e muitos outros. 


Podemos juntar duas strings através da concatenação ou através da interpolação. 

String nome = "Ton";
String sobrenome = "Fontes"; int idade = 22; // Concatenação de duas Strings String nome_completo = nome+" "+sobrenome; //Interpolação com String e valor do tipo inteiro. String mensagem = "O usuário $nome_completo possui $idade anos de idade."; print(mensagem); // O usuário Ton
Fontes possui 22 anos de idade.

Diferentemente do Java, por exemplo, que necessitamos utilizar o método equals para realizar a comparação de duas Strings, no Dart podemos compará-las utilizando o operador de igualdade ==.:

String nome_usuario_1 = "Ton";
String nome_usuario_2 = "Ton";
if(nome_usuario_1 == nome_usuario_2) { print("Ambos os usuários possuem o mesmo nome."); }

Boolean

O Dart utilizao tipo bool que pode ser representado por dois valores: true (verdadeiro) e false (falso). 

Quando utilizamos propriedades de checagem vistas anteriormente, como isFiniteisInfinite e isNegative por exemplo, o valor retornado por estas é do tipo bool.

O Dart fornece diversos operadores de comparação com resultados booleanos. Podemos, inclusive, checar por tipos durante a execução do software:

Operador

Descrição

>=

Maior ou igual

>

Maior

<=

Menor ou igual

<

Menor

is

É do mesmo tipo

is!

Não é do mesmo tipo

==

Igual

!=

Diferente

&&

E lógico (AND)

||

OU lógico (OR)

Exemplo:

String papel = "ADMIN";

bool esta_logado = true;

String nome_usuario = "Ton";
if(papel == "ADMIN" && esta_logado) { print("O usuário $nome_usuario é um Admin e está logado."); }

dynamic

Neste tipo podemos atribuir valores de todos os outros tipos, e até mesmo modificar esses valores em tempo de execução:

dynamic nome = "Ton Fontes";
dynamic idade = 22; print(nome); // Ton Fontes print(idade); // 22 idade = "22 anos"; print(idade); // 22 anos

Function

Uma função é um trecho de código, um processo ou rotina, responsável pela execução de uma tarefa específica, podendo ser executado múltiplas vezes durante a execução do programa. 

No Dart, funções são um tipo de dado e podemos tratá-las como qualquer outro dado: podemos passá-las como parâmetro, atribuir a variáveis e mais.

Uma função pode receber parâmetros (dados necessários para sua execução) e retornar outros valores gerados a partir de um processamento qualquer. 

  • Porém, nenhum dos dois é obrigatório: 
    • uma função pode não precisar de parâmetros e não retornar nada. Por exemplo:

exibirMensagemDeErro(){

print("Falhou!!!");

}

No trecho de código anterior nós declaramos nossa função, mas esta não irá executar de imediato. Para que esta seja executada, precisamos explicitamente ordenar a execução:

exibirMensagemDeErro(); 

Funções também podem ter seu retorno tipado. Se a mesma não tiver retorno, podemos tipá-la como void:

void exibirMensagemDeErro(){

print("Desculpa, encontramos um erro.");

}

Para recebermos parâmetros declararmos cada uma das variáveis que a função pode receber, e seus tipos, dentro dos parênteses:

void exibirNomeECargo(String nome, String cargo) {

print("Nome: $nome ; Cargo: $cargo");

}

exibirNomeECargo("Ton Fontes", "Desenvolvedor"); // Nome: Ton Fontes; Cargo: Desenvolvedor

O exemplo acima utiliza passagem de parâmetros. Cuidado para não alterar a ordem de passagem dos parâmetros, pois irá influenciar a execução da função. 

Outra coisa, precisa passar todos os parâmetros, pois se não for passado na execução da função, isto irá gerar um erro.

Porám, no Dart é possível definir parâmetros opcionais posicionais e nomeados, mas não ambos.


Parâmetro Opcional Posicional

Para definir parâmetros opcionais posicionais, devemos agrupar esses parâmetros entre colchetes.

NOTA: Parâmetros opcionais posicionais precisam ser declarados após os parâmetros obrigatórios:

void exibirNomeECargo(String nome, [String cargo]) {

if(cargo != null) {

print("Nome: $nome ; Cargo: $cargo");

} else {

print("Nome: $nome ;");

}

}

exibirNomeECargo("Ton", "Desenvolvedor"); // Nome: Ton ; Cargo: Desenvolvedor

exibirNomeECargo("Ton"); // Nome: Ton;

Para declarar valores padrões para os parâmetros opicionais, é bem simplesão:

void exibirNomeECargo(String nome, [String cargo = "Web Master"]) {

print("Nome: $nome ; Cargo: $cargo");

}

exibirNomeECargo("Ton Fontes", "Desenvolvedor"); // Nome: Ton Fontes; Cargo: Desenvolvedor
exibirNomeECargo("Ton Fontes
"); // Nome: Ton Fontes ; Cargo: Desconhecido

Parâmetro Opcional Nomeado

Nesse caso, no momento em que executamos a função, precisamos conhecer os nomes dos parâmetros que serão recebidos, não sua posição.

Da mesma forma que parâmetros opcionais posicionais, os parâmetros nomeados também precisam ser declarados após a declaração dos parâmetros obrigatórios. Contudo, neste caso,  utilizamos chaves na declaração:

void exibirNomeECargo(String nome, {String cargo}) {

if(cargo != null) {

print("Nome: $nome ; Cargo: $cargo");

} else {

print("Nome: $nome ;");

}

}

exibirNomeECargo("Ton Fontes", cargo: "Desenvolvedor"); // Nome: Ton Fontes ; Cargo: Desenvolvedor
exibirNomeECargo("Ton Fontes
"); // Nome: Ton Fontes;

Se você precisar  retornar valores de uma função utilize a palavra reservada return, que retorna o valor gerado e interrompe a execução da função. 

String gerarMsgNomeECargo(String nome, String cargo) {

return "Nome: $nome ; Cargo: $cargo";

}

print(gerarMsgNomeECargo("Ton", "Desenvolvedor")); // Nome: Ton ; Cargo: Desenvolvedor

No Dart, podemos tratar uma função como qualquer outro valor. Podemos, por exemplo, atribuir uma função a uma variável e passá-la como parâmetro para outra função, que executará essa variável:

Function printarErro = (String erro) {

print("Falha: $erro");

};

void checarIgualdade(String valor1, String valor2, Function callback) {

if(valor1 != valor2){

callback("Os valores são diferentes");

}

}

checarIgualdade("Ton", "Ton", printarErro); // Não printa nada
checarIgualdade("Ton
", "Fontes", printarErro); // Encontramos um erro: Os valores são diferentes

Também como funções que executam apenas um comando

exibirMsg(String msg) => print(msg);

exibirMsg("Essa é minha menssagem."); // Essa é minha menssagem.

List

Quando necessitamos trabalhar com arrays (estrutura de dados que armazena valores identificado por um index), 

Podemos criar uma lista: 

  • através da criação de uma instância do List 
  • Utilizando uma lista literal.:

// Criando instância do List

var lista_usuarios = List(); // Também poderia ser new List()

// Usando o método add do objeto para adicionar novos valores a lista

lista_usuarios.add("Ton");

lista_usuarios.add("Matheus");

lista_usuarios.add("Felipe");

// Lista literal

var lista_usuarios_literal = ["Ton", "Matheus", "Felipe"];

Os exemplos anteriores são iguais em seu resultado:

print(lista_usuarios[0]); // Ton

print(lista_usuarios[1]); // Matheus

print(lista_usuarios[2]); // Felipe

print(lista_usuarios_literal[0]); // Ton

print(lista_usuarios_literal[1]); // Matheus

print(lista_usuarios_literal[2]); // Felipe

Note que utilizamos [número] após a variável para recuperar os valores. Esse número, chamamos de index, o qual é a posição dos valores na lista (que começa em 0).

Nota: No Dart, um List é um genérico. Isto é: passamos o tipo do dado que o mesmo irá armazenar como parâmetro.

O Objeto List nos fornece diversos métodos e propriedades que facilitam a interação, manipulação e a análise de arrays. 


  • Percorrer a lista, temos o método forEach
  • Para modificar os dados da lista, temos o método map
  • Para filtrar, temos método where
  • Para contar o número de valores, temos  o atributo length

List lista_numeros = List();

lista_numeros.add(1);

lista_numeros.add(2);

lista_numeros.add(3);

lista_numeros.add(4);

lista_numeros.add(5);

lista_numeros.forEach((numero) {

print("Número: $numero");

});


// Resultado

// Número: 1
// Número: 2
// Número: 3
// Número: 4
// Número: 5

O método forEach,  irá iterar o array e executar a função de callback uma vez para cada valor. 

Também, podemos combinar diversos métodos para gerar diferentes resultados:

lista_numeros.map((numero) {

return numero * 10;

}).toList().forEach((numero) {

print("Número: $numero");

});


// Resultado

// Número: 10
// Número: 20
// Número: 30
// Número: 40
// Número: 50

Assim, o método map irá modificar cada um dos valores da List e, ao final do processo, exibimos o valor de cada um dos números na tela com o método forEach


Podemos utilizar o atributo length para saber a quantidade de valores em uma List

print("Quantidade de valores: ${lista_numeros.length}"); // Quantidade de valores: 5

Também, podemositerar um array, utilizando for

for(int index = 0; index < lista_numeros.length; index++) {

print("Linha ${lista_numeros[index]}");

}

Map

Map é uma estrutura similar à uma List. Porám, diferente da List (possui  um index (tipo inteiro), um Map cada valor terá uma chave (que pode ser um objeto qualquer) correspondente. 

Portanto, tanto List, como Map pode ser criado através de uma instância ou de forma literal.

NOTA: se criarmos um Map de forma literal, a chave só pode ser do tipo String

var nome_sobrenome = {

'Ton': 'Fontes',

'Matheus': 'Silva',

'Felipe': 'Freitas',

};


print(nome_sobrenome['Ton']); // Fontes

print(nome_sobrenome['Matheus']); // Silva

print(nome_sobrenome['Felipe']); // Freitas

Se criarmos uma instância, qualquer objeto pode ser utilizado como chave:

var chave_valor = Map();

chave_valor[10] = 'Valor 1';

chave_valor[true] = 'Valor 2';

chave_valor["Chave"] = 'Valor 3';

print(chave_valor[10]); // Valor 1

print(chave_valor[true]); // Valor 2

print(chave_valor["Chave"]); // Valor 3