如何在flutter中请求位置权限?我尝试过一些方法,但没有用

Sta*_*euh 0 flutter flutter-dependencies

它实际上是一个非常简单的应用程序,只询问位置。我对此进行了很多搜索,非常具有推测性的问题,每个人都有不同的说法,但我自己还无法解决。我想要的是,我想询问用户的位置权限。我将其添加到 pubspec.yaml 的依赖项中:

  permission_handler: ^5.0.1+1
Run Code Online (Sandbox Code Playgroud)

在 AndroidManifest.xml 中我添加了这些:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" ></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" ></uses-permission>
Run Code Online (Sandbox Code Playgroud)

然后我就这样编写了 main.dart。没有做任何其他事情:

import 'package:flutter/material.dart';
import 'package:permission_handler/permiission_handler.dart';

void main() => runApp(MaterialApp(home: MyHome()));

class _MyHomeState extends StatefulWidget {
  @override
  _MyHomeState createState() => _MyHomeState();
}

class _MyHomeState extends State<MyHome> {
  PermissionStatus _status;

  @override
  void initState() {
    super.initState();
    PermissionHandler()
        .checkPermissionStatus(PermissionGroup.locationWhenInUse)
        .then(_updateStatus);
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Column(
        children: <Widget>[
          Text('$_status'),
          SizedBox(height: 60),
          RaisedButton(
            child: Text('Ask Permission'),
            onPressed: _askPermission,
          )
        ], //<Widget>[]
      ),
    ); //Column, SafeArea
  }

  void _updateStatus(PermissionStatus status) {
    if (status != _status) {
      setState(() {
        _status = status;
      });
    }
  }

  void _askPermission() {
    PermissionHandler().requestPermissions(
        [PermissionGroup.locationWhenInUse]).then(_onStatusRequested);
  }

  void _onStatusRequested(Map<PermissionGroup, PermissionStatus> statuses) {
    final status = statuses[PermissionGroup.locationWhenInUse];
    //if (status != PermissionStatus.granted) {
      //PermissionHandler().openAppSettings();
    //} else { //Ignore this, this isn't important.
      _updateStatus(status);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我使用 flutter run ,它给出了很多错误。喜欢:

Invalid depfile: /home/xx/AndroidStudioProjects/flutter_app/.dart_tool/flutter_build/e9846fe3c39761c4693f6682f4c69be2/kernel_snapshot.d
Invalid depfile: /home/xxx/AndroidStudioProjects/flutter_app/.dart_tool/flutter_build/e9846fe3c39761c4693f6682f4c69be2/kernel_snapshot.d
Error: Could not resolve the package 'permission_handler' in 'package:permission_handler/permiission_handler.dart'.
lib/main.dart:11:7: Error: '_MyHomeState' is already declared in this scope.
class _MyHomeState extends State<MyHome> {                              
      ^^^^^^^^^^^^                                                      
lib/main.dart:6:7: Context: Previous declaration of '_MyHomeState'.     
class _MyHomeState extends StatefulWidget {                             
      ^^^^^^^^^^^^                                                      
lib/main.dart:59:1: Error: Expected a declaration, but got '}'.         
}                                                                       
^                                                                       
lib/main.dart:2:8: Error: Not found: 'package:permission_handler/permiission_handler.dart'
import 'package:permission_handler/permiission_handler.dart';           
       ^                                                                
lib/main.dart:8:3: Error: '_MyHomeState' isn't a type.                  
  _MyHomeState createState() => _MyHomeState();                         
  ^^^^^^^^^^^^                                                          
lib/main.dart:8:3: Context: This isn't a type.                          
  _MyHomeState createState() => _MyHomeState();                         
  ^^^^^^^^^^^^                                                          
lib/main.dart:11:34: Error: Type 'MyHome' not found.                    
class _MyHomeState extends State<MyHome> {                              
                                 ^^^^^^                                 
lib/main.dart:12:3: Error: Type 'PermissionStatus' not found.           
  PermissionStatus _status;                                             
  ^^^^^^^^^^^^^^^^                                                      
lib/main.dart:38:22: Error: Type 'PermissionStatus' not found.          
  void _updateStatus(PermissionStatus status) {                         
                     ^^^^^^^^^^^^^^^^                                   
lib/main.dart:51:31: Error: Type 'PermissionGroup' not found.           
  void _onStatusRequested(Map<PermissionGroup, PermissionStatus> statuses) {
                              ^^^^^^^^^^^^^^^                           
lib/main.dart:51:48: Error: Type 'PermissionStatus' not found.          
  void _onStatusRequested(Map<PermissionGroup, PermissionStatus> statuses) {
                                               ^^^^^^^^^^^^^^^^         
lib/main.dart:4:41: Error: Method not found: 'MyHome'.                  
void main() => runApp(MaterialApp(home: MyHome()));                     
                                        ^^^^^^                          
lib/main.dart:8:33: Error: Can't use '_MyHomeState' because it is declared more than once.
  _MyHomeState createState() => _MyHomeState();                         
                                ^                                       
lib/main.dart:12:3: Error: 'PermissionStatus' isn't a type.             
  PermissionStatus _status;                                             
  ^^^^^^^^^^^^^^^^                                                      
lib/main.dart:17:5: Error: The method 'PermissionHandler' isn't defined for the class '_MyHomeState#1'.
 - '_MyHomeState#1' is from 'package:flutter_app/main.dart' ('lib/main.dart').
Try correcting the name to the name of an existing method, or defining a method named 'PermissionHandler'.
    PermissionHandler()                                                 
    ^^^^^^^^^^^^^^^^^                                                   
lib/main.dart:18:32: Error: The getter 'PermissionGroup' isn't defined for the class '_MyHomeState#1'.
 - '_MyHomeState#1' is from 'package:flutter_app/main.dart' ('lib/main.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'PermissionGroup'.
        .checkPermissionStatus(PermissionGroup.locationWhenInUse)       
                               ^^^^^^^^^^^^^^^                          
lib/main.dart:38:22: Error: 'PermissionStatus' isn't a type.            
  void _updateStatus(PermissionStatus status) {                         
                     ^^^^^^^^^^^^^^^^                                   
lib/main.dart:47:5: Error: The method 'PermissionHandler' isn't defined for the class '_MyHomeState#1'.
 - '_MyHomeState#1' is from 'package:flutter_app/main.dart' ('lib/main.dart').
Try correcting the name to the name of an existing method, or defining a method named 'PermissionHandler'.
    PermissionHandler().requestPermissions(                             
    ^^^^^^^^^^^^^^^^^                                                   
lib/main.dart:48:10: Error: The getter 'PermissionGroup' isn't defined for the class '_MyHomeState#1'.
 - '_MyHomeState#1' is from 'package:flutter_app/main.dart' ('lib/main.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'PermissionGroup'.
        [PermissionGroup.locationWhenInUse]).then(_onStatusRequested);  
         ^^^^^^^^^^^^^^^                                                
lib/main.dart:51:31: Error: 'PermissionGroup' isn't a type.             
  void _onStatusRequested(Map<PermissionGroup, PermissionStatus> statuses) {
                              ^^^^^^^^^^^^^^^                           
lib/main.dart:51:48: Error: 'PermissionStatus' isn't a type.            
  void _onStatusRequested(Map<PermissionGroup, PermissionStatus> statuses) {
                                               ^^^^^^^^^^^^^^^^         
lib/main.dart:52:29: Error: The getter 'PermissionGroup' isn't defined for the class '_MyHomeState#1'.
 - '_MyHomeState#1' is from 'package:flutter_app/main.dart' ('lib/main.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'PermissionGroup'.
    final status = statuses[PermissionGroup.locationWhenInUse];   
Run Code Online (Sandbox Code Playgroud)

Ste*_*lli 6

您的代码存在一些问题:

  1. package:permission_handler/permiission_handler.dart应该:package:permission_handler/permission_handler.dart

class _MyHomeState extends StatefulWidget {
  @override
  _MyHomeState createState() => _MyHomeState();
}
Run Code Online (Sandbox Code Playgroud)

应该:

class MyHome extends StatefulWidget {
  @override
  _MyHomeState createState() => _MyHomeState();
}
Run Code Online (Sandbox Code Playgroud)
  1. 文件末尾有一个额外的括号。

遵循完整更正的源代码:

import 'package:permission_handler/permission_handler.dart';
import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(home: MyHome()));

class MyHome extends StatefulWidget {
  @override
  _MyHomeState createState() => _MyHomeState();
}

class _MyHomeState extends State<MyHome> {
  PermissionStatus _status;

  @override
  void initState() {
    super.initState();
    PermissionHandler()
        .checkPermissionStatus(PermissionGroup.locationWhenInUse)
        .then(_updateStatus);
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Column(
        children: <Widget>[
          Text('$_status'),
          SizedBox(height: 60),
          RaisedButton(
            child: Text('Ask Permission'),
            onPressed: _askPermission,
          )
        ], //<Widget>[]
      ),
    ); //Column, SafeArea
  }

  void _updateStatus(PermissionStatus status) {
    if (status != _status) {
      setState(() {
        _status = status;
      });
    }
  }

  void _askPermission() {
    PermissionHandler().requestPermissions(
        [PermissionGroup.locationWhenInUse]).then(_onStatusRequested);
  }

  void _onStatusRequested(Map<PermissionGroup, PermissionStatus> statuses) {
    final status = statuses[PermissionGroup.locationWhenInUse];
    //if (status != PermissionStatus.granted) {
    //PermissionHandler().openAppSettings();
    //} else { //Ignore this, this isn't important.
    _updateStatus(status);
  }
}
Run Code Online (Sandbox Code Playgroud)