import 'dart:async'; import 'dart:convert'; import 'package:flutter/services.dart'; import './bean/location_option.dart'; import './bean/location_result_entity.dart'; // IOS: // add info.plist GaoDeAppKey class AmapLocation { static const MethodChannel _channel = const MethodChannel('amap_location'); static final AmapLocation _instance = AmapLocation(); static AmapLocation get instance => _instance; StreamController _locationStreamController; Stream get locationStream => _locationStreamController.stream; AmapLocation() { _channel.setMethodCallHandler(platformCallHandler); _locationStreamController = StreamController.broadcast(); } static Future get platformVersion async { final String version = await _channel.invokeMethod('getPlatformVersion'); return version; } Future startLocation({LocationOption options}) async { if (_locationStreamController == null) { _locationStreamController = StreamController.broadcast(); } return await _channel.invokeMethod( 'startLocation', options?.toMap() ?? LocationOption().toMap()); } Future disposed() async { if (!_locationStreamController.isClosed) { await _locationStreamController.close(); } return await _channel.invokeMethod("closeLocation"); } Future platformCallHandler(MethodCall call) async { try { if (call.method == "location") { LocationResultEntity entity = LocationResultEntity().fromJson(jsonDecode(call.arguments)); _locationStreamController.add(entity); } } catch (ex) { print('Unexpected error: $ex'); } return null; } Future appleNavigate(double lat, double lng,String title) async { return await _channel.invokeMethod('appleNavigate', { 'lat': lat, "lng": lng, "title": title, }); } }