amap_location.dart 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'package:amap_location/location_option.dart';
  4. import 'package:amap_location/location_result_entity.dart';
  5. import 'package:flutter/services.dart';
  6. // IOS:
  7. // add info.plist GaoDeAppKey
  8. class AmapLocation {
  9. static const MethodChannel _channel = const MethodChannel('amap_location');
  10. static final AmapLocation _instance = AmapLocation();
  11. static AmapLocation get instance => _instance;
  12. StreamController _streamController;
  13. Stream<LocationResultEntity> get locationStream => _streamController.stream;
  14. AmapLocation(){
  15. _channel.setMethodCallHandler(platformCallHandler);
  16. _streamController = StreamController<LocationResultEntity>.broadcast();
  17. }
  18. static Future<String> get platformVersion async {
  19. final String version = await _channel.invokeMethod('getPlatformVersion');
  20. return version;
  21. }
  22. Future<void> startLocation({LocationOption options}) async {
  23. if (_streamController == null) {
  24. _streamController = StreamController<LocationResultEntity>.broadcast();
  25. }
  26. return await _channel.invokeMethod(
  27. 'startLocation', options?.toMap() ?? LocationOption().toMap());
  28. }
  29. Future<void> disposed() async {
  30. if (!_streamController.isClosed) {
  31. await _streamController.close();
  32. }
  33. _streamController = null;
  34. return await _channel.invokeMethod("closeLocation");
  35. }
  36. Future<void> platformCallHandler(MethodCall call) async {
  37. try {
  38. if (call.method == "location") {
  39. LocationResultEntity entity =
  40. LocationResultEntity().fromJson(jsonDecode(call.arguments));
  41. _streamController.add(entity);
  42. }
  43. } catch (ex) {
  44. print('Unexpected error: $ex');
  45. }
  46. return null;
  47. }
  48. }