<?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: Gustavo Alba</title>
    <description>The latest articles on DEV Community by Gustavo Alba (@alba22).</description>
    <link>https://dev.to/alba22</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%2F286626%2Feac8aed2-405f-40b3-93a9-c43252e5f53d.png</url>
      <title>DEV Community: Gustavo Alba</title>
      <link>https://dev.to/alba22</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alba22"/>
    <language>en</language>
    <item>
      <title>Abordagens para uso de Variáveis de Ambiente no Flutter</title>
      <dc:creator>Gustavo Alba</dc:creator>
      <pubDate>Sat, 03 Sep 2022 16:43:35 +0000</pubDate>
      <link>https://dev.to/alba22/abordagens-para-uso-de-variaveis-de-ambiente-no-flutter-4kl5</link>
      <guid>https://dev.to/alba22/abordagens-para-uso-de-variaveis-de-ambiente-no-flutter-4kl5</guid>
      <description>&lt;p&gt;Para aplicações que estão em produção, é essencial o uso de variáveis de ambiente para que se possa trocar entre os vários ambientes(produção, desenvolvimento, stagging) de forma mais fácil.&lt;/p&gt;

&lt;p&gt;Porém, existem algumas formas de se fazer isso. E algumas delas podem não ser tão boas assim, induzindo desenvolvedores à erros na hora de trabalhar com as variáveis, ou podem até mesmo expor dados sigilosos da sua aplicação.&lt;/p&gt;

&lt;p&gt;Nesse artigo, veremos alguns modos de se fazer o controle das variáveis de ambiente e qual o mais indicado para você utilizar numa aplicação que vai ser enviada para produção.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OBS: leia todo o artigo antes de fazer qualquer tipo de implementação.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Um exemplo
&lt;/h2&gt;

&lt;p&gt;Dando um exemplo prático de pode acontecer com muitos no início do aprendizado de Flutter: consumo de um backend por meio de uma API Rest. &lt;/p&gt;

&lt;p&gt;Para fazer esse consumo será necessário fazer uma requisição HTTP para essa API a partir de uma URL. E ai que está o ponto, onde guardar essa URL?&lt;/p&gt;

