Saltar al contenido

AlertDialog sin contexto en Flutter

Te sugerimos que pruebes esta solución en un ambiente controlado antes de enviarlo a producción, saludos.

Solución:

Solución sin bibliotecas de terceros ni almacenamiento BuildContext:

final navigatorKey = GlobalKey();

void main() => runApp(
  MaterialApp(
    home: HomePage(),
    navigatorKey: navigatorKey, // Setting a global key for navigator
  ),
);

class HomePage extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(),
      body: SafeArea(
        child: Center(
          child: Text('test')
        )
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: showMyDialog, // Calling the function without providing it BuildContext
      ),
    );
  


void showMyDialog() 
  showDialog(
    context: navigatorKey.currentContext,
    builder: (context) => Center(
      child: Material(
        color: Colors.transparent,
        child: Text('Hello'),
      ),
    )
  );

Después de configurar un global key para navegador (navigatorKey parámetro de MaterialApp clase), su estado actual se vuelve accesible desde cualquier parte del código. Podemos pasar su contexto a la showDialog función. Asegúrese de no usarlo antes de que se construya el primer marco, de lo contrario, el estado será null.

Básicamente, los diálogos son solo otro tipo de rutas como MaterialPageRoute o CupertinoPageRoute – Todos ellos se derivan de la ModalRoute la clase y sus instancias se insertan en NavigatorState. El contexto solo es necesario para obtener el estado actual del navegador. Se puede empujar una nueva ruta sin tener un contexto si tenemos un navegador global key:

navigatorKey.currentState.push(route)

Desafortunadamente, _DialogRoute clase (…flutterlibsrcwidgetsroutes.dart) utilizada en showDialog La función es privada e inaccesible, pero crea su propia clase de ruta de diálogo y la inserta en la pila del navegador.

ACTUALIZAR: Navigator.of El método se ha actualizado y ya no es necesario para pasar el contexto del subárbol.

La respuesta aceptada es incorrecta.

El cuadro de diálogo solo necesita el contexto para acceder a él a través de un estado de navegación heredado. Puede crear su propio cuadro de diálogo modificado o usar esta biblioteca para hacerlo.

https://pub.dev/packages/get

Con él, puede abrir un diálogo desde cualquier lugar de su código sin contexto haciendo esto:

Get.dialog(SimpleDialog());

Aquí tienes las comentarios y calificaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *