reason

替换google map

......@@ -3,7 +3,6 @@
package="pub.yiyan.parlando.Parlando">
<application
android:name=".MyApplication"
android:icon="@mipmap/ic_launcher"
android:label="Parlando"
android:requestLegacyExternalStorage="true"
......@@ -54,11 +53,8 @@
android:name="com.facebook.sdk.ClientToken"
android:value="@string/facebook_client_token" />
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="038a8a2d7280a244b5c51d517023ede3" />
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="WSVybPeSZqwIGLYXjN44mighexoFX6Dn" />
android:name="com.google.android.geo.API_KEY"
android:value="AIzaSyBwkClNvPHwcuieSu7NJEZVCu6JDM-tkFQ" />
</application>
<queries>
......@@ -76,6 +72,8 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:node="remove" />
......
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,8 +25,6 @@ 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';
///
......@@ -88,9 +86,6 @@ Future<void> main() async {
/// 动态申请定位权限
requestPermission();
/// 设置用户是否同意SDK隐私协议
/// since 3.1.0 开发者必须设置
BMFMapSDK.setAgreePrivacy(true);
}
class MyApp extends StatelessWidget {
......
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;
}
}
......@@ -13,7 +13,6 @@ import 'package:Parlando/routers/routers.dart';
import 'package:Parlando/widgets/my_app_bar.dart';
import 'package:Parlando/extension/int_extension.dart';
import 'package:flutter_baidu_mapapi_search/flutter_baidu_mapapi_search.dart';
import 'package:getwidget/getwidget.dart';
import 'package:path_provider/path_provider.dart';
......@@ -110,12 +109,12 @@ class PoemPublishState extends State<PoemPublish> {
NavigatorUtils.pushResult(
context, PoemRouter.addressSelectPage, (result) {
setState(() {
final BMFSuggestionInfo model =
result as BMFSuggestionInfo;
_longitude = model.location!.longitude.toString();
_latitude = model.location!.latitude.toString();
_address =
'${model.city!} ${model.district!} ${model.address!}';
// final BMFSuggestionInfo model =
// result as BMFSuggestionInfo;
// _longitude = model.location!.longitude.toString();
// _latitude = model.location!.latitude.toString();
// _address =
// '${model.city!} ${model.district!} ${model.address!}';
});
});
},
......
import 'dart:io';
import 'package:location/location.dart';
import 'package:flutter/material.dart';
import 'package:Parlando/widgets/my_button.dart';
import 'package:Parlando/widgets/search_bar.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
import 'package:flutter_baidu_mapapi_map/flutter_baidu_mapapi_map.dart';
import 'package:flutter_baidu_mapapi_search/flutter_baidu_mapapi_search.dart';
import 'package:flutter_bmflocation/flutter_bmflocation.dart';
import 'package:getwidget/getwidget.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import '../../routers/fluro_navigator.dart';
import '../../util/toast_utils.dart';
......@@ -20,12 +16,11 @@ class AddressSelectPage extends StatefulWidget {
}
class AddressSelectPageState extends State<AddressSelectPage> {
List<BMFSuggestionInfo> _list = [];
// List<BMFSuggestionInfo> _list = [];
int _index = 0;
final ScrollController _controller = ScrollController();
late BMFMapController _myMapController;
BaiduLocation _locationResult = BaiduLocation();
LocationFlutterPlugin myLocPlugin = LocationFlutterPlugin();
LatLng _center = const LatLng(45.521563, -122.677433);
late GoogleMapController mapController;
bool isLoading = false;
@override
......@@ -37,138 +32,39 @@ class AddressSelectPageState extends State<AddressSelectPage> {
@override
void initState() {
super.initState();
myLocPlugin.setAgreePrivacy(true);
// 百度地图sdk初始化鉴权
if (Platform.isIOS) {
myLocPlugin.authAK('rMsgMvYERM9zHDDdaipk34oBx7yoaGQh');
BMFMapSDK.setApiKeyAndCoordType(
'rMsgMvYERM9zHDDdaipk34oBx7yoaGQh', BMF_COORD_TYPE.BD09LL);
///接受定位回调
myLocPlugin.singleLocationCallback(callback: (BaiduLocation result) {
setState(() {
_locationResult = result;
locationFinish();
});
});
} else if (Platform.isAndroid) {
// Android 目前不支持接口设置Apikey,
// 请在主工程的Manifest文件里设置,详细配置方法请参考官网(https://lbsyun.baidu.com/)demo
BMFMapSDK.setCoordType(BMF_COORD_TYPE.BD09LL);
myLocPlugin.seriesLocationCallback(callback: (BaiduLocation result) {
setState(() {
_locationResult = result;
locationFinish();
myLocPlugin.stopLocation();
});
});
}
///设置定位参数
_locationAction();
_startLocation();
}
void _locationAction() async {
Map iosMap = initIOSOptions().getMap();
Map androidMap = initAndroidOptions().getMap();
await myLocPlugin.prepareLoc(androidMap, iosMap);
_getCurrentLocation();
}
///定位完成添加mark
Future<void> locationFinish() async {
/// 创建BMFMarker
BMFMarker marker = BMFMarker.icon(
position: BMFCoordinate(
_locationResult.latitude ?? 0.0, _locationResult.longitude ?? 0.0),
title: 'flutterMaker',
identifier: 'flutter_marker',
icon: 'assets/images/map/icon_mark.png');
/// 添加Marker
_myMapController.addMarker(marker);
Future<void> _getCurrentLocation() async {
Location location = Location();
///设置中心点
_myMapController.setCenterCoordinate(
BMFCoordinate(
_locationResult.latitude ?? 0.0, _locationResult.longitude ?? 0.0),
false);
bool serviceEnabled;
PermissionStatus permissionGranted;
// 构造检索参数
BMFSuggestionSearchOption suggestionSearchOption =
BMFSuggestionSearchOption(
keyword: '街道',
cityname: _locationResult.city,
location:
BMFCoordinate(_locationResult.latitude!, _locationResult.longitude!),
cityLimit: true,
);
BMFSuggestionSearch suggestionSearch = BMFSuggestionSearch();
suggestionSearch.onGetSuggestSearchResult(callback:
(BMFSuggestionSearchResult result, BMFSearchErrorCode errorCode) {
print("sug检索回调 result = ${result.toMap()} \n errorCode = ${errorCode}");
_list = result.suggestionList!;
if (_list.isEmpty) {
Toast.show("暂时无法搜索到该位置!");
serviceEnabled = await location.serviceEnabled();
if (!serviceEnabled) {
serviceEnabled = await location.requestService();
if (!serviceEnabled) {
return;
}
isLoading = false;
setState(() {});
});
bool flag = await suggestionSearch.suggestionSearch(suggestionSearchOption);
}
/// 设置地图参数
BaiduLocationAndroidOption initAndroidOptions() {
BaiduLocationAndroidOption options = BaiduLocationAndroidOption(
coorType: 'bd09ll',
locationMode: BMFLocationMode.hightAccuracy,
isNeedAddress: true,
isNeedAltitude: true,
isNeedLocationPoiList: true,
isNeedNewVersionRgc: true,
isNeedLocationDescribe: true,
openGps: true,
locationPurpose: BMFLocationPurpose.sport,
coordType: BMFLocationCoordType.bd09ll);
return options;
}
BaiduLocationIOSOption initIOSOptions() {
BaiduLocationIOSOption options = BaiduLocationIOSOption(
coordType: BMFLocationCoordType.bd09ll,
BMKLocationCoordinateType: 'BMKLocationCoordinateTypeBMK09LL',
desiredAccuracy: BMFDesiredAccuracy.best);
return options;
}
/// 启动定位
Future<void> _startLocation() async {
isLoading = true;
if (Platform.isIOS) {
await myLocPlugin
.singleLocation({'isReGeocode': true, 'isNetworkState': true});
} else if (Platform.isAndroid) {
await myLocPlugin.startLocation();
}
}
/// 创建完成回调
void onBMFMapCreated(BMFMapController controller) {
_myMapController = controller;
permissionGranted = await location.hasPermission();
if (permissionGranted == PermissionStatus.denied) {
permissionGranted = await location.requestPermission();
if (permissionGranted != PermissionStatus.granted) {
return;
}
}
/// 地图加载回调
_myMapController.setMapDidLoadCallback(callback: () {});
location.onLocationChanged.listen((LocationData currentLocation) {
// _center = LatLng(currentLocation.latitude!, currentLocation.longitude!);
setState(() {});
});
}
/// 设置地图参数
BMFMapOptions initMapOptions() {
BMFMapOptions mapOptions = BMFMapOptions(
center: BMFCoordinate(39.917215, 116.380341),
zoomLevel: 18,
);
return mapOptions;
void _onMapCreated(GoogleMapController controller) {
mapController = controller;
}
@override
......@@ -183,28 +79,6 @@ class AddressSelectPageState extends State<AddressSelectPage> {
duration: const Duration(milliseconds: 10), curve: Curves.ease);
_index = 0;
// 构造检索参数
BMFSuggestionSearchOption suggestionSearchOption =
BMFSuggestionSearchOption(
keyword: text,
cityname: _locationResult.city,
location: BMFCoordinate(
_locationResult.latitude!, _locationResult.longitude!),
cityLimit: true,
);
BMFSuggestionSearch suggestionSearch = BMFSuggestionSearch();
suggestionSearch.onGetSuggestSearchResult(callback:
(BMFSuggestionSearchResult result, BMFSearchErrorCode errorCode) {
print(
"sug检索回调 result = ${result.toMap()} \n errorCode = ${errorCode}");
_list = result.suggestionList!;
if (_list.isEmpty) {
Toast.show("暂时无法搜索到该位置!");
}
isLoading = false;
setState(() {});
});
bool flag =
await suggestionSearch.suggestionSearch(suggestionSearchOption);
},
),
body: SafeArea(
......@@ -212,11 +86,12 @@ class AddressSelectPageState extends State<AddressSelectPage> {
children: <Widget>[
Expanded(
flex: 9,
child: BMFMapWidget(
onBMFMapCreated: (BMFMapController controller) {
onBMFMapCreated(controller);
},
mapOptions: initMapOptions(),
child: GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
target: _center,
zoom: 11.0,
),
),
),
Expanded(
......@@ -224,38 +99,14 @@ class AddressSelectPageState extends State<AddressSelectPage> {
child: isLoading
? const GFLoader()
: ListView.separated(
controller: _controller,
itemCount: _list.length,
controller: _controller,
itemCount: 1,
separatorBuilder: (_, index) => const Divider(),
itemBuilder: (_, index) {
return _AddressItem(
isSelected: _index == index,
poi: _list[index],
onTap: () {
_index = index;
_myMapController.updateMapOptions(BMFMapOptions(
center: BMFCoordinate(
_list[index].location!.latitude,
_list[index].location!.longitude)));
/// 创建BMFMarker
BMFMarker marker = BMFMarker.icon(
position: BMFCoordinate(
_list[index].location!.latitude,
_list[index].location!.longitude),
title: 'flutterMaker',
identifier: 'flutter_marker',
icon: 'assets/images/map/icon_mark.png');
/// 添加Marker
_myMapController.addMarker(marker);
///设置中心点
_myMapController.setCenterCoordinate(
BMFCoordinate(_list[index].location!.latitude,
_list[index].location!.longitude),
false);
setState(() {});
},
);
......@@ -264,11 +115,11 @@ class AddressSelectPageState extends State<AddressSelectPage> {
),
MyButton(
onPressed: () {
if (_list.isEmpty) {
Toast.show('未选择地址!');
return;
}
NavigatorUtils.goBackWithParams(context, _list[_index]);
// if (_list.isEmpty) {
// Toast.show('未选择地址!');
// return;
// }
// NavigatorUtils.goBackWithParams(context, _list[_index]);
},
text: '确认选择地址',
)
......@@ -282,12 +133,11 @@ class AddressSelectPageState extends State<AddressSelectPage> {
class _AddressItem extends StatelessWidget {
const _AddressItem({
Key? key,
required this.poi,
this.isSelected = false,
this.onTap,
}) : super(key: key);
final BMFSuggestionInfo poi;
// final BMFSuggestionInfo poi;
final bool isSelected;
final GestureTapCallback? onTap;
......@@ -303,7 +153,7 @@ class _AddressItem extends StatelessWidget {
children: <Widget>[
Expanded(
child: Text(
'${poi.city} ${poi.district} ${poi.address}',
'', // '${poi.city} ${poi.district} ${poi.address}',
),
),
Visibility(
......
......@@ -391,34 +391,6 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
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:
name: flutter_baidu_mapapi_map
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.1"
flutter_baidu_mapapi_search:
dependency: "direct main"
description:
name: flutter_baidu_mapapi_search
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.0"
flutter_baidu_mapapi_utils:
dependency: "direct main"
description:
name: flutter_baidu_mapapi_utils
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.0"
flutter_blurhash:
dependency: transitive
description:
......@@ -426,13 +398,6 @@ 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:
......@@ -612,6 +577,20 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.1"
google_maps_flutter:
dependency: "direct main"
description:
name: google_maps_flutter
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.10"
google_maps_flutter_platform_interface:
dependency: transitive
description:
name: google_maps_flutter_platform_interface
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.2"
graphs:
dependency: transitive
description:
......@@ -785,6 +764,27 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.0"
location:
dependency: "direct main"
description:
name: location
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.4.0"
location_platform_interface:
dependency: transitive
description:
name: location_platform_interface
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.3.0"
location_web:
dependency: transitive
description:
name: location_web
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.1"
logger:
dependency: transitive
description:
......
......@@ -124,10 +124,8 @@ dependencies:
google_fonts: ^3.0.1
wakelock: ^0.6.1+2
flutter_baidu_mapapi_map: ^3.2.1
flutter_baidu_mapapi_utils: ^3.2.0
flutter_baidu_mapapi_search: ^3.2.0
flutter_bmflocation: ^3.2.0
location: ^4.4.0
google_maps_flutter: ^2.1.10
dependency_overrides:
decimal: 1.5.0
......