&lt;p&gt;A primeira opção que muitos pensariam seria guardar a URL em uma variável em um arquivo qualquer(como por exemplo &lt;code&gt;constants.dart&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;Porém, fazendo dessa forma, quando for preciso gerar uma versão pra mandar pra produção(para as lojas), vai ser necessário &lt;strong&gt;lembrar&lt;/strong&gt; de alterar esse valor pra URL de produção. O que vai resultar em você ter um arquivo semelhante a isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;baseURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://prod.minhaapi.com"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// String baseURL = "https://dev.minhaapi.com";&lt;/span&gt;
&lt;span class="c1"&gt;// String baseURL = "https://192.168.1.100";&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em que você fica comentando as URLs possíveis para enquanto está desenvolvendo e para quando for mandar pras lojas.&lt;/p&gt;

&lt;p&gt;Com isso, fica óbvio que &lt;strong&gt;em algum momento&lt;/strong&gt; você vai esquecer de alterar essa variável e vai mandar uma versão do app apontando pra API de desenvolvimento para as lojas. O que é um enorme problema, pois seus usuários não vão nem ter conta no ambiente de desenvolvimento e, portanto, não conseguirão utilizar o app.&lt;/p&gt;

&lt;p&gt;Usando variáveis de ambiente como no exemplo anterior temos outro problema: exposição desses valores. &lt;/p&gt;

&lt;p&gt;No caso da URL de uma API Rest, não é tão problemático ela ficar exposta no código. Porém há casos que cada ambiente precisa ter um valor sigiloso pra o funcionamento do app, como credenciais de um banco de dados local, API Key de algum serviço externo, etc.&lt;/p&gt;

&lt;p&gt;Desse modo, se alguém conseguisse ter acesso ao seu código fonte, poderia facilmente obter esses valores sigilosos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problemas
&lt;/h2&gt;

&lt;p&gt;Com o exemplo apresentado, temos então &lt;strong&gt;2&lt;/strong&gt; principais problemas a resolver:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Não ter que lembrar de alterar as variáveis de ambiente&lt;/li&gt;
&lt;li&gt;Não deixar as variáveis de ambiente expostas internamente e externamente&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Utilizando .env
&lt;/h2&gt;

&lt;p&gt;Uma abordagem bem comum no backend é utilizar um arquivo &lt;code&gt;.env&lt;/code&gt; que vai guardar as variáveis de ambiente. Essa abordagem pode ser feita no Flutter também por meio do package &lt;a href="https://pub.dev/packages/flutter_dotenv"&gt;&lt;code&gt;flutter_dotenv&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Com ele pode-se criar um arquivo &lt;code&gt;.env&lt;/code&gt; no seu projeto para armazenar as variáveis de ambiente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BASE_URL=https://dev.minhaapi.com
API_KEY=b8f91e93-2460-4cd6-b746-d7ff121bf57b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E a obtenção dos valores podem ser feitos da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fileName:&lt;/span&gt; &lt;span class="s"&gt;".env"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Porém com isso, só mudamos as variáveis do arquivo &lt;code&gt;constants.dart&lt;/code&gt; para &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O que podemos fazer é criar um arquivo &lt;code&gt;.env&lt;/code&gt; para cada ambiente e utilizar o recurso de target da CLI do Flutter para buildar o projeto. Assim, podemos criar 2 arquivos: &lt;code&gt;.env-prod&lt;/code&gt; e &lt;code&gt;.env-dev&lt;/code&gt; e criar 2 arquivos main para buildar nosso app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// arquivo main.dart&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fileName:&lt;/span&gt; &lt;span class="s"&gt;".env-dev"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// arquivo main_prod.dart&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fileName:&lt;/span&gt; &lt;span class="s"&gt;".env-prod"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na hora de buildar, basta rodarmos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// Para rodar em dev
flutter run &lt;span class="nt"&gt;-t&lt;/span&gt; lib/main.dart
// Para rodar em prod
flutter run &lt;span class="nt"&gt;-t&lt;/span&gt; lib/main_prod.dart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, resolvemos o primeiro problema de ter que lembrar de trocar todas as variáveis de ambiente quando formos lançar o app pra produção. Porém, com essa abordagem ainda temos o segundo problema: exposição de dados. Já que as variáveis de todos os ambientes ainda estão disponíveis no código. &lt;/p&gt;

&lt;p&gt;Além disso, surge um outro grande problema com a utilização desse package que muitos nem sequer sabem. No processo de configuração do &lt;code&gt;flutter_dotenv&lt;/code&gt; é pedido que o &lt;code&gt;.env&lt;/code&gt; seja colocado como um asset no &lt;code&gt;pubspec.yaml&lt;/code&gt;. E é aí onde mora o perigo.&lt;/p&gt;

&lt;p&gt;Todo e qualquer arquivo que for incluido como um asset no &lt;code&gt;pubspec.yaml&lt;/code&gt; está exposto no android. Se alguém mal intencionado baixar seu app, ele pode facilmente extrair o APK(existem site e apps que fazem isso). E ao extrair o APK, todos os assets podem ser visualizados, incluindo o &lt;code&gt;.env&lt;/code&gt;. Caso você tenha alguma variável sigilosa no &lt;code&gt;.env&lt;/code&gt;, ela está literalmente disponível pra qualquer um que baixe o app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Utilizando Dart Define
&lt;/h2&gt;

&lt;p&gt;Com o Flutter 1.17, foi incluida um novo argumento na linha de comando chamado &lt;code&gt;dart-define&lt;/code&gt;, que nos permite passar variáveis de ambiente de uma forma muito melhor.&lt;/p&gt;

&lt;p&gt;Para utilizar essa feature, basta especificar o nome da variável e seu valor como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter run --dart-define=BASE_URL=https://dev.minhaapi.com --dart-define=API_KEY=b8f91e93-2460-4cd6-b746-d7ff121bf57b
flutter build apk --dart-define=BASE_URL=https://dev.minhaapi.com --dart-define=API_KEY=b8f91e93-2460-4cd6-b746-d7ff121bf57b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E para utilizar esses valores no seu código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;baseURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromEnvironment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromEnvironment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"API_KEY"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E pronto! Com isso, suas variáveis não ficarão expostas nem no código e nem na aplicação final(APK).&lt;/p&gt;

&lt;p&gt;Desse modo, ainda é fácil de se colocar o projeto em alguma ferramenta de CI/CD, já que basta passar as variáveis de ambiente pela linha de comando mesmo.&lt;/p&gt;

&lt;p&gt;Pode-se ver que o comando pra rodar(e buildar) o app fica bem grande. Porém há formas resolver isso para que você não tenha que ficar copiando e colando esse comando enorme toda vez.&lt;/p&gt;

&lt;p&gt;Se você usa VS Code, crie na raiz do seu projeto, dentro da pasta &lt;code&gt;.vscode&lt;/code&gt;, um arquivo chamado &lt;code&gt;launch.json&lt;/code&gt;, com o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"configurations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"launch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dart"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--dart-define=BASE_URL=https://dev.minhaapi.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--dart-define=API_KEY=b8f91e93-2460-4cd6-b746-d7ff121bf57b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro do array, você pode colocar todas as configurações de ambientes que precisa. Porém, lembre de colocar o arquivo &lt;code&gt;.vscode/launch.json&lt;/code&gt; no &lt;code&gt;.gitignore&lt;/code&gt;, para que as variáveis de ambiente não fiquem expostas para qualquer um que tiver acesso ao repositório.&lt;/p&gt;

&lt;p&gt;Assim, basta apertar F5 para rodar o projeto no VSCode já passando as variáveis de ambiente.&lt;/p&gt;

&lt;p&gt;Caso você prefira rodar os comandos no terminal, uma solução para não ficar copiando e colando o comando toda vez seria fazer um script que consome o &lt;code&gt;launch.json&lt;/code&gt; acima e roda o comando correto de acordo com o ambiente especificado. &lt;/p&gt;

&lt;p&gt;Segue abaixo um exemplo de Shell Script que fiz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

GetDartDefines&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;argsFromEnv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="s2"&gt;".configurations[] | select(.name==&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;) | .args[]"&lt;/span&gt; .vscode/launch.json&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nv"&gt;resultString&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$argsFromEnv&lt;/span&gt;
  &lt;span class="k"&gt;do
    &lt;/span&gt;resultString+&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; "&lt;/span&gt;
  &lt;span class="k"&gt;done
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$resultString&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;envs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="s2"&gt;".configurations[].name"&lt;/span&gt; .vscode/launch.json&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$envs&lt;/span&gt;
&lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;upperCaseEnvName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s2"&gt;"[:lower:]"&lt;/span&gt; &lt;span class="s2"&gt;"[:upper:]"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nv"&gt;upperCaseGivenEnv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s2"&gt;"[:lower:]"&lt;/span&gt; &lt;span class="s2"&gt;"[:upper:]"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$upperCaseGivenEnv&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;$upperCaseEnvName&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$upperCaseGivenEnv&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nv"&gt;selectedEnv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$upperCaseGivenEnv&lt;/span&gt;
  &lt;span class="k"&gt;fi
done

if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"It's necessary to provide the desired enviroment"&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"It's necessary to provide the desired command(run or build)"&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$selectedEnv&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Invalid enviroment!"&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"run"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;then
  &lt;/span&gt;flutter run &lt;span class="si"&gt;$(&lt;/span&gt;GetDartDefines &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$selectedEnv&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"build"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$3&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"It's necessary to provide the target platform to build"&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"build"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;then
  &lt;/span&gt;flutter build &lt;span class="nv"&gt;$3&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;GetDartDefines &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$selectedEnv&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Invalid command!"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;OBS: Deixando claro que não possuo grandes conhecimentos em criação de shell script e essa foi a primeira vez que fiz um, então podem haver problemas com o script acima.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
    </item>
  </channel>
</rss>
