fl_amap 0.0.3 copy "fl_amap: ^0.0.3" to clipboard
fl_amap: ^0.0.3 copied to clipboard

outdated

AMap location plugin for flutter, supports single positioning and continuous positioning

example/lib/main.dart

import 'dart:io';

import 'package:fl_amap/fl_amap.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:permission_handler/permission_handler.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final bool key = await setKeyWithAMap(
      iosKey: 'e0e98395277890e48caa0c4bed423ead',
      androidKey: '77418e726d0eefc0ac79a8619b5f4d97');
  if (key != null && key) print('高德地图ApiKey设置成功');
  runApp(MaterialApp(
      debugShowCheckedModeBanner: false, title: 'FlAMap', home: Home()));
}

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  bool isInit = false;
  ValueNotifier<String> text = ValueNotifier<String>('未初始化');
  ValueNotifier<AMapLocation> locationState = ValueNotifier<AMapLocation>(null);

  int i = 0;

  @override
  void initState() {
    super.initState();
  }

  Future<bool> get getPermissions async {
    if (Platform.isIOS) {
      if (!await requestPermissions(Permission.locationWhenInUse, '获取定位权限') ||
          !await requestPermissions(Permission.locationWhenInUse, '获取定位权限')) {
        show('未获取到定位权限');
        return false;
      }
      return true;
    } else if (Platform.isAndroid) {
      if (!await requestPermissions(Permission.location, '获取定位权限') ||
          !await requestPermissions(Permission.phone, '获取定位权限')) {
        show('未获取到定位权限');
        return false;
      }
      return true;
    }
    return false;
  }

  Future<void> get getLocation async {
    if (!isInit) {
      show('请先初始化定位');
      return;
    }
    if (!await getPermissions) return;
    locationState.value = await getLocationWithAMap(true);
  }

  Future<void> get init async {
    if (!await getPermissions) return;

    /// 初始化AMap
    final bool data = await initWithAMap(AMapLocationOption());
    if (data != null && data) {
      isInit = true;
      show('初始化成功');
    }
  }

  @override
  Widget build(BuildContext context) => Scaffold(
      appBar: AppBar(title: const Text('高德地图定位')),
      body: Center(
          child: Column(mainAxisAlignment: MainAxisAlignment.center, children: <
              Widget>[
        Padding(
            padding: const EdgeInsets.symmetric(horizontal: 10.0),
            child: ValueListenableBuilder<String>(
                valueListenable: text,
                builder: (_, String value, __) =>
                    Text(value ?? '', style: const TextStyle(fontSize: 20)))),
        const SizedBox(height: 30),
        ElevatedButton(onPressed: () => init, child: const Text('initAMap')),
        const SizedBox(height: 10),
        ElevatedButton(
            onPressed: () {
              /// dispose 高德地图
              disposeWithAMap;
              locationState.value = null;
              isInit = false;
              i = 0;
              show('未初始化');
            },
            child: const Text('dispose')),
        const SizedBox(height: 10),
        ElevatedButton(
            onPressed: () => getLocation, child: const Text('直接获取定位')),
        const SizedBox(height: 10),
        ElevatedButton(
            onPressed: () => startLocationState(), child: const Text('开启监听定位')),
        const SizedBox(height: 10),
        ElevatedButton(
            onPressed: () {
              if (!isInit) {
                show('请先初始化定位');
                return;
              }
              text.value = '定位监听关闭';
              locationState.value = null;
              i = 0;
              stopLocationWithAMap;
            },
            child: const Text('关闭监听定位')),
        const SizedBox(height: 30),
        Padding(
            padding: const EdgeInsets.symmetric(horizontal: 10.0),
            child: ValueListenableBuilder<AMapLocation>(
                valueListenable: locationState,
                builder: (_, AMapLocation value, __) => Text(
                    getLocationStr(value),
                    style: const TextStyle(fontSize: 15))))
      ])));

  Future<void> startLocationState() async {
    if (!isInit) {
      show('请先初始化定位');
      return;
    }
    if (!await getPermissions) return;
    final bool data =
        await startLocationWithAMap(onLocationChange: (AMapLocation location) {
      locationState.value = location;
      i += 1;
      text.value = '位置更新$i次';
    });
    show((data == null || !data) ? '开启失败' : '开启成功');
  }

  void show(String str) {
    text.value = str;
  }

  @override
  void dispose() {
    super.dispose();
  }

  String getLocationStr(AMapLocation loc) {
    if (loc == null) return '正在定位';
    if (loc.isSuccess) {
      if (loc.hasAddress) {
        return '定位成功: \n时间${loc?.timestamp ?? ''}\n经纬度:${loc?.latitude ?? ''} ${loc.longitude}\n地址:${loc?.formattedAddress ?? ''}\n城市:${loc?.city ?? ''}\n省:${loc?.province ?? ''}';
      } else {
        return '定位成功: \n时间${loc?.timestamp ?? ''}\n经纬度:${loc?.latitude ?? ''}'
            '  ${loc?.longitude ?? ''}';
      }
    } else {
      return '定位失败: \n错误:{code=${loc?.code ?? ''},\ndescription=${loc?.description ?? ''}';
    }
  }
}

Future<bool> requestPermissions(Permission permission, String text) async {
  final PermissionStatus status = await permission.status;
  if (status != PermissionStatus.granted) {
    final Map<Permission, PermissionStatus> statuses =
        await <Permission>[permission].request();
    if (!(statuses[permission] == PermissionStatus.granted)) {
      openAppSettings();
    }
    return statuses[permission] == PermissionStatus.granted;
  }
  return true;
}
8
likes
0
points
200
downloads

Publisher

unverified uploader

Weekly Downloads

AMap location plugin for flutter, supports single positioning and continuous positioning

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

flutter

More

Packages that depend on fl_amap