<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rafaela Martins</title>
    <description>The latest articles on DEV Community by Rafaela Martins (@rrafush).</description>
    <link>https://dev.to/rrafush</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F595165%2F7fe5417a-64ee-41eb-9c07-1acde92c0128.jpeg</url>
      <title>DEV Community: Rafaela Martins</title>
      <link>https://dev.to/rrafush</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rrafush"/>
    <language>en</language>
    <item>
      <title>Entendendo o null safety</title>
      <dc:creator>Rafaela Martins</dc:creator>
      <pubDate>Tue, 12 Oct 2021 15:31:42 +0000</pubDate>
      <link>https://dev.to/rrafush/entendendo-o-null-safety-437k</link>
      <guid>https://dev.to/rrafush/entendendo-o-null-safety-437k</guid>
      <description>&lt;p&gt;Olá pra você que está chegando de paraquedas nesse artigo, ou está seguindo um link que eu provavelmente publiquei em alguma das minhas redes! Espero que esteja muito bem hidratado(a), por que nesse artigo vamos buscar entender de uma forma simplificada o null safety, que abalou muitos corações na atualização do flutter 2.0.&lt;/p&gt;

&lt;p&gt;Este é um artigo beginner friendly, então já fiquem avisados que não há o que temer e depois desse artigo espero que vocês olhem para essa feature de uma maneira mais simpática, pois ela veio para te ajudar.&lt;/p&gt;

