reason

迁移到百度地图

......@@ -3,6 +3,7 @@
package="pub.yiyan.parlando.Parlando">
<application
android:name=".MyApplication"
android:icon="@mipmap/ic_launcher"
android:label="Parlando"
android:requestLegacyExternalStorage="true"
......@@ -55,6 +56,9 @@
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="038a8a2d7280a244b5c51d517023ede3" />
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="WSVybPeSZqwIGLYXjN44mighexoFX6Dn" />
</application>
<queries>
......
package pub.yiyan.parlando.Parlando
import com.baidu.mapapi.base.BmfMapApplication
class MyApplication : BmfMapApplication() {
override fun onCreate() {
super.onCreate();
}
}
\ No newline at end of file
......@@ -25,6 +25,10 @@ import 'util/device_utils.dart';
import 'util/handle_error_utils.dart';
import 'util/log_utils.dart';
import 'util/theme_utils.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart'
show BMFMapSDK, BMF_COORD_TYPE;
import 'package:permission_handler/permission_handler.dart';
import 'package:flutter_bmflocation/flutter_bmflocation.dart';
///
/// 配置本地化的方法
......@@ -82,6 +86,27 @@ Future<void> main() async {
);
SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
}
/// 动态申请定位权限
requestPermission();
LocationFlutterPlugin myLocPlugin = LocationFlutterPlugin();
/// 设置用户是否同意SDK隐私协议
/// since 3.1.0 开发者必须设置
BMFMapSDK.setAgreePrivacy(true);
myLocPlugin.setAgreePrivacy(true);
// 百度地图sdk初始化鉴权
if (Platform.isIOS) {
myLocPlugin.authAK('rMsgMvYERM9zHDDdaipk34oBx7yoaGQh');
BMFMapSDK.setApiKeyAndCoordType(
'rMsgMvYERM9zHDDdaipk34oBx7yoaGQh', BMF_COORD_TYPE.BD09LL);
} else if (Platform.isAndroid) {
// Android 目前不支持接口设置Apikey,
// 请在主工程的Manifest文件里设置,详细配置方法请参考官网(https://lbsyun.baidu.com/)demo
BMFMapSDK.setCoordType(BMF_COORD_TYPE.BD09LL);
}
}
class MyApp extends StatelessWidget {
......@@ -205,3 +230,31 @@ class MyApp extends StatelessWidget {
);
}
}
// 动态申请定位权限
void requestPermission() async {
// 申请权限
bool hasLocationPermission = await requestLocationPermission();
if (hasLocationPermission) {
// 权限申请通过
} else {}
}
/// 申请定位权限
/// 授予定位权限返回true, 否则返回false
Future<bool> requestLocationPermission() async {
//获取当前的权限
var status = await Permission.location.status;
if (status == PermissionStatus.granted) {
//已经授权
return true;
} else {
//未授权则发起一次申请
status = await Permission.location.request();
if (status == PermissionStatus.granted) {
return true;
} else {
return false;
}
}
}
\ No newline at end of file
......
import 'dart:convert';
import 'package:Parlando/map/poi_search_model.dart';
import 'package:flutter/services.dart';
import 'amap_2d_view.dart';
import 'interface/amap_2d_controller.dart';
class AMap2DMobileController extends AMap2DController {
AMap2DMobileController(
int id,
this._widget,
) : _channel = MethodChannel('plugins.weilu/flutter_2d_amap_$id') {
_channel.setMethodCallHandler(_handleMethod);
}
final MethodChannel _channel;
final AMap2DView _widget;
Future<dynamic> _handleMethod(MethodCall call) async {
final String method = call.method;
switch (method) {
case 'poiSearchResult':
{
if (_widget.onPoiSearched != null) {
final Map args = call.arguments as Map<dynamic, dynamic>;
final List<PoiSearch> list = [];
for (var value
in (json.decode(args['poiSearchResult'] as String) as List)) {
list.add(PoiSearch.fromJsonMap(value as Map<String, dynamic>));
}
_widget.onPoiSearched!(list);
}
return Future<dynamic>.value('');
}
}
return Future<dynamic>.value('');
}
/// city:cityName(中文或中文全拼)、cityCode均可
@override
Future<void> search(String keyWord, {String city = ''}) async {
return _channel.invokeMethod('search', <String, dynamic>{
'keyWord': keyWord,
'city': city,
});
}
@override
Future<void> move(String lat, String lon) async {
return _channel
.invokeMethod('move', <String, dynamic>{'lat': lat, 'lon': lon});
}
@override
Future<void> location() async {
return _channel.invokeMethod('location');
}
}
import 'package:flutter/material.dart';
import 'amap_2d_view_state.dart';
import 'interface/amap_2d_controller.dart';
import 'poi_search_model.dart';
typedef AMap2DViewCreatedCallback = void Function(AMap2DController controller);
class AMap2DView extends StatefulWidget {
const AMap2DView({
Key? key,
this.isPoiSearch = true,
this.onPoiSearched,
this.onAMap2DViewCreated,
}) : super(key: key);
final bool isPoiSearch;
final AMap2DViewCreatedCallback? onAMap2DViewCreated;
final Function(List<PoiSearch>)? onPoiSearched;
@override
AMap2DViewState createState() => AMap2DViewState();
}
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'amap_2d_view.dart';
class AMap2DViewState extends State<AMap2DView> {
@override
Widget build(BuildContext context) {
return Text(
'$defaultTargetPlatform is not yet supported by the flutter_2d_amap plugin');
}
}
import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart'
show BMFMapSDK, BMF_COORD_TYPE;
class Flutter2dAMap {
static String _webKey = '';
static String get webKey => _webKey;
static Future<bool?> setApiKey(
{String iOSKey = '', String webKey = ''}) async {
if (kIsWeb) {
_webKey = webKey;
} else {
// 百度地图sdk初始化鉴权
if (Platform.isIOS) {
BMFMapSDK.setApiKeyAndCoordType(
'rMsgMvYERM9zHDDdaipk34oBx7yoaGQh', BMF_COORD_TYPE.BD09LL);
} else if (Platform.isAndroid) {
// Android 目前不支持接口设置Apikey,
// 请在主工程的Manifest文件里设置,详细配置方法请参考官网(https://lbsyun.baidu.com/)demo
BMFMapSDK.setCoordType(BMF_COORD_TYPE.BD09LL);
}
}
return Future.value(true);
}
/// 更新同意隐私状态,需要在初始化地图之前完成
static Future<void> updatePrivacy(bool isAgree) async {
if (kIsWeb) {
} else {
if (Platform.isIOS || Platform.isAndroid) {
BMFMapSDK.setAgreePrivacy(true);
}
}
}
}
abstract class AMap2DController {
/// city:cityName(中文或中文全拼)、cityCode均可
Future<void> search(String keyWord, {String city = ''});
Future<void> move(String lat, String lon);
Future<void> location();
}
class PoiSearch {
PoiSearch({
this.cityCode,
this.cityName,
this.provinceName,
this.title,
this.adName,
this.provinceCode,
this.latitude,
this.longitude,
});
PoiSearch.fromJsonMap(Map<String, dynamic> map)
: cityCode = map['cityCode'] as String?,
cityName = map['cityName'] as String?,
provinceName = map['provinceName'] as String?,
title = map['title'] as String?,
adName = map['adName'] as String?,
provinceCode = map['provinceCode'] as String?,
latitude = map['latitude'] as String?,
longitude = map['longitude'] as String?;
String? cityCode;
String? cityName;
String? provinceName;
String? title;
String? adName;
String? provinceCode;
String? latitude;
String? longitude;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['cityCode'] = cityCode;
data['cityName'] = cityName;
data['provinceName'] = provinceName;
data['title'] = title;
data['adName'] = adName;
data['provinceCode'] = provinceCode;
data['latitude'] = latitude;
data['longitude'] = longitude;
return data;
}
}
......@@ -5,7 +5,6 @@ import 'package:Parlando/util/toast_utils.dart';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_2d_amap/flutter_2d_amap.dart';
import 'package:Parlando/poem/provider/lang_sort_provider.dart';
import 'package:Parlando/poem/widgets/lang_sort_bottom_sheet.dart';
import 'package:Parlando/res/resources.dart';
......@@ -17,6 +16,7 @@ import 'package:Parlando/extension/int_extension.dart';
import 'package:getwidget/getwidget.dart';
import 'package:path_provider/path_provider.dart';
import '../../map/poi_search_model.dart';
import '../poem_router.dart';
class PoemPublish extends StatefulWidget {
......
import 'package:flutter/material.dart';
import 'package:flutter_2d_amap/flutter_2d_amap.dart';
import 'package:Parlando/routers/fluro_navigator.dart';
import 'package:Parlando/util/toast_utils.dart';
import 'package:Parlando/widgets/my_button.dart';
import 'package:Parlando/widgets/search_bar.dart';
import 'package:flutter_baidu_mapapi_map/flutter_baidu_mapapi_map.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
import '../../map/flutter_2d_amap.dart';
import '../../map/interface/amap_2d_controller.dart';
import '../../map/poi_search_model.dart';
class AddressSelectPage extends StatefulWidget {
const AddressSelectPage({Key? key}) : super(key: key);
......@@ -17,6 +22,7 @@ class AddressSelectPageState extends State<AddressSelectPage> {
int _index = 0;
final ScrollController _controller = ScrollController();
AMap2DController? _aMap2DController;
late BMFMapController myMapController;
@override
void dispose() {
......@@ -33,6 +39,25 @@ class AddressSelectPageState extends State<AddressSelectPage> {
);
}
/// 创建完成回调
void onBMFMapCreated(BMFMapController controller) {
myMapController = controller;
/// 地图加载回调
myMapController.setMapDidLoadCallback(callback: () {
print('mapDidLoad-地图加载完成');
});
}
/// 设置地图参数
BMFMapOptions initMapOptions() {
BMFMapOptions mapOptions = BMFMapOptions(
center: BMFCoordinate(39.917215, 116.380341),
zoomLevel: 12,
);
return mapOptions;
}
@override
Widget build(BuildContext context) {
return Scaffold(
......@@ -51,18 +76,9 @@ class AddressSelectPageState extends State<AddressSelectPage> {
children: <Widget>[
Expanded(
flex: 9,
child: AMap2DView(
onPoiSearched: (result) {
_controller.animateTo(0.0,
duration: const Duration(milliseconds: 10),
curve: Curves.ease);
_index = 0;
_list = result;
setState(() {});
},
onAMap2DViewCreated: (controller) {
_aMap2DController = controller;
},
child: BMFMapWidget(
onBMFMapCreated: onBMFMapCreated,
mapOptions: initMapOptions(),
),
),
Expanded(
......
......@@ -391,15 +391,20 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_2d_amap:
flutter_baidu_mapapi_base:
dependency: transitive
description:
name: flutter_baidu_mapapi_base
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.0"
flutter_baidu_mapapi_map:
dependency: "direct main"
description:
path: "."
ref: "597a0538"
resolved-ref: "597a05386700e1cf854ad9b56fe21b103c669f62"
url: "https://gitee.com/reasonpun/flutter_2d_amap.git"
source: git
version: "0.2.0+2"
name: flutter_baidu_mapapi_map
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.1"
flutter_blurhash:
dependency: transitive
description:
......@@ -407,6 +412,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.7.0"
flutter_bmflocation:
dependency: "direct main"
description:
name: flutter_bmflocation
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.0"
flutter_cache_manager:
dependency: transitive
description:
......
......@@ -79,11 +79,6 @@ dependencies:
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
# 高德2D地图插件(支持Web) https://github.com/simplezhli/flutter_2d_amap
flutter_2d_amap:
git:
ref: '597a0538'
url: 'https://gitee.com/reasonpun/flutter_2d_amap.git'
# tiktok
video_player: ^2.4.5
......@@ -129,6 +124,8 @@ dependencies:
google_fonts: ^3.0.1
wakelock: ^0.6.1+2
flutter_baidu_mapapi_map: ^3.2.1
flutter_bmflocation: ^3.2.0
dependency_overrides:
decimal: 1.5.0
......