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 }
|