&lt;p&gt;Antes de começarmos, sugiro que você abra o DartPad (&lt;a href="https://dartpad.dev/" rel="noopener noreferrer"&gt;https://dartpad.dev/&lt;/a&gt;) e vá testando códigos com e sem null safety pra você entender melhor e ver na prática as coisas acontecendo!&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é null
&lt;/h2&gt;

&lt;p&gt;Antes de falar propriamente sobre o null safety, precisamos primeiramente entender o conceito de null:&lt;/p&gt;

&lt;p&gt;Uma variável tem o valor null quando nenhum valor foi atribuído à ela, ou seja, é literalmente nada. Por exemplo:&lt;/p&gt;

&lt;p&gt;Se eu inicializar uma variável sem passar um valor referente à ela:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;String nome;&lt;br&gt;
print(nome);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Em um ambiente sem o null safety habilitado poderemos ver que imprimimos 'null' no console, justamente por não termos atribuído nenhum valor aquela variável.&lt;/p&gt;

&lt;p&gt;Assim, se quiséssemos tratar situações em que uma variável pode ser nula, poderíamos fazer da seguinte maneira:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc4yiscbum32iutn7eyoa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc4yiscbum32iutn7eyoa.png" alt="if(variavel == null){&amp;lt;br&amp;gt;
print('não temos um valor para essa variável');&amp;lt;br&amp;gt;
} else {&amp;lt;br&amp;gt;
print(variavel);&amp;lt;br&amp;gt;
}"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, se você for iniciante (como eu sou), você deve estar tendo alguma dificuldade em entender as implicações práticas disso, e é normal no início a gente não ter uma dimensão do que significa isso dentro de um sistema real, afinal, é só tratarmos como no exemplo acima que tá tudo certo né? Bom, na teoria sim, mas vou contar pra vocês que erros de null são os mais comuns em sistemas do mundo todo, são tão comuns que a primeira pessoa que criou o null, Tony Hoare, pediu publicamente desculpas por tê-lo criado e o chamou de "billion dollar mistake", o erro de um bilhão de dólares.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tempo de compilação vs Tempo de execução
&lt;/h2&gt;

&lt;p&gt;Até aqui conseguimos definir o que é null e entender que variáveis com valores null são a causa de um dos bugs mais comuns em programas no mundo. &lt;br&gt;
Vamos agora entender a diferença entre tempo de compilação e tempo de execução no processo de desenvolvimento de software, pois isso foi um conceito crucial para que eu entendesse a importância e praticidade que null safety traz para os nossos programas.&lt;/p&gt;

&lt;p&gt;Quando estamos escrevendo código em linguagens de alto nível, ou seja, que são mais próximas da linguagem humana e mais afastadas da linguagem de máquina (como por exemplo Java, JavaScript, Python e nosso querido Dart), necessitamos de um compilador, que é como se fosse um tradutor, um conversor que vai fazer com que a máquina o compreenda.&lt;/p&gt;

&lt;p&gt;O tempo em que estamos escrevendo esse código podemos chamar de tempo de compilação, nesse tempo o computador pode reconhecer erros de sintaxe e semântica sem que seja necessária a execução do programa.&lt;/p&gt;

&lt;p&gt;O tempo de execução é exatamente isso que o nome diz, é quando um programa entra em execução, e nesse estágio o programa consegue detectar comportamentos que durante o tempo de compilação não puderam ser previstos, podendo assim gerar erros que muitas vezes quebram o programa.&lt;/p&gt;

&lt;p&gt;Sendo assim, eu posso escrever a seguinte função para definir o nome completo de um membro da família Martins:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0pi2d9njocq9fo82q0k1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0pi2d9njocq9fo82q0k1.png" alt=" String sobrenome = 'Martins';&amp;lt;br&amp;gt;
  String nomeCompleto(String nome) {&amp;lt;br&amp;gt;
    return nome + ' ' + sobrenome;&amp;lt;br&amp;gt;
  } nomeCompleto(null)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sem o null safety esse código compilaria, causando um erro somente em tempo de execução, porém quando habilitamos o null safety, já em tempo de compilação o computador nos avisa que um parâmetro do tipo null não pode ser atribuído a um parâmetro do tipo String, isso se deve ao fato de que com o null safety por padrão as variáveis nunca podem ter um valor null, evitando assim que nosso programa quebre.&lt;/p&gt;

&lt;h2&gt;
  
  
  Null Safety
&lt;/h2&gt;

&lt;p&gt;O nome já diz: segurança null. Essa feature chegou para fazer nossos códigos mais seguros e a prova de erros, e agora vamos entender o null safety de uma maneira que a gente poderá trabalhar com ou sem ele, assim não importa se você estiver vendo um tutorial ou artigo sobre dart e flutter que foi feito antes do null safety, você saberá exatamente o que fazer para adaptar o código para as versões mais atuais do flutter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operador "?"
&lt;/h3&gt;

&lt;p&gt;Por padrão, depois do null safety, todas as variáveis nunca poderão ser nulas, ou seja, elas são "non nullable". Mas aí vocês me perguntam: "mas Rafa, como fazemos então quando a gente QUER que aquela variável seja nula pelo menos durante um determinado momento do programa?" Isso é simples, basta sinalizar com um "?" logo após a tipagem dela, dessa maneira:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5hxipfr9v4nl5h0ops6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5hxipfr9v4nl5h0ops6.png" alt="final String? nome;"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse padrão é muito utilizado na criação de classes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwk1wpifuosa0axmnjb7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwk1wpifuosa0axmnjb7.png" alt="class Pessoa{&amp;lt;br&amp;gt;
  Pessoa({required this.nome, required this.idade, &amp;lt;br&amp;gt;
  this.pet});&amp;lt;br&amp;gt;
  final String nome;&amp;lt;br&amp;gt;
  final String idade;&amp;lt;br&amp;gt;
  final String? pet;&amp;lt;br&amp;gt;
}"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Todas as pessoas tem um nome e idade, mas nem todo mundo tem um bichinho de estimação, assim eu sinalizei para o programa que o campo "pet" não é obrigatório, e coloquei a palavra reservada &lt;code&gt;required&lt;/code&gt; para dizer que os campos "nome" e "idade" são obrigatórios na criação de uma variável do tipo Pessoa.&lt;/p&gt;

&lt;p&gt;Ok, mas e se quiséssemos realizar operações com uma variável sem saber se ela é nula ou não?&lt;/p&gt;

&lt;p&gt;Se escrevêssemos o seguinte código:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F64j3e0rm52zulci9an0p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F64j3e0rm52zulci9an0p.png" alt="void main(){&amp;lt;br&amp;gt;
  int num1;&amp;lt;br&amp;gt;
  int num2 = 10;&amp;lt;br&amp;gt;
  int soma(int a, int b){&amp;lt;br&amp;gt;
   return a +b;}&amp;lt;br&amp;gt;
 print(soma(num1, num2));}"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o null safety, em tempo de compilação já saberíamos que nosso código não está seguro e conseguiríamos consertar esse erro bem facilmente mesmo a variável &lt;code&gt;num1&lt;/code&gt; podendo ser nula, da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feou9xg6bracnuicyvtb4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feou9xg6bracnuicyvtb4.png" alt="void main(){&amp;lt;br&amp;gt;
  int? num1;&amp;lt;br&amp;gt;
  int num2 = 10;&amp;lt;br&amp;gt;
  int soma(int a, int b){&amp;lt;br&amp;gt;
    return a +b;}&amp;lt;br&amp;gt;
 if(num1 != null){&amp;lt;br&amp;gt;
  print(soma(num1, num2));}}"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E por incrível que pareça o Dart vai ficar feliz com esse código sim, pois ele é bem inteligente e já sabe que a função só será executada caso a variável &lt;code&gt;num1&lt;/code&gt; não seja nula!&lt;/p&gt;

