Manejo de Variables de Entorno en Flutter con flutter_dotenv

2025-02-24T22:00:00-05:00 | 4 minutos de lectura | Actualizado en 2025-02-27T19:26:51-05:00

jaimetellezb
Manejo de Variables de Entorno en Flutter con flutter_dotenv

🚀 Uso de flutter_dotenv en Flutter.

Tabla de Contenido

Introducción

Siempre es importante manejar variables de entorno en nuestros proyectos de software, ya que nos permiten guardar allí cierta información que podemos manejar como configuración para no hacer ajustes en código. También se puede almacenar datos seguros, pero no es lo más recomendable, existen otras formas o alternativas que nos brindan seguridad, pero para información no tan crítica, las variables de entorno son una excelente opción.

Dentro de Flutter, existen paquetes para trabajar con variables de entorno del sistema y uno de ellos es flutter_dotenv . El cual estaremos utilizando en este artículo para aprender a configurarlo y aplicarlo en Apps construidas en Flutter.

El uso más común que se le puede dar a las variables de entorno, puede ser para almacenar datos como configuraciones de APIs, bases de datos, banderas de encendido y apagado, identificadores, tiempos de timeout de las APIs, en sí cualquier dato o valor no sensible de su aplicación se puede agregar como variable de entorno.

Instalación

  • Para instalar el paquete de flutter_dotenv, basta con ejecutar alguno de los siguientes comandos:
flutter pub add flutter_dotenv
dart pub add flutter_dotenv
  • Otra alternativa es realizar el cambio directamente en el archivo pubspec.yaml agregando la versión.
dependencies:
  flutter_dotenv: ^5.2.1

Después de realizar alguna de las dos opciones anteriores, debemos ejecutar el siguiente comando para asegurar que se instale correctamente.

flutter pub get

Con esto debería ser suficiente para tener instalado el paquete correctamente.

Configuración

Una vez instalado el paquete, podemos pasar a realizar la configuración del mismo dentro de nuestra App de Flutter

En caso de que no tengamos una app creada aún, podemos realizarlo con el siguiente comando.

flutter create flutter_dotenv_app

Una vez tenemos el proyecto Flutter listo, podemos realizar la configuración necesaria para utilizarlo.

  • Crear archivo .env en la raíz del proyecto.
SCOPE=prod
LIMIT=12
API_URL=https://api.com
ACTIVE_FLOW=false
  • Agregar en el archivo pubspec.yaml la configuración para leer el archivo .env. Se debe activar la sección de assets.
flutter:

  uses-material-design: true

  assets:
    - .env
  • También debe agregarse *.env en el archivo .gitignore para que no quede versionado en git.
  • Para utilizar el paquete, debe agregarse en la configuración inicial para que cargue las variables de entorno al cargar la aplicación.
import 'package:flutter_dotenv/flutter_dotenv.dart';

void main() async {
  // podemos especificar el archivo como tal acá, 
  // igual por defecto toma el .env
  // await dotenv.load(fileName='.env');
  await dotenv.load();
  runApp(const MyApp());
}
  • Se puede acceder al valor de las variables de la siguiente manera.
dotenv.env['SCOPE']

Ejemplo

  • environment.dart
import 'package:flutter_dotenv/flutter_dotenv.dart';

class Environment {
  static String scope = dotenv.env['SCOPE'] ?? 'dev';
  static int limit = dotenv.getInt('LIMIT', fallback: 10);
  static String urlAPI = dotenv.env['API_URL'] ?? 'http://localhost:8080';
  static bool activeFlow = dotenv.getBool('ACTIVE_FLOW', fallback: false);
}
  • main.dart
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_dotenv_app/environment.dart';

void main() async {
  // podemos especificar el archivo como tal acá, igual por defecto toma el .env
  await dotenv.load();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter DotEnv'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  String _scope = '';
  String _apiUrl = '';
  bool _active = Environment.activeFlow;

  void _incrementCounter() {
    setState(() {
      _counter++;
      if (_counter > Environment.limit) {
        _counter = 0;
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'Al presionar el botón + se incrementará el contador:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
            SizedBox(
              height: 20,
            ),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  _active = !_active;
                  _scope = Environment.scope;
                  _apiUrl = Environment.urlAPI;
                });
              },
              child: Text('Mostrar variables de entorno'),
            ),
            if (_active)
              Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text(
                    'Scope: $_scope',
                  ),
                  Text(
                    'URL de API: $_apiUrl',
                  ),
                  Text(
                    'Límite: ${Environment.limit}',
                  )
                ],
              ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

dotenv

Ejemplo completo en GitHub



Conclusión

Una ventaja de las variables de entorno, es que no necesitamos realizar cambios en código para ajustar valores, simplemente actualizamos el valor y volvemos a desplegar la aplicación para que tome los cambios. Este paquete nos brinda la opción de almacenar en variables de entorno, valores o datos no sensibles de la aplicación, datos como claves, tokens no es recomendable por seguridad realizarlo, existen otros mecanismos para esto.

¡Gracias por leer!

https://buymeacoffee.com/jaimetellezb

Referencias

© 2022 - 2025 jaimetellezb - Compartir guías y tutoriales de programación.

🌱 Powered by Hugo with theme Dream.

Sobre mí

alt

Ingeniero de software

Hola, bienvenidos a mi blog sobre guías y tutoriales de programación.

Aquí podrás encontrar guías y tutoriales sobre algunos temas de tecnología en general. La idea es poder ayudar a que ciertas cosas como configuraciones de nuevas herramientas sean más fáciles de abordar y utilizar. También pequeños proyectos donde se usen diferentes tecnologías como ejemplo.

Enlaces sociales