<?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: Rodrigo Sosa</title>
    <description>The latest articles on DEV Community by Rodrigo Sosa (@ursfr).</description>
    <link>https://dev.to/ursfr</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%2F889232%2Fda05a373-4cd6-415a-a7b5-f656ca89bbe1.png</url>
      <title>DEV Community: Rodrigo Sosa</title>
      <link>https://dev.to/ursfr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ursfr"/>
    <language>en</language>
    <item>
      <title>Optimización en el peso de aplicaciones en Flutter</title>
      <dc:creator>Rodrigo Sosa</dc:creator>
      <pubDate>Sun, 10 Jul 2022 17:34:32 +0000</pubDate>
      <link>https://dev.to/ursfr/optimizacion-en-el-peso-de-aplicaciones-en-flutter-57ng</link>
      <guid>https://dev.to/ursfr/optimizacion-en-el-peso-de-aplicaciones-en-flutter-57ng</guid>
      <description>&lt;p&gt;Una de las cosas que siempre me preocupan al comenzar un proyecto es la optimización de una aplicación ¿Por qué? La optimización es una de las bases de la aplicación ya que es la que te va a permitir un correcto funcionamiento, menor cantidad de errores, posibilidad de agregar mas funciones, mayor porcentaje de accesibilidad, es decir, que puedan adquirir la aplicación mayor variedad de celulares ya sea por rendimiento o por su peso.&lt;/p&gt;

&lt;p&gt;He estado probando e investigado distintas formas de optimizar tanto el rendimiento de una aplicación como su peso de forma conjunta, por lo tanto eso es lo que voy a explicar en esta ocasión de forma simple y con pruebas.&lt;/p&gt;

&lt;h1&gt;
  
  
  Antes de comenzar
&lt;/h1&gt;

&lt;p&gt;Vamos a dar un paseo por como inicia una aplicación, como aumenta su peso y como se puede disminuir junto con algunos tips.&lt;/p&gt;

&lt;h2&gt;
  
  
  Peso inicial de la aplicación
&lt;/h2&gt;

&lt;p&gt;Primero vamos a ver cual es el peso inicial de una aplicación flutter sin ningún tipo de optimización ni nada agregado a la misma:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Este es con el peso que una aplicación flutter comienza y posteriormente se hace una APK Build:&lt;br&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%2Fz0pv5k359m09g3pnjbk9.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%2Fz0pv5k359m09g3pnjbk9.PNG" alt="build apk" width="524" height="30"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Este es con el peso que una aplicación flutter comienza y posteriormente se hace un appbundle Build:&lt;br&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%2F1yknk2a63jpka5511w4h.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%2F1yknk2a63jpka5511w4h.PNG" alt="Image description" width="538" height="28"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ¿Por que aumenta el peso de la aplicación?
&lt;/h2&gt;

&lt;p&gt;Para poder encontrar una solución primero hay que saber el problema, y el problema son las razones de porque nuestra aplicación aumenta su peso. Entonces a modo de prueba agregue al proyecto 5 paquetes de Firebase (Firestore, Realtime Database, Auth, Core y Storage), una base de datos BaaS con bastante reputación en Flutter y utilizada por muchos desarrolladores y concluí que únicamente con los paquetes aumentó el peso de la aplicación en un &lt;strong&gt;7.93%&lt;/strong&gt;:&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%2F0tryjwkvtb6cco4s8t6r.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%2F0tryjwkvtb6cco4s8t6r.PNG" alt="7.93%" width="525" height="22"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luego probé agregando muchos paquetes que utilizaría normalmente un E-commerce complejo con lo cual a partir del valor inicial, se obtuvo un &lt;strong&gt;28.66%&lt;/strong&gt;, lo cual es demasiado para una aplicación en la cual no tiene nada mas que el contador por predeterminado que se le incluye a la aplicación al crearse y teniendo solo los paquetes agregados:&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%2F9sdfuhpw8rlktht9opuy.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%2F9sdfuhpw8rlktht9opuy.PNG" alt="28.66%" width="522" height="23"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo siguiente que hice fue pasar del Android SDK 20 que utilizaba la aplicación al SDK 29 por lo cual a partir del valor inicial se obtuvo ahora un porcentaje del &lt;strong&gt;162.8%&lt;/strong&gt; ¡UNA LOCURA!:&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%2Fuog2q5pgq42xakoygm98.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%2Fuog2q5pgq42xakoygm98.PNG" alt="162.8%" width="520" height="27"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con esto ya vimos que con tan poco, el peso de la aplicación puede aumentar exponencialmente si no lo mantenemos controlado, entonces&lt;br&gt;
sabiendo ya esto, comencemos.&lt;/p&gt;
&lt;h1&gt;
  
  
  Optimizaciones