&lt;p&gt;Também podemos utilizar o operador "??" para executarmos alguma ação caso algum valor seja nulo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsunminudv11ba58ztgea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsunminudv11ba58ztgea.png" alt="int? x;&amp;lt;br&amp;gt;
 int y = x ?? 0;&amp;lt;br&amp;gt;
print(y);//0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Operador "!"
&lt;/h3&gt;

&lt;p&gt;Usamos esse operador quando temos certeza de que uma variável que pode ser nula tem um valor naquele momento do programa, permitindo assim que a gente execute funções e atribuições envolvendo aquela variável:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzj2i571zvte700b3ntlf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzj2i571zvte700b3ntlf.png" alt="  int banana = 10;&amp;lt;br&amp;gt;
  int? abacaxi;&amp;lt;br&amp;gt;
  if (banana &amp;gt; 0) {&amp;lt;br&amp;gt;
    abacaxi = 2;}&amp;lt;br&amp;gt;
  int frutas = banana + abacaxi!;&amp;lt;br&amp;gt;
  print(frutas);"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sem o "!" o Dart iria reclamar, mas esse sinal é como se a gente falasse pra ele "fica sussa fiote, eu sei o que eu estou fazendo!", e ele confia na gente fácil assim! Só cuidado pra não vacilar e ele mandar uma de "eu avisei!"...&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Você chegou até aqui?! Que maravilha, estou muito feliz e espero que você tenha conseguido compreender melhor o null safety e escrever códigos mais confiáveis e seguros!&lt;/p&gt;

&lt;p&gt;Existem várias outras situações que poderíamos nos deparar durante a criação dos nossos códigos com null safety e que eu não cobri nesse artigo, pelo fato de que iria ficar muito longo e cansativo, mas espero ter esclarecido o uso dos operadores, o porquê do null safety e como trabalhar com ele.&lt;/p&gt;

&lt;p&gt;Hoje ouvi uma pessoa muito querida dizer num podcast que programar é como um super poder, eu achei a analogia fantástica, e é como se a cada coisa nova que aprendemos, adicionamos mais algo especial nesse super poder, algo que vai fazer a diferença pra alguém em contato com a tecnologia que criamos!&lt;/p&gt;

&lt;p&gt;Vamos então salvar o dia com nossos super poderes :)&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

&lt;p&gt;*Esse artigo foi feito com muita ajuda das explicações do curso de Dart do Andrea Bizzotto na Udemy além de outras fontes diversas na internet. Pra quem entende inglês e quer um curso com explicações claras e projetinhos mão na massa, eu recomendo fortemente o curso do Andrea!&lt;/p&gt;

</description>
      <category>dart</category>
      <category>flutter</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Coloque a mão na massa o quanto antes, padawan!</title>
      <dc:creator>Rafaela Martins</dc:creator>
      <pubDate>Fri, 12 Mar 2021 18:01:38 +0000</pubDate>
      <link>https://dev.to/rrafush/coloque-a-mao-na-massa-o-quanto-antes-padawan-2f02</link>
      <guid>https://dev.to/rrafush/coloque-a-mao-na-massa-o-quanto-antes-padawan-2f02</guid>
      <description>&lt;p&gt;Sei que para nós iniciantes pode parecer assustador pegar um projeto do início ao fim para desenvolver sem uma aula guiada para nos amparar e garantir que nenhum erro aconteça, mas essa não é a realidade do mercado de trabalho. Nós temos que aprender o mais rápido possível a resolver problemas, identificar erros no código, nos perguntar "que merda eu fiz aqui?"&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5nabwb49hg1tyrdt6bl0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5nabwb49hg1tyrdt6bl0.png" alt="Alt Text" width="495" height="350"&gt;&lt;/a&gt;&lt;br&gt;
