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());