import 'dart:async'; import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:geolocator/geolocator.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/retrofit/data/address.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/view_widget/request_permission.dart'; import 'package:intl/intl.dart'; import 'package:permission_handler/permission_handler.dart' as PH; import 'font_weight.dart'; class LocationInstance { static LocationInstance _instance; LocationInstance._internal() {} static LocationInstance getInstance() { if (_instance == null) { _instance = LocationInstance._internal(); } return _instance; } Future startLocation( context, Function(Position locationData) locationCallback) async { LocationPermission permissionStatus = await Geolocator.checkPermission(); if (permissionStatus == LocationPermission.denied) { // permissionStatus = await Geolocator.requestPermission(); showTipsAlertDialog(context); return false; } if (permissionStatus == LocationPermission.denied) { showTipsAlertDialog(context); return false; } if (permissionStatus == LocationPermission.deniedForever) { showTipsAlertDialog(context); return false; } if (permissionStatus == LocationPermission.whileInUse || permissionStatus == LocationPermission.always) { bool isNext = true; Future.delayed(Duration(seconds: 5), () { if (isNext) { EasyLoading.dismiss(); } }); Position locationData = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.medium, timeLimit: const Duration(seconds: 30), forceAndroidLocationManager: true, ); isNext = false; locationCallback.call(locationData); } return true; } void stopLocation() {} enableLocation(context) { showCupertinoDialog( context: context, builder: (context) { return RequestPermission( "assets/image/icon_permission_location_bg.webp", S.of(context).nindingweigongnengweikaiqi, S.of(context).weilexiangnintuijianfujindemendianxinxi, S.of(context).dakaidingwei, (result) async { if (result) { // final AndroidIntent intent = AndroidIntent( // action: 'action_location_source_settings', // package: "com.zsw.huixiang", // ); // await intent.launch(); Geolocator.openLocationSettings(); // startLocation(); } }, heightRatioWithWidth: 0.82, ); }, ); } requestDialog(context, Function(Position result) locationCallback) { showCupertinoDialog( context: context, builder: (context) { return RequestPermission( "assets/image/icon_permission_location_bg.webp", S.of(context).nindingweiquanxianweiyunxu, S.of(context).weilexiangnintuijianfujindemendianxinxi, S.of(context).kaiqiquanxian, (result) async { if (result) { await PH.openAppSettings(); if ((await Geolocator.checkPermission()) == LocationPermission.whileInUse || (await Geolocator.checkPermission()) == LocationPermission.always) { startLocation(context, locationCallback); } } }, heightRatioWithWidth: 0.82, ); }, ); } ///定位权限说明弹窗 showTipsAlertDialog(context) async { //显示对话框 showDialog( context: context, barrierDismissible: false, barrierColor: null, builder: (BuildContext context) { return Column( children: [ Container( width: double.infinity, padding: EdgeInsets.all(15), margin: EdgeInsets.all(15), decoration: new BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(10), ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Icon( Icons.location_on_outlined, color: Colors.black, size: 22, ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text( // "访问精确地理位置信息权限说明", "位置权限使用说明", style: TextStyle( fontSize: 18.sp, fontWeight: MyFontWeight.regular, color: Colors.black, ), ), SizedBox( height: 3.h, ), Text( // "为了向您推荐附近的门店信息,推荐您在使用期间让我们使用位置信息,不授权该权限不影响app正常使用。", "为了向您推荐附近的门店信息,推荐您在使用期间让我们使用位置信息", style: TextStyle( fontSize: 13.sp, height: 1.2, fontWeight: MyFontWeight.regular, color: Colors.black, ), ), ], ), ), ], ), ) ], mainAxisSize: MainAxisSize.min, ); }, ); await Geolocator.requestPermission(); Navigator.of(context).pop(); } ///定位权限说明和申请弹窗 showAlertDialog(context) { //显示对话框 showDialog( context: context, barrierDismissible: true, barrierColor: null, builder: (BuildContext context) { return Column( children: [ Container( width: double.infinity, padding: EdgeInsets.all(15), margin: EdgeInsets.all(15), decoration: new BoxDecoration( color: Colors.black.withOpacity(0.6), borderRadius: BorderRadius.circular(10), ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text( // "访问精确地理位置信息权限说明", "定位服务未开启", style: TextStyle( fontSize: 18.sp, fontWeight: MyFontWeight.regular, color: Colors.white, ), ), SizedBox( height: 3.h, ), Text( // "为了向您推荐附近的门店信息,推荐您在使用期间让我们使用位置信息,不授权该权限不影响app正常使用。", "开启后才能提供更详细的定位服务哦!", style: TextStyle( fontSize: 13.sp, fontWeight: MyFontWeight.regular, color: Colors.white, ), ), ], ), ), GestureDetector( child: Container( child: Text( "去开启", style: TextStyle( fontSize: 15.sp, fontWeight: MyFontWeight.regular, color: Colors.white, ), ), margin: EdgeInsets.symmetric( horizontal: 15.w, vertical: 25.h), padding: EdgeInsets.symmetric(vertical: 2.h, horizontal: 10.w), decoration: BoxDecoration( color: Colors.green, borderRadius: BorderRadius.circular(100), ), ), onTap: () async { await PH.openAppSettings(); if ((await Geolocator.checkPermission()) == LocationPermission.whileInUse || (await Geolocator.checkPermission()) == LocationPermission.always) Navigator.of(context).pop(); }, behavior: HitTestBehavior.opaque, ), GestureDetector( behavior: HitTestBehavior.opaque, child: Container( child: Icon( Icons.close, color: Colors.white.withOpacity(0.8), size: 12, ), decoration: BoxDecoration( color: Colors.black.withOpacity(0.8), borderRadius: BorderRadius.circular(100), ), padding: EdgeInsets.all(5), ), onTap: () { Navigator.of(context).pop(); }, ) ], ), ) ], mainAxisSize: MainAxisSize.min, ); }, ); } ///计算距离(当前位置到店位置直线距离) static Future calculateDistance( Position bmfCoordinate, Position myLatLng, {bool isMi = false}) async { double mi = Geolocator.distanceBetween( bmfCoordinate.latitude, bmfCoordinate.longitude, myLatLng.latitude, myLatLng.longitude, ); NumberFormat numberFormat = NumberFormat("#.#"); return "${numberFormat.format(mi / (isMi ? 1 : 1000))}"; } // ///坐标系转换(高德转百度) // static Future coordConvert(Latlng latLng) async { // return BMFCalculateUtils.coordConvert( // coordinate: latLng, // fromType: BMF_COORD_TYPE.COMMON, // toType: BMF_COORD_TYPE.BD09LL); // } Future
getAddress(double lat, double lang) async { var result = await ApiService(Dio()).geocodeRegeo("$lat", "$lang"); print("address_result: $result"); if (result["status"] == "1" && result["regeocode"] != null && result["regeocode"]["addressComponent"] != null) { Address address = Address.fromJson({ "address": result["regeocode"]["formatted_address"], "area": result['regeocode']["addressComponent"]["district"], "city": result['regeocode']["addressComponent"]["city"], "latitude": lat, "longitude": lang, "province": result['regeocode']["addressComponent"]["province"], }); return address; } return null; } }