[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technologies":3,"\u002Fopen-source\u002Fflutter-progress-dialog":167},[4,10,15,21,26,32,38,43,48,53,58,63,68,73,77,82,87,92,97,103,108,113,118,123,128,133,138,143,147,152,157,162],{"title":5,"description":6,"slug":7,"category":8,"icon":9},"Android","Todas las apps que entregamos llegan a Android: APIs de plataforma, ejecución en segundo plano, permisos y los requisitos de tienda que traen consigo.","android","framework","logos:android-icon",{"title":11,"description":12,"slug":13,"category":8,"icon":14},"Angular","El framework de frontend en el que trabajamos cuando un producto ya es Angular: una estructura con todo incluido que encaja en apps grandes y de vida larga.","angular","logos:angular-icon",{"title":16,"description":17,"slug":18,"category":19,"icon":20},"Dart","El lenguaje en el que está escrita cada app Flutter que entregamos: null safety robusto, pattern matching de verdad y un compilador que apunta a nativo y a la web.","dart","language","logos:dart",{"title":22,"description":23,"slug":24,"category":8,"icon":25},"Django","El framework de Python que usamos cuando un producto necesita administración, autenticación y un modelo de datos real desde el primer día.","django","logos:django-icon",{"title":27,"description":28,"slug":29,"category":30,"icon":31},"Docker","Cada servicio que construimos se publica como contenedor, así que lo que corre en un portátil, en CI y en producción es un solo artefacto y no tres.","docker","infrastructure","logos:docker-icon",{"title":33,"description":34,"slug":35,"category":36,"icon":37},"Fastlane","La automatización de releases móviles: firma, builds y subidas a las tiendas desde CI, no desde el portátil de un ingeniero el día del lanzamiento.","fastlane","tools","logos:fastlane",{"title":39,"description":40,"slug":41,"category":8,"icon":42},"Flutter","Nuestro stack móvil principal desde 2018: una base de código Dart que llega a iOS, Android, web y escritorio sin un equipo por plataforma.","flutter","logos:flutter",{"title":44,"description":45,"slug":46,"category":36,"icon":47},"Git","Todos los proyectos que tocamos viven en Git: pull requests revisadas, CI en cada rama y un historial que sigue teniendo sentido meses después.","git","logos:git-icon",{"title":49,"description":50,"slug":51,"category":19,"icon":52},"Go","Nuestro lenguaje de backend para APIs en tiempo real y servicios bajo carga: binarios pequeños, compilaciones rápidas y concurrencia que sigue siendo legible.","go","logos:gopher",{"title":54,"description":55,"slug":56,"category":30,"icon":57},"Google Cloud","La nube donde corren nuestras cargas de producción: Kubernetes gestionado, almacenamiento y red, sin servidores hechos a mano que nadie quiere mantener.","gcp","logos:google-cloud",{"title":59,"description":60,"slug":61,"category":36,"icon":62},"Gradle","El sistema de build por el que pasa cada release de Android: product flavours, configuraciones de firma y el cableado de dependencias bajo una app Flutter.","gradle","logos:gradle",{"title":64,"description":65,"slug":66,"category":30,"icon":67},"Helm","Cómo empaquetamos un despliegue de Kubernetes: servicio, configuración, secretos e ingress como una unidad versionada que se puede promover y revertir.","helm","logos:helm",{"title":69,"description":70,"slug":71,"category":19,"icon":72},"Kotlin","A lo que recurrimos cuando una app Flutter necesita Android de verdad por debajo: platform channels, trabajo en segundo plano e integraciones con SDK nativos.","kotlin","logos:kotlin-icon",{"title":74,"description":75,"slug":76,"category":8,"icon":72},"Kotlin Multiplatform","Compartir la lógica de negocio entre iOS y Android mientras cada plataforma conserva su UI nativa: la alternativa cuando Flutter no encaja.","kmp",{"title":78,"description":79,"slug":80,"category":30,"icon":81},"Kubernetes","Cómo ejecutamos servicios en producción: despliegues con Helm, rollouts reversibles y escalado que no necesita a nadie a las 3 de la mañana.","kubernetes","logos:kubernetes",{"title":83,"description":84,"slug":85,"category":30,"icon":86},"NATS","Mensajería ligera entre servicios: publicación\u002Fsuscripción y petición\u002Frespuesta sin el peso operativo de un clúster de broker completo.","nats","logos:nats-icon",{"title":88,"description":89,"slug":90,"category":8,"icon":91},"Nuxt","Vue con renderizado en servidor, enrutado y SEO resueltos: así hacemos sitios y apps web que deben ser rápidas e indexables en la primera carga.","nuxt","logos:nuxt-icon",{"title":93,"description":94,"slug":95,"category":19,"icon":96},"PHP","Donde trabajamos con un backend PHP ya existente: extenderlo, integrarse con él y construir los clientes móviles y web a los que tiene que servir.","php","logos:php",{"title":98,"description":99,"slug":100,"category":101,"icon":102},"PostgreSQL","Nuestra base de datos por defecto, salvo que un producto dé una razón concreta para no usarla: del diseño del esquema al ajuste de índices.","postgres","database","logos:postgresql",{"title":104,"description":105,"slug":106,"category":19,"icon":107},"Python","Nuestro lenguaje para backends, trabajo con datos e integraciones de IA, incluidos los bindings de Python que publicamos para nuestras propias herramientas en Rust.","python","logos:python",{"title":109,"description":110,"slug":111,"category":8,"icon":112},"React","La librería de frontend en la que trabajamos cuando un producto ya es React: componentes, hooks y el ecosistema que ha crecido a su alrededor.","react","logos:react",{"title":114,"description":115,"slug":116,"category":101,"icon":117},"Redis","Donde ponemos los datos que tienen que ser rápidos y se pueden reconstruir: cachés, sesiones, límites de tasa y las colas tras las rutas lentas de un producto.","redis","logos:redis",{"title":119,"description":120,"slug":121,"category":19,"icon":122},"Ruby","El lenguaje de nuestra automatización de releases móviles: lanes de Fastlane, acciones a medida y el pegamento de CI que sube builds a las tiendas.","ruby","logos:ruby",{"title":124,"description":125,"slug":126,"category":19,"icon":127},"Rust","A donde vamos cuando importan tanto el rendimiento como la corrección: renderizado de documentos, herramientas de CLI y servicios que tienen que ser rápidos y predecibles.","rust","simple-icons:rust",{"title":129,"description":130,"slug":131,"category":101,"icon":132},"SQLite","La base de datos que viaja dentro de la app: cachés locales, almacenamiento offline-first y todo lo que tiene que seguir funcionando sin red.","sqlite","logos:sqlite",{"title":134,"description":135,"slug":136,"category":8,"icon":137},"Strapi","Un CMS headless para cuando los editores necesitan ser dueños del contenido: una administración de verdad y una API limpia, sin construirlas desde cero.","strapi","logos:strapi-icon",{"title":139,"description":140,"slug":141,"category":19,"icon":142},"Swift","A lo que recurrimos cuando una app Flutter necesita iOS de verdad por debajo: platform channels, integraciones con SDK nativos, widgets y App Clips.","swift","logos:swift",{"title":144,"description":145,"slug":146,"category":8,"icon":142},"SwiftUI","El framework de UI de Apple, donde construimos las superficies nativas que una app Flutter no puede tener: widgets, App Clips y extensiones.","swiftui",{"title":148,"description":149,"slug":150,"category":8,"icon":151},"Tailwind CSS","Cómo damos estilo a cada frontend que construimos: clases de utilidad y design tokens en lugar de una hoja de estilos que solo crece y nunca se borra.","tailwind","logos:tailwindcss-icon",{"title":153,"description":154,"slug":155,"category":19,"icon":156},"TypeScript","Lo predeterminado para todo lo que escribimos para el navegador y para servicios Node: tipos que detectan errores de integración antes de llegar a una revisión.","typescript","logos:typescript-icon",{"title":158,"description":159,"slug":160,"category":8,"icon":161},"Vue","Nuestro framework de frontend para paneles de administración, cuadros de mando y apps web que deben seguir siendo mantenibles durante años.","vue","logos:vue",{"title":163,"description":164,"slug":165,"category":36,"icon":166},"Whisper","El modelo de reconocimiento de voz de código abierto de OpenAI: el motor de transcripción detrás de la entrada por voz, que funciona como servicio de backend y también en el propio dispositivo.","whisper","simple-icons:openai",{"id":168,"title":169,"body":170,"description":594,"extension":595,"links":596,"meta":600,"metaDescription":601,"metaTitle":602,"navigation":476,"ogDescription":603,"path":604,"repository":605,"seo":609,"slug":608,"stem":610,"technologies":611,"updated":612,"__hash__":613,"stats":614},"open_source_es\u002Fopen-source\u002Fflutter-progress-dialog.md","Flutter Future Progress Dialog",{"type":171,"value":172,"toc":582},"minimark",[173,178,182,185,188,204,208,223,231,234,238,308,312,317,323,327,333,337,346,350,353,357,360,387,393,548,563,574,578],[174,175,177],"h2",{"id":176},"el-problema","El problema",[179,180,181],"p",{},"La mayoría de las apps Flutter necesitan ejecutar tareas que tardan unos segundos: pedir datos a una API, subir un archivo o procesar un pago. Durante esa espera el usuario mira una pantalla congelada sin ninguna señal de que esté pasando algo. Vuelve a pulsar el botón, provoca peticiones duplicadas o da por hecho que la app se ha caído.",[179,183,184],{},"La solución habitual es gestionar a mano un estado de carga: cambiar un booleano, mostrar un spinner, esperar al future, ocultar el spinner y luego manejar el resultado o el error. Esa lógica acaba duplicada en decenas de pantallas con diferencias sutiles cada vez.",[179,186,187],{},"Los problemas más comunes son:",[189,190,191,195,198,201],"ul",{},[192,193,194],"li",{},"Código repetitivo de gestión del estado de carga en cada pantalla",[192,196,197],{},"Usuarios pulsando botones varias veces porque no hay respuesta visual",[192,199,200],{},"Diálogos descartados que dejan futures huérfanos ejecutándose en segundo plano",[192,202,203],{},"Manejo de errores inconsistente: unas pantallas capturan excepciones y otras fallan en silencio",[174,205,207],{"id":206},"cómo-lo-resuelve-flutter_future_progress_dialog","Cómo lo resuelve flutter_future_progress_dialog",[179,209,210,214,215,218,219,222],{},[211,212,213],"code",{},"flutter_future_progress_dialog"," sustituye todo ese código repetitivo por una única llamada a función. Le pasas tu tarea asíncrona y el paquete muestra un diálogo de progreso no descartable, espera el resultado, cierra el diálogo y te devuelve un resultado con seguridad de tipos: o bien ",[211,216,217],{},"Success"," con el valor, o bien ",[211,220,221],{},"Failure"," con el error.",[179,224,225],{},[226,227],"img",{"alt":228,"src":229,"style":230},"Demo del diálogo de progreso de Flutter en un iPhone","\u002Fopen-source\u002Fflutter-progress-dialog\u002Fflutter_progress_dialog.gif","max-height: 600px; height: auto; width: auto;",[179,232,233],{},"El manejo de errores viene incorporado en el tipo del resultado, así que nunca se te olvida capturar una excepción.",[174,235,237],{"id":236},"qué-ofrece","Qué ofrece",[189,239,240,251,260,269,279,300],{},[192,241,242,246,247,250],{},[243,244,245],"strong",{},"Diálogo Material",": ",[211,248,249],{},"showProgressDialog"," muestra un indicador de progreso circular estándar de Material",[192,252,253,246,256,259],{},[243,254,255],{},"Diálogo Cupertino",[211,257,258],{},"showCupertinoProgressDialog"," muestra un indicador de actividad al estilo iOS",[192,261,262,246,265,268],{},[243,263,264],{},"Diálogo adaptativo",[211,266,267],{},"showAdaptiveProgressDialog"," elige automáticamente el estilo correcto para la plataforma actual",[192,270,271,274,275,278],{},[243,272,273],{},"UI de diálogo personalizada",": pasa un ",[211,276,277],{},"builder"," para sustituir el indicador por defecto por el widget que necesites",[192,280,281,246,284,287,288,290,291,293,294,290,297],{},[243,282,283],{},"Resultados con seguridad de tipos",[211,285,286],{},"ProgressDialogResult\u003CT>"," es una clase sellada con variantes ",[211,289,217],{}," y ",[211,292,221],{},", con soporte para pattern matching y métodos de conveniencia como ",[211,295,296],{},"unwrap()",[211,298,299],{},"map()",[192,301,302,246,305,307],{},[243,303,304],{},"Captura de errores",[211,306,221],{}," incluye tanto el objeto de error como la traza de pila",[174,309,311],{"id":310},"casos-de-uso-reales","Casos de uso reales",[313,314,316],"h3",{"id":315},"procesamiento-de-pagos","Procesamiento de pagos",[179,318,319,320,322],{},"Una pantalla de checkout llama a la API de una pasarela de pago. Sin un diálogo de progreso, los usuarios vuelven a pulsar «Pagar» cuando parece que no pasa nada, lo que provoca cargos duplicados. Con ",[211,321,249],{},", el diálogo permanece en pantalla y bloquea la interacción hasta que la pasarela responde; luego haces pattern matching del resultado para navegar a una pantalla de confirmación o de error.",[313,324,326],{"id":325},"subida-de-archivos","Subida de archivos",[179,328,329,330,332],{},"Un escáner de documentos sube imágenes a un servidor. La subida puede tardar varios segundos con conexiones lentas. Envolverla en ",[211,331,267],{}," da a los usuarios una respuesta visual inmediata y garantiza que el diálogo encaje con la plataforma: Material en Android, Cupertino en iOS.",[313,334,336],{"id":335},"envío-de-formularios","Envío de formularios",[179,338,339,340,342,343,345],{},"Un formulario de varios pasos envía datos a un backend en el último paso. Usar el diálogo de progreso evita el doble envío y te da un resultado ",[211,341,217],{},"\u002F",[211,344,221],{}," limpio para decidir si mostrar una pantalla de éxito o un mensaje de error en línea.",[313,347,349],{"id":348},"sincronización-de-datos-en-segundo-plano","Sincronización de datos en segundo plano",[179,351,352],{},"Una app de CRM sincroniza cambios locales con un servidor remoto. Un builder personalizado puede mostrar una animación de carga de marca en lugar del spinner por defecto, manteniendo la experiencia coherente con el resto de la app.",[174,354,356],{"id":355},"cómo-empezar","Cómo empezar",[179,358,359],{},"Instala el paquete:",[361,362,367],"pre",{"className":363,"code":364,"language":365,"meta":366,"style":366},"language-shell shiki shiki-themes material-theme-lighter github-light github-dark","flutter pub add flutter_future_progress_dialog\n","shell","",[211,368,369],{"__ignoreMap":366},[370,371,374,377,381,384],"span",{"class":372,"line":373},"line",1,[370,375,41],{"class":376},"sbgvK",[370,378,380],{"class":379},"s_sjI"," pub",[370,382,383],{"class":379}," add",[370,385,386],{"class":379}," flutter_future_progress_dialog\n",[179,388,389,390,392],{},"Después llama a ",[211,391,249],{}," con tu tarea asíncrona:",[361,394,397],{"className":395,"code":396,"language":18,"meta":366,"style":366},"language-dart shiki shiki-themes material-theme-lighter github-light github-dark","final result = await showProgressDialog(\n  context: context,\n  future: () => fetchData(),\n);\n\nswitch (result) {\n  case Success(:final value):\n    \u002F\u002F Usa el valor\n  case Failure(:final error):\n    \u002F\u002F Gestiona el error\n}\n",[211,398,399,424,440,462,471,478,487,510,517,536,542],{"__ignoreMap":366},[370,400,401,405,409,413,417,421],{"class":372,"line":373},[370,402,404],{"class":403},"sbsja","final",[370,406,408],{"class":407},"su5hD"," result ",[370,410,412],{"class":411},"smGrS","=",[370,414,416],{"class":415},"sVHd0"," await",[370,418,420],{"class":419},"sGLFI"," showProgressDialog",[370,422,423],{"class":407},"(\n",[370,425,427,430,433,436],{"class":372,"line":426},2,[370,428,429],{"class":407},"  context",[370,431,432],{"class":411},":",[370,434,435],{"class":407}," context",[370,437,439],{"class":438},"sP7_E",",\n",[370,441,443,446,448,451,454,457,460],{"class":372,"line":442},3,[370,444,445],{"class":407},"  future",[370,447,432],{"class":411},[370,449,450],{"class":407}," () ",[370,452,453],{"class":411},"=>",[370,455,456],{"class":419}," fetchData",[370,458,459],{"class":407},"()",[370,461,439],{"class":438},[370,463,465,468],{"class":372,"line":464},4,[370,466,467],{"class":407},")",[370,469,470],{"class":438},";\n",[370,472,474],{"class":372,"line":473},5,[370,475,477],{"emptyLinePlaceholder":476},true,"\n",[370,479,481,484],{"class":372,"line":480},6,[370,482,483],{"class":415},"switch",[370,485,486],{"class":407}," (result) {\n",[370,488,490,493,497,500,502,504,507],{"class":372,"line":489},7,[370,491,492],{"class":415},"  case",[370,494,496],{"class":495},"sZMiF"," Success",[370,498,499],{"class":407},"(",[370,501,432],{"class":411},[370,503,404],{"class":403},[370,505,506],{"class":407}," value)",[370,508,509],{"class":411},":\n",[370,511,513],{"class":372,"line":512},8,[370,514,516],{"class":515},"sutJx","    \u002F\u002F Usa el valor\n",[370,518,520,522,525,527,529,531,534],{"class":372,"line":519},9,[370,521,492],{"class":415},[370,523,524],{"class":495}," Failure",[370,526,499],{"class":407},[370,528,432],{"class":411},[370,530,404],{"class":403},[370,532,533],{"class":407}," error)",[370,535,509],{"class":411},[370,537,539],{"class":372,"line":538},10,[370,540,541],{"class":515},"    \u002F\u002F Gestiona el error\n",[370,543,545],{"class":372,"line":544},11,[370,546,547],{"class":407},"}\n",[179,549,550,551,553,554,556,557,559,560,562],{},"Hay tres funciones de diálogo disponibles: ",[211,552,249],{}," (Material), ",[211,555,258],{}," (Cupertino) y ",[211,558,267],{}," (automática según plataforma). Todas aceptan un parámetro opcional ",[211,561,277],{}," para una UI personalizada.",[179,564,565,566,573],{},"Tienes un ejemplo completo y funcional en el ",[567,568,572],"a",{"href":569,"rel":570},"https:\u002F\u002Fgithub.com\u002Fnerdy-pro\u002Fflutter-progress-dialog\u002Ftree\u002Fmain\u002Fexample",[571],"nofollow","directorio de ejemplos",".",[575,576],"questions",{":items":577},"[{\"title\":\"¿Puede el usuario cerrar el diálogo manualmente?\",\"text\":\"No. El diálogo no es descartable por defecto, lo que evita futures huérfanos y envíos duplicados. El diálogo se cierra automáticamente cuando la tarea asíncrona termina.\"},{\"title\":\"¿Qué pasa si el future lanza una excepción?\",\"text\":\"El diálogo se cierra y el resultado se devuelve como un Failure que contiene el error y la traza de pila. Tu código puede hacer pattern matching sobre el resultado para manejar errores sin bloques try-catch.\"},{\"title\":\"¿Funciona tanto en Android como en iOS?\",\"text\":\"Sí. Usa showProgressDialog para el estilo Material, showCupertinoProgressDialog para el estilo iOS, o showAdaptiveProgressDialog para adaptarse automáticamente a la plataforma anfitriona.\"},{\"title\":\"¿Puedo personalizar el indicador de carga?\",\"text\":\"Sí. Pasa un parámetro builder a cualquiera de las tres funciones de diálogo para sustituir el indicador de progreso por defecto por tu propio widget: una animación de marca, un mensaje o cualquier otro widget de Flutter.\"},{\"title\":\"¿Cómo funciona el tipo del resultado?\",\"text\":\"ProgressDialogResult\u003CT> es una clase sellada con dos variantes: Success\u003CT>, que contiene el valor devuelto, y Failure\u003CT>, que contiene el error y la traza de pila. Puedes usar el pattern matching de Dart o métodos de conveniencia como isSuccess, isError, unwrap() y map().\"}]",[579,580,581],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}",{"title":366,"searchDepth":426,"depth":426,"links":583},[584,585,586,587,593],{"id":176,"depth":426,"text":177},{"id":206,"depth":426,"text":207},{"id":236,"depth":426,"text":237},{"id":310,"depth":426,"text":311,"children":588},[589,590,591,592],{"id":315,"depth":442,"text":316},{"id":325,"depth":442,"text":326},{"id":335,"depth":442,"text":336},{"id":348,"depth":442,"text":349},{"id":355,"depth":426,"text":356},"Un paquete de Flutter que muestra un diálogo de progreso durante operaciones asíncronas y devuelve el resultado, con estilos Material, Cupertino y adaptativo incluidos.","md",[597],{"type":598,"url":599},"pub_dev","https:\u002F\u002Fpub.dev\u002Fpackages\u002Fflutter_future_progress_dialog",{},"Paquete ligero de Flutter que muestra un diálogo de progreso durante el trabajo asíncrono y devuelve el resultado. Material, Cupertino y adaptativo.","Diálogo de progreso en Flutter para tareas asíncronas","Espera la operación, muestra el diálogo y recibe el resultado. Un paquete Flutter pequeño para el indicador que reescribes una y otra vez.","\u002Fopen-source\u002Fflutter-progress-dialog",{"type":606,"company":607,"name":608},"github","nerdy-pro","flutter-progress-dialog",{"title":169,"description":594},"open-source\u002Fflutter-progress-dialog",[41,18],"2026-03-17","yp5RTR1pqFf1Lg1xEYClVv2xs66oeapqNjrjT0aUz5o",{"forks":615,"stars":426,"contributors":616,"last_release":627,"issues":615,"has_contribution_guide":628,"license":629,"last_updated":630,"watchers":426},0,[617,622],{"login":618,"profile_url":619,"avatar_url":620,"contributions":621},"thenixan","https:\u002F\u002Fgithub.com\u002Fthenixan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F3602098?v=4",100,{"login":623,"profile_url":624,"avatar_url":625,"contributions":626},"OleksandrFedyay","https:\u002F\u002Fgithub.com\u002FOleksandrFedyay","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F17413471?v=4",33,"v2.0.0",false,"MIT","2026-08-19T17:15:57Z"]