0

When google maps loads, location permission only asks to "Allow only while using the app". I want it to ask permission to allow all the time so that the location can be queried in the background by workmanger. How do I make it prompt as "Allow all the time"? Full code here. Thanks for reading. This should be pretty easy to figure out, sometimes I can get it to work on another github example here but somehow it breaks after I make changes.

import 'dart:math';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:location/location.dart' as loco;
import 'package:ungshowlocation/models/marker_collect_model.dart';
import 'package:ungshowlocation/widget/add_location.dart';
import 'package:ungshowlocation/widget/detail_marker.dart';
import 'package:ungshowlocation/widget/my_service.dart';

class ShowMap extends StatefulWidget {
  final double lat;
  final double lng;
  ShowMap({Key key, this.lat, this.lng}) : super(key: key);

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

class _ShowMapState extends State<ShowMap> {
  // Field
  double lat, lng;
  BitmapDescriptor policeIcon;
  List<Marker> list = List();
  List<String> listDocuments = List();
  final Set<Polyline> _polyline = {};
  GoogleMapController controller;
  List<LatLng> latlngSegment1 = List();
  List<LatLng> latlngSegment2 = List();
  static LatLng _lat1 = LatLng(45.19, -121.59);
  static LatLng _lat2 = LatLng(45.30, -122.20);
  static LatLng _lat3 = LatLng(45.11, -122.61);
  static LatLng _lat4 = LatLng(45.42, -122.62);
  static LatLng _lat5 = LatLng(45.34, -122.32);
  static LatLng _lat6 = LatLng(45.21, -122.2);
  bool _myLocationButtonEnabled = true;
  bool _myLocationEnabled = true;

  // Method

  @override
  void initState() {
    super.initState();
    // findLatLng();

    readDataFromFirebase();

    setState(() {
      lat = widget.lat;
      lng = widget.lng;
      latlngSegment1.add(_lat1);
      latlngSegment1.add(_lat2);
      latlngSegment1.add(_lat3);
      latlngSegment1.add(_lat4);

      //line segment 2
      latlngSegment2.add(_lat4);
      latlngSegment2.add(_lat5);
      latlngSegment2.add(_lat6);
      latlngSegment2.add(_lat1);
    });
  }

    Future<Null> readDataFromFirebase() async {
    print('###############readDataFromFirebase Work####################');

    Firestore firestore = Firestore.instance;
    CollectionReference collectionReference =
    firestore.collection('usertest');
    await collectionReference.snapshots().listen((event) {
      List<DocumentSnapshot> snapshots = event.documents;
      for (var map in snapshots) {
        MarkerCollectModel model = MarkerCollectModel.fromMap(map.data);
        String nameDocument = map.documentID;
        listDocuments.add(nameDocument);
        print('Name ==>> ${model.name}');
        Marker marker = createMarker(model, nameDocument);
        setState(() {
          list.add(marker);
          print('myMarkers set lenght ==>> ${myMarkers().length}');
        });
      }
    });
  }

  Marker createMarker(MarkerCollectModel markerCollectModel, String nameDocument) {
    Marker marker;
    Random random = Random();
    int i = random.nextInt(100);
    String idString = 'id$i';

    marker = Marker(
      markerId: MarkerId(idString),
      position: LatLng(markerCollectModel.lat, markerCollectModel.lng),
      infoWindow: InfoWindow(
          title: markerCollectModel.name, snippet: markerCollectModel.detail),
      onTap: () {
        print('You Tab Name ==>> ${markerCollectModel.name}');

        MaterialPageRoute route = MaterialPageRoute(
          builder: (context) => DetailMarker(
            model: markerCollectModel,nameDocument: nameDocument,
          ),
        );
        Navigator.push(context, route);
      },
    );
    return marker;
  }

  Future<void> findLatLng() async {
    loco.LocationData locationData = await findLocation();
    setState(() {
      lat = locationData.latitude;
      lng = locationData.longitude;
      print('lat =>>> $lat, lng ===>> $lng');
    });
  }

  Future<loco.LocationData> findLocation() async {
    var location = loco.Location();
    try {
      return await location.getLocation();
    } catch (e) {
      print('e location = ${e.toString()}');
      return null;
    }
  }

  Set<Marker> myMarkers() {
    list.add(localMarker());
    return list.toSet();
  }

  Marker localMarker() {
    return Marker(
      infoWindow: InfoWindow(
      ),
      markerId: MarkerId('myLocotion'),
    );
  }

  Widget showMap() {
    print('latlng on showmap ===>>> $lat, $lng');
    LatLng centerLatLng = LatLng(lat, lng);
    CameraPosition cameraPosition =
    CameraPosition(target: centerLatLng, zoom: 16.0);

    return Stack(
      children: <Widget>[
        GoogleMap(
          initialCameraPosition: cameraPosition,
          mapType: MapType.normal,
          markers: myMarkers(),
          polylines: _polyline,
          myLocationEnabled: _myLocationEnabled,
          myLocationButtonEnabled: _myLocationButtonEnabled,
          onMapCreated: _onMapCreated,
        ),
        // addButton(),
      ],
    );
  }

  Widget addButton() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.end,
      children: <Widget>[
        Column(
          mainAxisAlignment: MainAxisAlignment.end,
          children: <Widget>[
            Container(
              margin: EdgeInsets.only(
                right: 40.0,
                bottom: 40.0,
              ),
              child: FloatingActionButton(
                onPressed: () {
                  MaterialPageRoute route = MaterialPageRoute(
                      builder: (value) => MyService(
                        currentWidget: PageWidget(
                        ),
                      ));
                  Navigator.of(context)
                      .pushAndRemoveUntil(route, (value) => false);
                },
                child: Icon(
                  Icons.add_circle,
                  size: 36.0,
                ),
              ),
            ),
          ],
        ),
      ],
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: lat == null
          ? Center(
        child: CircularProgressIndicator(),
      )
          : showMap(),
    );
  }
  void _onMapCreated(GoogleMapController controllerParam) {
    setState(() {
      controller = controllerParam;
      _polyline.add(Polyline(
        polylineId: PolylineId('line1'),
        visible: true,
        //latlng is List<LatLng>
        points: latlngSegment1,
        width: 2,
        color: Colors.blue,
      ));

      //different sections of polyline can have different colors
      _polyline.add(Polyline(
        polylineId: PolylineId('line2'),
        visible: true,
        //latlng is List<LatLng>
        points: latlngSegment2,
        width: 2,
        color: Colors.red,
      ));
    });
  }
}
giroprotagonist
  • 138
  • 1
  • 3
  • 15
  • 1
    check this https://stackoverflow.com/questions/64028142/flutter-always-allow-location-on-android – Shalabyer Jan 27 '21 at 02:32
  • Ah I'd read this dozens of times before but have failed to understand that it's just the reality of Android 11, thanks for reinforcing this, much appreciated. – giroprotagonist Jan 27 '21 at 02:49

0 Answers0