&lt;/h1&gt;
&lt;h2&gt;
  
  
  1. gradle.properties y app/build.gradle
&lt;/h2&gt;

&lt;p&gt;Una de las cosas que note es el uso de estas 3 propiedades en aplicaciones que tocaron los 40MB:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;android.enableR8=true //Se utiliza en gradle.properties
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.release
            minifyEnabled true
            shrinkResources true
        }
    } //se utiliza en app/build.gradle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estas 3 propiedades se deben tener desde el inicio porque a medida que aumenta el contenido de la aplicación optimizara el peso de la Build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android R8&lt;/strong&gt; utiliza las técnicas de proguard y las mejora por lo tanto hay que tener un archivo proguard-rules.pro, a continuación muestro algunas reglas que pueden ser de utilidad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nota: En el proyecto de prueba no agregue el proguard-rules.pro ya que no iba a tener ningún efecto en la aplicación tal como estaba y solo iba a aumentar el peso el cual normalmente aumenta en 0.1MB a la aplicación&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;minifyEnabled&lt;/strong&gt; buscara eliminar todo símbolo que no sea de utilidad en el código marcándolo para que sea removido por shrinkResources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;shrinkResources&lt;/strong&gt; buscara eliminar todo recurso que no sea de utilidad en la aplicación marcado previamente por minifyEnabled.&lt;/p&gt;

&lt;p&gt;Estos 3 parámetros se recomienda utilizar juntos.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Parámetros en flutter build apk/appbundle
&lt;/h2&gt;

&lt;p&gt;Crear una build directamente en flutter te permite de una forma fácil, poder agregar distintos parámetros a la build para que se adapte mas fácilmente a tus necesidades a diferencia de entrar al proyecto como si estuvieras desarrollando una aplicación para Android. Procedemos con los parámetros:&lt;/p&gt;

&lt;h3&gt;
  
  
  --split-per-abi
&lt;/h3&gt;

&lt;p&gt;Aclaración, este parámetro únicamente funciona para APK&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%2F2sl55pjs5v5b08nijs8j.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%2F2sl55pjs5v5b08nijs8j.PNG" alt="flutter build apk split-per-abi" width="626" height="21"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo que hace es separar el proyecto en 3 APK distintas para 3 distintos tipos de dispositivos: android-arm, android-arm64, o android-x64, recuerda que si no tienen la apk especifica que necesita cada celular, ese mismo celular no la podrá utilizar. Por ejemplo un celular que utiliza arm no podrá utilizar una apk que sea arm64.&lt;/p&gt;

&lt;p&gt;En caso de que solo quieras una apk de las 3 ABI debes utilizar:&lt;br&gt;
&lt;code&gt;flutter build apk --target-platform [ABI]&lt;/code&gt;&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%2Fg8q8l5jr9yxhgtb4y18t.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%2Fg8q8l5jr9yxhgtb4y18t.PNG" alt="target platform" width="519" height="20"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  --obfuscate --split-debug-info=symbols/
&lt;/h3&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%2Fd40tb4ne54dhltu19fpp.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%2Fd40tb4ne54dhltu19fpp.PNG" alt="Image description" width="529" height="25"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo que hace es ofuscar el código, lo cual disminuye el peso y previene la ingeniería inversa y elimina los símbolos de debug, es decir, los que se producen en el desarrollo.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Reducción de peso de los recursos utilizados
&lt;/h2&gt;

