Search code examples
flutterpermissionslocationpermission-denied

How to keep asking location permission as long as the status is not granted-Flutter


I am trying to ask location permission of user in my project apps, so after user denied the permission I would like to keep showing pop up to ask location permission whenever user try to access a menu. I success to do that by using this function

trial() async {
    await Permission.locationAlways.request();
    print(Permission.locationAlways.status.then((value) {
      print("value:$value");
    }));
  }

but the problem is.. after the status is PermissionStatus.permanentlyDenied the pop up to ask location permission is stop showing. Is there a way to always ask permission as long as the permission is not granted or a way to open up setting of location permission?


Solution

  • Please refer to below code

    class MyApp extends StatelessWidget {
      MyApp({Key key}) : super(key: key);
    
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primaryColor: Color(0xfff00B074),
            textTheme: const TextTheme(
              bodyText1: TextStyle(
                  fontSize: 18.0,
                  fontFamily: 'Barlow-Medium',
                  color: Color(0xff464255)),
            ),
          ),
          home: PermissionHandlerScreen(),
        );
      }
    }
    
    class PermissionHandlerScreen extends StatefulWidget {
      @override
      _PermissionHandlerScreenState createState() =>
          _PermissionHandlerScreenState();
    }
    
    class _PermissionHandlerScreenState extends State<PermissionHandlerScreen> {
      @override
      void initState() {
        super.initState();
        permissionServiceCall();
      }
    
      permissionServiceCall() async {
        await permissionServices().then(
          (value) {
            if (value != null) {
              if (value[Permission.location].isGranted ) {
                /* ========= New Screen Added  ============= */
    
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(builder: (context) => SplashScreen()),
                );
              }
            }
          },
        );
      }
    
      /*Permission services*/
      Future<Map<Permission, PermissionStatus>> permissionServices() async {
        // You can request multiple permissions at once.
        Map<Permission, PermissionStatus> statuses = await [
          Permission.location,
         
          //add more permission to request here.
        ].request();
    
        if (statuses[Permission.location].isPermanentlyDenied) {
          await openAppSettings().then(
            (value) async {
              if (value) {
                if (await Permission.location.status.isPermanentlyDenied == true &&
                    await Permission.location.status.isGranted == false) {
                  // openAppSettings();
                  permissionServiceCall(); /* opens app settings until permission is granted */
                }
              }
            },
          );
        } else {
          if (statuses[Permission.location].isDenied) {
            permissionServiceCall();
          }
        }
        
        /*{Permission.camera: PermissionStatus.granted, Permission.storage: PermissionStatus.granted}*/
        return statuses;
      }
    
      @override
      Widget build(BuildContext context) {
        permissionServiceCall();
        return WillPopScope(
          onWillPop: () {
            SystemNavigator.pop();
          },
          child: Scaffold(
            body: Container(
              child: Center(
                child: InkWell(
                    onTap: () {
                      permissionServiceCall();
                    },
                    child: Text("Click here to enable Enable Permission Screen")),
              ),
            ),
          ),
        );
      }
    }
    
    class SplashScreen extends StatelessWidget {
      const SplashScreen({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return WillPopScope(
          onWillPop: () {
            SystemNavigator.pop();
          },
          child: Scaffold(
            body: Center(
              child: Text(
                "Splash Screen",
              ),
            ),
          ),
        );
      }
    }