admin
2022-01-12 8327000a0cce5e47226372e0e25c1e6faec497e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import 'dart:async';
import 'dart:convert';
 
import 'package:flutter/services.dart';
import 'package:locations/api/http.dart';
import 'package:locations/model/map/location_model.dart';
import 'package:locations/model/user/user_info.dart';
import 'package:locations/utils/permission_util.dart';
import 'package:locations/utils/string_util.dart';
import 'package:locations/utils/ui_utils.dart';
import 'package:locations/utils/user_util.dart';
import 'package:permission_handler/permission_handler.dart';
 
import 'global.dart';
 
typedef OnLocationCallback = void Function(
    LocationState state, SimpleLocation? map);
 
class LocationUtil {
  static const messageChannel =
      BasicMessageChannel('LocationUtil', StandardMessageCodec());
 
  static Future startLocation(int scanSpan, OnLocationCallback callback) async {
    final status = await requestLocationPermission();
    if (status.isGranted) {
      print("定位权限申请通过");
    } else {
      print("定位权限申请不通过");
      callback(LocationState.permission_denied, null);
      return null;
    }
 
    dynamic value = await messageChannel.send("");
    if (value != null) {
      try {
        Map<String, dynamic> valueMap = jsonDecode(jsonEncode(value));
        double lat = double.parse(valueMap["lat"]!.toString());
        double lng = double.parse(valueMap["lng"]!.toString());
        String? address;
        String? addressDetail;
        if (valueMap["address"] != null) {
          address = valueMap["address"].toString();
        }
 
        if (valueMap["addressDetail"] != null) {
          addressDetail = valueMap["addressDetail"].toString();
        }
 
        if (StringUtil.isNullOrEmpty(address)) {
          Map<String, dynamic>? map = await LocationApiUtil.geoCode(lat, lng);
          if (map!["code"] == 0) {
            String? address = map["data"];
            Global.currentPosition = SimpleLocation(
                latitude: lat,
                longitude: lng,
                address: address,
                addressDetail: addressDetail);
          }
        } else {
          Global.currentPosition = SimpleLocation(
              latitude: lat,
              longitude: lng,
              address: address,
              addressDetail: addressDetail);
        }
 
        UserUtil.isLogin().then((value) {
          if (value) {
            LocationApiUtil.uploadLocation(Global.currentPosition!);
          }
        });
        callback(LocationState.success, Global.currentPosition!);
      } catch (e) {
        // ToastUtil.toast("位置处理异常:$e");
      }
    }
  }
 
  ///请求定位权限
  static Future<PermissionStatus> requestLocationPermission() async {
    final status = await PermissionUtil.openPermission(
        PermissionUtil.getLocationPermission());
    return status;
  }
}
 
enum LocationState { success, permission_denied }