admin
2021-11-25 70a344485bd0c9b68ac91f72ed23ec5bfa998b09
lib/utils/location_util.dart
@@ -1,13 +1,21 @@
import 'dart:async';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
import 'package:flutter_bmflocation/bdmap_location_flutter_plugin.dart';
import 'package:flutter_bmflocation/flutter_baidu_location.dart';
import 'package:flutter_bmflocation/flutter_baidu_location_android_option.dart';
import 'package:flutter_bmflocation/flutter_baidu_location_ios_option.dart';
import 'package:locations/api/http.dart';
import 'package:locations/model/map/location_model.dart';
import 'package:locations/utils/user_util.dart';
import 'package:permission_handler/permission_handler.dart';
typedef OnLocationCallback = void Function(Map map);
import 'global.dart';
typedef OnLocationCallback = void Function(LocationState state, Map? map);
class LocationUtil {
  static LocationFlutterPlugin? _locationFlutterPlugin=LocationFlutterPlugin();
  static LocationFlutterPlugin? _locationFlutterPlugin =
      LocationFlutterPlugin();
  static Map _getAndroidOption(int scanspan) {
    BaiduLocationAndroidOption androidOption = new BaiduLocationAndroidOption();
@@ -47,7 +55,7 @@
    /// 可选,设置发起定位请求的间隔,int类型,单位ms
    /// 如果设置为0,则代表单次定位,即仅定位一次,默认为0
    /// 如果设置非0,需设置1000ms以上才有效
    // androidOption.setLocationPurpose(BDLocationPurpose.SignIn);
    androidOption.setLocationPurpose(BDLocationPurpose.Sport);
    /// 可选,设置场景定位参数,包括签到场景、运动场景、出行场景,可选值如下:
    /// 签到场景: BDLocationPurpose.SignIn
@@ -111,24 +119,41 @@
    return iosOption.getMap();
  }
  static void init(int scanSpan) {
    _locationFlutterPlugin!.prepareLoc(
        _getAndroidOption(scanSpan), _getIosOption());
  }
  static void startLocation(OnLocationCallback callback) async {
  static Future<StreamSubscription<Map<String, Object>?>?> startLocation(
      int scanSpan, OnLocationCallback callback) async {
    final status = await requestLocationPermission();
    if (status.isGranted) {
      print("定位权限申请通过");
    } else {
      print("定位权限申请不通过");
      callback(LocationState.permission_denied, null);
      return null;
    }
    StreamSubscription<Map<String, Object>?> subscription =
        _locationFlutterPlugin!
            .onResultCallback()
            .listen((Map<String, Object>? result) {
      print("定位结果:$result");
      Global.currentPosition = BMFCoordinate.fromMap(result!);
      UserUtil.isLogin().then((value) {
        if (value) {
          LocationApiUtil.uploadLocation(BaiduLocation.fromJson(result));
        }
      });
      callback(LocationState.success, result);
      if (scanSpan == 0) {
        stopLocation();
      }
    });
    _locationFlutterPlugin!
        .prepareLoc(_getAndroidOption(scanSpan), _getIosOption());
    _locationFlutterPlugin!.startLocation();
    Stream<Map<String, Object>?> result =
        _locationFlutterPlugin!.onResultCallback();
    await for (Map<String, Object>? s in result) {
      callback(s!);
    }
    return subscription;
  }
  ///请求定位权限
@@ -136,4 +161,12 @@
    final status = await Permission.location.request();
    return status;
  }
  static stopLocation() {
    if (_locationFlutterPlugin != null) {
      _locationFlutterPlugin!.stopLocation();
}
  }
}
enum LocationState { success, permission_denied }