Não copie projetos pré prontos de cabo a rabo, sei muito bem que é tentador, pois estou exatamente nessa fase, sou muito nova no desenvolvimento web! Neste momento que vos escrevo, não faz nem um mês que eu comecei meus estudos, então meus queridos, saibam que eu sou uma dev neném!&lt;/p&gt;

&lt;p&gt;Acredito que não tenha problema algum você tomar como modelo de aprendizado algo pronto, pra você não ter todo o trabalho de pensar em UI, criar as imagens e tudo o mais, se esse não for seu foco. Porém, o método que eu estou seguindo e que eu acredito estar sendo extremamente eficiente é: aprender os conceitos, ver o resultado final (nem que for apenas de uma parte), pensar em como vou estruturar aquilo, tentar fazer sozinha com os conhecimentos que eu tenho e só depois ver como o instrutor resolveu os problemas e assim comparar as duas formas e ver onde eu errei ou poderia melhorar.&lt;/p&gt;

&lt;p&gt;Existem infinitos métodos de aprender a fazer alguma coisa, esse é o que mais funcionou pra mim, até porque ele me obriga a sair da minha zona de conforto... parece papo de coach, mas é real, quando temos uma referência de como queremos que fique a interface e temos que chegar naquele resultado sozinhos, é literalmente um “se vira nos 30”: vamos ter que pesquisar quando não soubermos, imaginar as estruturas por trás do projeto e botar a mão na massa, errar, entender o que está errado e aprender a consertar. Isso tudo é desesperador nas primeiras vezes, mas, pelo menos pra mim, isso passou a ser uma das melhores partes!&lt;/p&gt;

&lt;p&gt;Todos os dias eu tenho me proposto pequenos desafios de interfaces simples, uma forma de mostrar projetos em um portfólio, uma tela de login, uma animação em css diferente.. e todos os dias eu tenho aprendido várias coisas novas, e ficado cada vez mais rápida em resolver os problemas que encontro.&lt;/p&gt;

&lt;p&gt;Saber pesquisar é uma habilidade valiosa para uma pessoa desenvolvedora, então o quanto antes fizermos do sr Google nosso melhor amigo, mais rápido e independente se torna nosso aprendizado. Digo isso porque não é muito legal ficarmos totalmente dependentes do conteúdo de tal curso ou tal curso, afinal, nenhum curso vai ter todo o conteúdo que vamos precisar… pensa, é muita coisa! Cada projeto exige da gente coisas diferentes e não vai existir curso que supra absolutamente todas essas necessidades. Cursos são incríveis, mas não devem ser nosso único meio de aprendizado, errar e pesquisar também é aprender.&lt;/p&gt;

&lt;p&gt;Agora vou dar uma dica lindona aqui pra vocês: PERGUNTEM. É sério, eu costumo me sentir frustrada quando não consigo achar alguma informação que preciso ou quando implemento alguma solução que acaba não funcionando no final. O que eu preciso entender pra ontem, é que eu não estou sozinha, que eu não preciso ser a super heroína que sabe tudo e faz tudo sozinha de forma perfeita. Isso não existe, viu Rafaela?! E na comunidade de tecnologia, eu senti um acolhimento enorme com pessoas que estão começando e também um espírito colaborativo que é raro encontrar em outras áreas, faça uso disso. Lógico, tem gente chata em todo lugar, porém, no pouco tempo que estou tendo contato com isso, vi pessoas colaborarem umas com as outras, compartilharem conhecimento, compartilharem suas dores e se erguerem de uma forma que não vi em nenhum outro lugar. Então se enfiem nos grupos de desenvolvimento no telegram, no facebook, no reddit, no discord, onde for! Você não vai se arrepender e você vai entender que existem outras mil pessoas no mesmo barco que você e vocês vão construir soluções juntos.&lt;/p&gt;

&lt;p&gt;Então é isso minha gente, eu sei que eu sou falastrona para uma menina que acabou de começar a desenvolver, mas esse é meu centavinho de colaboração por agora, pra você sentir que não é só você que se sente frustrado às vezes, que não é só você que quebra todo a interface tentando fazer alguma coisa e quer arrancar os próprios cabelos… Esse é só o nosso começo de uma jornada que não deve nem ter fim, já que sempre tem tecnologias novas saindo, e a gente vai ter que estudar sempre! Acho que o importante por agora é se orgulhar de cada passo, cada linhazinha de código que você escreveu você mesmo, e querer sempre mais.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