&lt;p&gt;Los archivos utilizados en la aplicación como por ejemplo imágenes, videos, gif, json, svg, etc deben pesar muy poco. Tengo mi política de que pesen menos de 10KB cada archivo que este utilizando en la aplicación.&lt;/p&gt;

&lt;p&gt;Talvez mas de uno se preguntara ¿Cómo lo hago? bueno, se puede utilizar cualquier pagina que se encargue de bajar el peso de los archivos. En mi caso que uso imágenes mas que nada, utilizo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://compresspng.com/es/" rel="noopener noreferrer"&gt;https://compresspng.com/es/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Utilizar archivos de internet
&lt;/h2&gt;

&lt;p&gt;Otra forma de disminuir el peso de la aplicación que es mas eficiente que la reducción de peso de las imágenes es mostrar las imágenes desde una pagina web utilizando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            Image.network("URL DE LA IMAGEN");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obviamente que esto es muy dependiente de si tu aplicación utiliza o no el internet, pero es una alternativa muy viable, que hasta en el caso necesario puedes almacenarla en el cache para no estar requiriendo siempre una conexión a internet.&lt;/p&gt;

&lt;p&gt;Esto no solo aplica a imágenes, sino también que puede aplicar también a fuentes de letra, por lo tanto se puede utilizar el paquete de google_fonts para traer esas fuentes que quieres desde  internet:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pub.dev/packages/google_fonts" rel="noopener noreferrer"&gt;https://pub.dev/packages/google_fonts&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Utilizar código propio
&lt;/h2&gt;

&lt;p&gt;No es malo utilizar paquetes, a lo que me refiero es que los mismos paquetes como ya demostré mas arriba, pueden aumentar el peso de la aplicación porque puede contener cosas que no nos sirve como puede ser el caso de algún paquete que nos ponga a disposición variedad de iconos. &lt;/p&gt;

&lt;p&gt;En el caso de los iconos puedes utilizar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.fluttericon.com/" rel="noopener noreferrer"&gt;https://www.fluttericon.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;para crear un SVG del icono que quieras e insertarlo fácilmente a tu aplicación.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Desarmar los paquetes
&lt;/h2&gt;

&lt;p&gt;Esto puede ser una tarea complicada en ciertos casos, por lo tanto recomiendo hacer solo esto en caso de que el paquete lo único que haga es facilitarte la creación de un widget.&lt;/p&gt;

&lt;p&gt;Como todos los paquetes de pub.dev son open source puedes instalarlo en tu proyecto, quitarle lo que necesites y pasarlo directamente a tu proyecto, eliminando posteriormente el paquete de pubspec.yaml.&lt;/p&gt;

&lt;p&gt;no te olvides de dejar en un comentario los créditos al creador en donde guardes ese código ;)&lt;/p&gt;

&lt;p&gt;Si sabes que solo vas a utilizar una plataforma, prioriza si es que el paquete te lo permite, utilizar la modificación hecha por el mismo desarrollador que solo tenga la implementación para la plataforma de su aplicación.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
Google Pay tiene la posibilidad de implementar con su paquete para  Android y IOS, pero en su GitHub también presenta la posibilidad de utilizar para una sola plataforma.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/google-pay/flutter-plugin" rel="noopener noreferrer"&gt;https://github.com/google-pay/flutter-plugin&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  7. Evitar las redundancias y repeticiones en el código.
&lt;/h2&gt;

&lt;p&gt;Esto es un error que se suele cometer y es repetir el código ya sea por una función o por repetir widgets varias veces ya sea para distinguir de donde viene la función, si proviene de android, ios o web, para mostrar varias veces un mismo widget o cualquier otra cosa.&lt;/p&gt;

&lt;p&gt;Vamos a pasarlo al caso practico:&lt;/p&gt;

