谷歌地图Flutter用户位置

3

它甚至没有显示请求访问用户位置的权限

在此输入图像描述

我正在开发一种类似于Uber的即时送货应用程序,下面的代码是为了在加载时访问用户位置。问题是,代码没有显示任何错误,但加载后不显示谷歌地图,只显示白色背景。

 import 'dart:async';

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:isntadelivery/Signin.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:geolocator/geolocator.dart';


import 'package:permission_handler/permission_handler.dart' as Thendelo;

import 'package:fluttertoast/fluttertoast.dart';
import 'package:permission_handler/permission_handler.dart';
// import 'package';

class Homepage extends StatefulWidget {
  Homepage({Key key}) : super(key: key);

  @override
  _HomepageState createState() => _HomepageState();
}

class _HomepageState extends State<Homepage> {
 GoogleMapController _controller;

    GoogleMapController mapController;
  
      
  Position position;
  Widget _child;

  Future<void> getpermission() async {
    PermissionStatus permission = await PermissionHandler()
        .checkPermissionStatus(PermissionGroup.location);

    if (permission == PermissionStatus.denied) {
      await PermissionHandler()
          .requestPermissions([PermissionGroup.locationAlways]);
    }

    var geolocater = new Geolocator();
    GeolocationStatus geolocationStatus =
        await geolocater.checkGeolocationPermissionStatus();
    switch (geolocationStatus) {
      case GeolocationStatus.denied:
        showToast('denied');
        break;
      case GeolocationStatus.disabled:
        showToast('disabled');
        break;
      case GeolocationStatus.restricted:
        showToast('restricted');
        break;
      case GeolocationStatus.unknown:
        showToast('unknown');
        break;
      case GeolocationStatus.granted:
        showToast('Access granted');
        _getCurrentLocation();
    }
  }

  Set<Marker> _createMarker() {
    return <Marker>[
      Marker(
          markerId: MarkerId('home'),
          position: LatLng(position.latitude, position.longitude),
          icon: BitmapDescriptor.defaultMarker,
          infoWindow: InfoWindow(title: 'Current Location'))
    ].toSet();
  }

  void showToast(message) {
    Fluttertoast.showToast(
        msg: message,
        toastLength: Toast.LENGTH_SHORT,
        gravity: ToastGravity.BOTTOM,
        // timeInSecFor Ios: 1,
        backgroundColor: Colors.red,
        textColor: Colors.white,
        fontSize: 16.0);
  }

  void _setStyle(GoogleMapController controller) async {
    String value = await DefaultAssetBundle.of(context)
        .loadString('assets/map_style.json');
    controller.setMapStyle(value);
  }

  Widget _mapWidget() {
    return GoogleMap(
      mapType: MapType.normal,
      markers: _createMarker(),
      initialCameraPosition: CameraPosition(
        target: LatLng(position.latitude, position.longitude),
        zoom: 12.0,
      ),
      onMapCreated: (GoogleMapController controller) {
        _controller = controller;
        //  _controller.complete(controller);
        _setStyle(controller);
      },
    );
  }
  //map style variable

  void _getCurrentLocation() async {
    Position res = await Geolocator().getCurrentPosition();
    setState(() {
      position = res;
      _child = _mapWidget();
    });
  }

  // singoutmethod
  signOutGoogle() async {
    await googleSignIn.signOut();
    print("User Sign Out");
  }

  // firebase authorisation
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;

  final GoogleSignIn googleSignIn = GoogleSignIn();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: _child,
      drawer: Drawer(
        child: ListView(
          // Important: Remove any padding from the ListView.
          padding: EdgeInsets.zero,
          children: <Widget>[
            UserAccountsDrawerHeader(
              accountName: new Text('Thabelo Mutshinyani'),
              accountEmail: new Text('mutshinyanit@gmail.com'),
              currentAccountPicture: new CircleAvatar(),
            ),
            ListTile(
              leading: Icon(Icons.person_outline),
              title: Text('Update Profile'),
              onTap: () {
                // Update the state of the app
                // ...
                // Then close the drawer
                Navigator.pop(context);
              },
            ),
            ListTile(
              leading: Icon(Icons.payment),
              title: Text('payment details'),
              onTap: () {
                // Update the state of the app
                // ...
                // Then close the drawer
                Navigator.pop(context);
              },
            ),
            ListTile(
              leading: Icon(Icons.settings),
              title: Text('Settings'),
              onTap: () {
                // Update the state of the app
                // ...
                // Then close the drawer
                Navigator.pop(context);
              },
            ),
            ListTile(
              leading: Icon(Icons.exit_to_app),
              title: Text('LogOut'),
              onTap: () {
                signOutGoogle().whenComplete(() {
                  Navigator.of(context).push(
                    MaterialPageRoute(
                      builder: (context) {
                        return Signin();
                      },
                    ),
                  );
                });
                // Update the state of the app
                // ...
                // Then close the drawer
                Navigator.pop(context);
              },
            ),
          ],
        ),
      ),
    );
  }
}

在你的代码中,我没有找到initState()方法,请确保在initState()方法中调用getpermission()方法。 - Shudipto Trafder
3个回答

3

根据你的代码,我认为你应该在_getCurrentLocation()中添加desiredAccuracy。像这样:

  void _getCurrentLocation() async {
    Position res = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
    setState(() {
      position = res;
      _child = _mapWidget();
    });
  }

为了在应用程序开始时运行_getCurrentLocation()函数,您应该将其包装在initState方法中。

在您的StatefulWidget类中添加:

  @override
  void initState() {
    _getCurrentLocation();
    super.initState();
  }

然后在您使用的设备或模拟器中添加位置权限。将以下代码行添加到 AndroidManifest.xml 文件中。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Example

我的建议是,冷启动你的应用程序(停止调试并从头开始重新调试)。

好的,那就接受这个答案来结束这个问题。祝你创作愉快。 - hisam
如何使相机动画移动到新位置? - Thabelo Mutshinyani
请创建一个新的问题 :) - hisam

1
如果您使用此插件,对于iOS系统,您还需要在info.plist中添加权限,如下所示,请复制并粘贴它。
<key>NSLocationWhenInUseUsageDescription</key>
        <string>This app needs location when in use</string>
        <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
        <string>Always and when in use!</string>
        <key>NSLocationUsageDescription</key>
        <string>Older devices need location.</string>
        <key>NSLocationAlwaysUsageDescription</key>
        <string>Can I have location always?</string>

针对Android

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

0
@override
  void initState() {
    _getCurrentLocation();
    super.initState();
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接