Hoy vamos a aprender cómo podemos mostrar un loader cada vez que se cargue una petición network usando dio y Flutter.
Lo primero que haremos es crear un LoaderNotifier, se encargará de mantener el estado del loader.
loader_notifier.dart
import 'package:flutter/material.dart'; class LoaderNotifier extends ValueNotifier<bool> { LoaderNotifier() : super(false); void showLoader() => value = true; void hideLoader() => value = false; } final loaderNotifier = LoaderNotifier();
Vamos a nuestro dio_client.dart
import 'package:dio/dio.dart'; import 'package:package/network/loader_notifier.dart'; class DioClient { static final Dio _dio = Dio( BaseOptions( baseUrl: "url_back", headers: { "Access-Control-Allow-Origin": "*", 'Content-Type': 'application/json', 'Accept': '*/*', }, ), )..interceptors.add(InterceptorsWrapper( onRequest: (options, handler) async { // Mostrar el loader antes de realizar la solicitud loaderNotifier.showLoader(); return handler.next(options); }, onResponse: (response, handler) { // Ocultar el loader después de recibir la respuesta loaderNotifier.hideLoader(); return handler.next(response); }, onError: (dioError, handler) { // Ocultar el loader si ocurre un error loaderNotifier.hideLoader(); return handler.next(dioError); }, )); static Dio get dio => _dio; }
Y ahora vamos a crear el stack, para ello nos vamos a main.dart y añadimos:
import 'package:flutter/material.dart'; import 'package:interferencias_escacharrado/utils/loader_notifier.dart'; import 'package:interferencias_escacharrado/network/dio_client.dart'; // Asegúrate de importar el DioClient void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: MainScreen(), ); } } class MainScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Stack( children: [ // El contenido principal de tu aplicación va aquí Scaffold( appBar: AppBar( title: Text('Tu Aplicación'), ), body: Center( child: Text('Contenido principal'), ), ), // El loader ValueListenableBuilder<bool>( valueListenable: loaderNotifier, builder: (context, isLoading, child) { if (isLoading) { return Container( color: Colors.black54, child: Center( child: CircularProgressIndicator(), ), ); } else { return SizedBox.shrink(); } }, ), ], ); } }
Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.