How to write a double back button pressed to exit app using flutter

前端 未结 9 473
野趣味
野趣味 2020-12-24 13:39

I\'m new to flutter, and I saw many android apps can exit when double press back button.

The first time press back button, app shows a toast\"press again to exit app

相关标签:
9条回答
  • 2020-12-24 14:11

    You can try this package.

    Inside a Scaffold that wraps all your Widgets, place the DoubleBackToCloseApp passing a 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'),
              ),
            ),
          ),
        );
      }
    }
    

    Old answer

    You can also opt for a solution involving SnackBar. It's not as simple as Andrey Turkovsky's answer, but it's quite more elegant and you won't depend on a library.

    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;
      }
    }
    
    0 讨论(0)
  • 2020-12-24 14:12

    Simply use double_back_to_close_app library

    https://pub.dev/packages/double_back_to_close_app

    Add double_back_to_close_app under dependencies in pubspec.yaml file

    dependencies:
      double_back_to_close_app: ^1.2.0
    

    Here example code

    import 'package:double_back_to_close_app/double_back_to_close_app.dart';
    import 'package:flutter/material.dart';
    
    void main() => runApp(Example());
    
    class Example extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            body: DoubleBackToCloseApp(
              snackBar: const SnackBar(
                content: Text('Tap back again to leave'),
              ),
              child: Center(
                child: OutlineButton(
                  child: const Text('Tap to simulate back'),
                  // ignore: invalid_use_of_protected_member
                  onPressed: WidgetsBinding.instance.handlePopRoute,
                ),
              ),
            ),
          ),
        );
      }
    }
    

    Just move your body contents to "DoubleBackToCloseApp's" child

    0 讨论(0)
  • 2020-12-24 14:13

    If the condition is that the user presses only twice, you can use the first solution of course. If you want to increase the number of times you click, you can use this solution. Where the user has to press 3 times within two seconds so he can get out

      DateTime currentBackPressTime;
      /// init counter of clicks
      int pressCount=1;
    

    then :

    Future<bool> onWillPop() async {
    
      DateTime now = DateTime.now();
    
    
    
    /// here I check if number of clicks equal 3
    if(pressCount!=3){
    
      ///should be assigned at the first click.
      if(pressCount ==1 )
        currentBackPressTime = now;
      pressCount+=1;
    
    
      return Future.value(false);
      }else{
      if (currentBackPressTime == null ||
          now.difference(currentBackPressTime) > Duration(seconds: 2)) {
    
    
        currentBackPressTime = now;
        pressCount=0;
    
      
        return Future.value(false);
      }
     }
    
    
     return Future.value(true);
    }
    
    0 讨论(0)
  • 2020-12-24 14:17

    This is my solution, you can change backPressTotal value to the number of pressed you want!

    int backPressCounter = 0;
    int backPressTotal = 2;
    
    @override
    Widget build(BuildContext context) {
      return Scaffold(
        ...
        body: WillPopScope(child: getBody(), onWillPop: onWillPop),
      );
    }
    
    Future<bool> onWillPop() {
        if (backPressCounter < 2) {
          Fluttertoast.showToast(msg: "Press ${backPressTotal - backPressCounter} time to exit app");
          backPressCounter++;
          Future.delayed(Duration(seconds: 1, milliseconds: 500), () {
            backPressCounter--;
          });
          return Future.value(false);
        } else {
          return Future.value(true);
        }
    }
    
    0 讨论(0)
  • 2020-12-24 14:23

    The first time press back button, app shows a AlertDialog"press yes to exit app and press No to can't exit application". This is an example of my code (I've used '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;
          }
    
    0 讨论(0)
  • This is an example of my code (I've used "fluttertoast" for showing toast message, you can use snackbar or alert or anything else)

    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);
      }
    
    0 讨论(0)
提交回复
热议问题