&lt;p&gt;Digamos que estamos distinguiendo tres formas distintas de subida de datos a la colección "Productos" de Firestore Cloud.&lt;br&gt;
El error seria realizar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PublicarProducto(){

if(tag=="Especial"){
      FirebaseFirestore.instance.collection("Productos").doc(id.random).set({
        "name":product.username,
        "price":product.price,
        "image":product.image,
        "desc": product.description,
        "cat":product.category,
        "quant":1,
        'ownername':owner.name,
        "ownertag":"Especial",
      });

}else if(tag=="Normal"){
FirebaseFirestore.instance.collection("Productos").doc(id.random).set({
        "name":product.username,
        "price":product.price,
        "image":product.image,
        "desc": product.description,
        "cat":product.category,
        "quant":1,
        'ownername':owner.name,
        "ownertag":"Normal",
      });
}else{
FirebaseFirestore.instance.collection("Productos").doc(id.random).set({
        "name":product.username,
        "price":product.price,
        "image":product.image,
        "desc": product.description,
        "cat":product.category,
        "quant":1,
        'ownername':owner.name,
      });
}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como vemos, lo que estamos queriendo hacer es dependiendo del "tag" de la persona, subir el producto con un tag distinto, incluso hasta si no existe tal tag.&lt;br&gt;
Esto esta mal realizar porque hay redundancia y se repite únicamente por 1 sola variable, por lo tanto habría que utilizar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PublicarProducto(){
      FirebaseFirestore.instance.collection("Productos").doc(id.random).set({
        "name":product.username,
        "price":product.price,
        "image":product.image,
        "desc": product.description,
        "cat":product.category,
        "quant":1,
        'ownername':owner.name,
        if(tag!=null)"ownertag":tag,
      });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De esta forma compactamos el código y evitamos redundancias. Esta bien, no es mucho código como para que se note el peso o el coste en el rendimiento pero si lo aplicamos a una aplicación grande y este error se repite mucho, el cambio será muy notable.&lt;/p&gt;

&lt;p&gt;También puede ocurrir que repitamos una estructura en Widget build por lo tanto lo que se debería hacer es crear un Widget aparte y lo llamemos desde distintas pantallas o múltiples veces.&lt;/p&gt;

&lt;p&gt;Pasemos otra vez al caso practico:&lt;/p&gt;

&lt;p&gt;Este seria el error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            Column(children: [
              Container(
                child: Row(
                  children: [
                    Text("HOLA"),
                    SizedBox(height: 15,),
                    TextFormField(decoration: InputDecoration(hintText: "Nombre"),),
                    Text("SI")
                  ],
                ),
              ),
              Container(
                child: Row(
                  children: [
                    Text("ARE"),
                    SizedBox(height: 15,),
                    TextFormField(decoration: InputDecoration(hintText: "Nombre"),),
                    Text("YOU")
                  ],
                ),
              ),
              Container(
                child: Row(
                  children: [
                    Text("GONNA"),
                    SizedBox(height: 15,),
                    TextFormField(decoration: InputDecoration(hintText: "Nombre"),),
                    Text("LEVEL")
                  ],
                ),
              ),
              Container(
                child: Row(
                  children: [
                    Text("FORSEN"),
                    SizedBox(height: 15,),
                    TextFormField(decoration: InputDecoration(hintText: "Nombre"),),
                    Text("LEVEL")
                  ],
                ),
              ),
            ],),
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estamos repitiendo una y otra vez el mismo Container que contiene el Row con los 2 Text (Que tienen distintos textos) el SizedBox y el TextFormField. Entonces lo que vamos a hacer es:&lt;/p&gt;

&lt;p&gt;Crear un Widget fuera del Widget build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Widget UnSoloWidget ({required String texto1, required String texto2}){
    return Container(
      child: Row(
        children: [
          Text(texto1),
          SizedBox(height: 15,),
          TextFormField(decoration: InputDecoration(hintText: "Nombre"),),
          Text(texto2)
        ],
      ),
    );
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se pasaran los parámetros en cada uno y todos redireccionaran al mismo widget con distintos valores de tal manera que quedara:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UnSoloWidget(),
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De esta manera al utilizar el widget se redireccionara al mismo, te ahorraras tiempo, espacio y rendimiento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Column(children: [
      UnSoloWidget(texto1:"HOLA",texto2:"SI"),
      UnSoloWidget(texto1:"ARE",texto2:"YOU),
      UnSoloWidget(texto1:"GONNA",texto2:"LEVEL"),
      UnSoloWidget(texto1:"FORSEN",texto2:"LEVEL"),
    ],);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. No dejar código basura o no utilizado
&lt;/h2&gt;

&lt;p&gt;Es algo que nos pasa a muchos dejar este tipo de código desperdiciado por nuestro proyecto con tan solo la idea de que se utilizara mas adelante, por lo tanto ante la duda de si será o no utilizado o sino es el momento de utilizarlo lo mejor es comentarlo (con // ), de esta manera no se compilara en el APK. Esto se puede aplicar a paquetes que no estén en uso comentándolos en el pubspec.yaml o archivos enteros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;p&gt;Para identificar si tiene alguno de los problemas ya descritos puede analizar el peso de la aplicación realizando los siguientes pasos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crear una build de su proyecto con:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;flutter build apk --target-platform android-arm --analyze-size&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Ir a Dart DevTools:&lt;br&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%2Fienh7vsb608kmunb58vb.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%2Fienh7vsb608kmunb58vb.PNG" alt="2" width="449" height="610"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elegir subir un archivo:&lt;br&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%2Fjp4r1vkme9srp9gaevz5.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%2Fjp4r1vkme9srp9gaevz5.PNG" alt="3" width="165" height="48"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seleccionar o insertar el json generado anteriormente:&lt;br&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%2F1cl29reqx3xh78ybluly.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%2F1cl29reqx3xh78ybluly.PNG" alt="4" width="800" height="133"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En el caso de que quieras leerlo con appbundle en vez de un APK, debes sumarle 0.1MB o 0.2MB al total del APK.&lt;/p&gt;

&lt;h1&gt;
  
  
  Fin
&lt;/h1&gt;

&lt;p&gt;Ya terminando, esta fue una explicación sobre porque a veces pesan tanto nuestras aplicaciones y como controlar su peso para que seamos mejores y mas eficientes en nuestro trabajo como desarrolladores de aplicaciones de Flutter. Es verdad que existen mas formas de optimizar aplicaciones pero estas son formas que pueden aplicar a casi cualquier proyecto.&lt;/p&gt;

&lt;p&gt;Muchas gracias.&lt;/p&gt;

&lt;h1&gt;
  
  
  DOCUMENTACIÖN Y FUENTES
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://docs.flutter.dev/deployment/obfuscate#obfuscating-your-app" rel="noopener noreferrer"&gt;https://docs.flutter.dev/deployment/obfuscate#obfuscating-your-app&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.android.com/studio/build/shrink-code" rel="noopener noreferrer"&gt;https://developer.android.com/studio/build/shrink-code&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.android.com/guide/app-bundle" rel="noopener noreferrer"&gt;https://developer.android.com/guide/app-bundle&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=9D63S4ZRBls" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=9D63S4ZRBls&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/49064969/flutter-apps-are-too-big-in-size" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/49064969/flutter-apps-are-too-big-in-size&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/52428973/how-to-minify-a-flutter-app-with-proguard" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/52428973/how-to-minify-a-flutter-app-with-proguard&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.flutter.dev/perf/app-size" rel="noopener noreferrer"&gt;https://docs.flutter.dev/perf/app-size&lt;/a&gt;&lt;br&gt;
Imagen de balanza de la portada: &lt;a href="https://www.freepik.es/vector-gratis/bascula-digital-sobre-fondo-blanco_16262850.htm#query=balanza&amp;amp;position=22&amp;amp;from_view=keyword" rel="noopener noreferrer"&gt;https://www.freepik.es/vector-gratis/bascula-digital-sobre-fondo-blanco_16262850.htm#query=balanza&amp;amp;position=22&amp;amp;from_view=keyword&lt;/a&gt;&lt;/p&gt;

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