Saltar al contenido

Cómo escribir un doble botón de retroceso presionado para salir de la aplicación usando flutter

Solución:

Este es un ejemplo de mi código (he usado “fluttertoast” para mostrar el mensaje de tostadas, puede usar snackbar o alert o cualquier otra cosa)

DateTime currentBackPressTime;

@override
Widget build(BuildContext context) {
  return Scaffold(
    ...
    body: WillPopScope(child: getBody(), onWillPop: onWillPop),
  );
}

Future<bool> onWillPop() {
    DateTime now = DateTime.now();
    if (currentBackPressTime == null || 
        now.difference(currentBackPressTime) > Duration(seconds: 2)) {
      currentBackPressTime = now;
      Fluttertoast.showToast(msg: exit_warning);
      return Future.value(false);
    }
    return Future.value(true);
  }

Puedes probar este paquete.

Dentro de una Scaffold que envuelve todos sus widgets, coloque el DoubleBackToCloseApp pasando un SnackBar:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: DoubleBackToCloseApp(
          child: Home(),
          snackBar: const SnackBar(
            content: Text('Tap back again to leave'),
          ),
        ),
      ),
    );
  }
}

Respuesta antigua

También puede optar por una solución que implique SnackBar. No es tan simple como la respuesta de Andrey Turkovsky, pero es bastante más elegante y no dependerá de una biblioteca.

class _FooState extends State<Foo> {
  static const snackBarDuration = Duration(seconds: 3);

  final snackBar = SnackBar(
    content: Text('Press back again to leave'),
    duration: snackBarDuration,
  );

  DateTime backButtonPressTime;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // The BuildContext must be from one of the Scaffold's children.
      body: Builder(
        builder: (context) {
          return WillPopScope(
            onWillPop: () => handleWillPop(context),
            child: Text('Place your child here'),
          );
        },
      ),
    );
  }

  Future<bool> handleWillPop(BuildContext context) async {
    final now = DateTime.now();
    final backButtonHasNotBeenPressedOrSnackBarHasBeenClosed =
        backButtonPressTime == null ||
            now.difference(backButtonPressTime) > snackBarDuration;

    if (backButtonHasNotBeenPressedOrSnackBarHasBeenClosed) {
      backButtonPressTime = now;
      Scaffold.of(context).showSnackBar(snackBar);
      return false;
    }

    return true;
  }
}

La primera vez que presione el botón Atrás, la aplicación muestra un AlertDialog “presione sí para salir de la aplicación y presione No para no poder salir de la aplicación”. Este es un ejemplo de mi código (he usado ‘AlertDialog’)

   @override
      Widget build(BuildContext context) {

        return new WillPopScope(
          onWillPop: _onBackPressed,
          child: DefaultTabController(
            initialIndex: _selectedIndex,
            length: choices.length,
            child: Scaffold(
              appBar: AppBar(

                ),
              ),

          ),
        );
      }
         Future<bool> _onBackPressed() {
        return showDialog(
          context: context,
          builder: (context) {
            return AlertDialog(
              title: Text('Are you sure?'),
              content: Text('Do you want to exit an App'),
              actions: <Widget>[
                FlatButton(
                  child: Text('No'),
                  onPressed: () {
                    Navigator.of(context).pop(false);
                  },
                ),
                FlatButton(
                  child: Text('Yes'),
                  onPressed: () {
                    Navigator.of(context).pop(true);
                  },
                )
              ],
            );
          },
        ) ?? false;
      }
¡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 *