【问题标题】:Google maps flutter user location谷歌地图颤动用户位置
【发布时间】:2020-07-07 06:06:44
【问题描述】:

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

enter image description here

我正在开发一种交付应用程序,但为了像 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()

标签: google-maps flutter geolocation


【解决方案1】:

我认为,根据您的代码,您应该在 _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" />

还有我的提示,冷重启您的应用(停止调试并从头开始再次调试)。

【讨论】:

  • 好的,然后通过接受这个答案来关闭这个答案。快乐创造
  • 如何使相机移动到新位置?
  • 请创建一个新问题 :)
【解决方案2】:
@override
  void initState() {
    _getCurrentLocation();
    super.initState();
  }

【讨论】:

    【解决方案3】:

    如果你使用这个插件,还需要像这样在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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 2020-10-23
      • 2012-11-25
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多