Newer
Older
flutterBaseApp / lib / ui / pages / demo / mapPage / draw_map_page.dart
StephanieGitHub on 9 Feb 2021 8 KB first commit
import 'package:amap_map_fluttify/amap_map_fluttify.dart';
import 'package:base_app/res/index.dart';
import 'package:base_app/ui/widgets/common/button/round_button_widget.dart';
import 'package:base_app/utils/permission_util.dart';
import 'package:base_app/utils/util_index.dart';
import 'package:flutter/material.dart';
import 'package:oktoast/oktoast.dart';

final _assetsIcon1 = AssetImage('assets/images/qidian.png');

class DrawMapPage extends StatefulWidget {
  @override
  _DrawMapPageState createState() => _DrawMapPageState();
}

class _DrawMapPageState extends State<DrawMapPage> with NextLatLng {
  AmapController _controller; // 地图controller
  List<Marker> _markers = []; // markers
  List<Circle> _circleList = []; //circleList
  List<Polygon> _polygonList = [];
  Polyline _currentPolyline;
  List<LatLng> _pointList = [];

  @override
  Widget build(BuildContext context) {
    // 功能栏Widget
    Widget functionBar = Container(
        child: new Column(
      children: <Widget>[
        new FloatingActionButton(
            // 回到当前位置按钮
            mini: true,
            heroTag: 'gps_setting',
            shape: new CircleBorder(),
            backgroundColor: Colors.white,
            child: Icon(Icons.gps_fixed, size: 26, color: Colours.gray_66),
            onPressed: () async {
              final latLng = await _controller?.getLocation();
              final lat = latLng.latitude;
              final lng = latLng.longitude;
              showToast("$lng,$lat");
              _controller.setCenterCoordinate(latLng);
            }),
        new FloatingActionButton(
            // 清屏
            mini: true,
            heroTag: 'refreshData',
            shape: new CircleBorder(),
            backgroundColor: Colors.white,
            child: Icon(Icons.delete, size: 26, color: Colours.gray_66),
            onPressed: () async {
              await _controller.clearMarkers(_markers);
              if (_circleList.isNotEmpty) {
                await _circleList.first.remove();
                _circleList.removeAt(0);
              }
              if (_polygonList.isNotEmpty) {
                await _polygonList.first.remove();
                _polygonList.removeAt(0);
              }
              _currentPolyline?.remove();
            }),
      ],
    ));
    return Scaffold(
        appBar: AppBar(title: const Text('地图绘制示例')),
        body: new Stack(children: [
          Container(
            height: double.infinity,
            width: double.infinity,
            color: Colors.white24,
            child: Column(
                mainAxisAlignment: MainAxisAlignment.start,
                mainAxisSize: MainAxisSize.max,
                children: <Widget>[
                  Expanded(
                    child: Container(
                      child: AmapView(
                        showScaleControl: false, // 是否显示比例尺
                        showZoomControl: false, // 是否显示缩放控件
                        rotateGestureEnabled: false, // 是否允许旋转
                        tiltGestureEnabled: false,
                        onMapCreated: (controller) async {
                          print("onMapCreate");
                          if (await reqPositionPermission()) {
                            // await controller.showMyLocation(MyLocationOption(show: true));
                            _controller = controller;
                            await _controller?.showMyLocation(MyLocationOption(
                                myLocationType: MyLocationType.Locate, // 定位模式
                                interval: Duration(seconds: 3) // 定位间隔时间
                                ));
                          }
                        },
                      ),
                    ),
                  ),
                  Container(
                    height: 55.0,
                    margin: EdgeInsets.all(10),
                    width: double.infinity,
                    color: Colors.white,
                    padding: EdgeInsets.symmetric(horizontal: 8),
                    child: new Row(
                      children: <Widget>[
                        new RoundButton(
                          text: " 绘制点 ",
                          radius: 8,
                          onPressed: () async {
                            final marker = await _controller?.addMarker(
                              MarkerOption(
                                latLng: getNextLatLng(),
                                title: '北京${random.nextDouble()}',
                                snippet: '描述${random.nextDouble()}',
                                iconProvider: _assetsIcon1,
                                infoWindowEnabled: true,
                                object: '自定义数据${random.nextDouble()}',
                              ),
                            );
                            // 自定义弹窗
                            await _controller
                                ?.setMarkerClickedListener((marker) async {
                              await _controller.showCustomInfoWindow(
                                marker,
                                Container(
                                  width: 128,
                                  height: 122,
                                  padding: EdgeInsets.all(10),
                                  decoration: BoxDecoration(
                                    color: Colors.white,
                                    borderRadius: BorderRadius.circular(16),
                                  ),
                                  child: Text(await marker.title),
                                ),
                              );
                            });
                            _markers.add(marker);
                          },
                        ),
                        new RoundButton(
                          text: " 绘制圆 ",
                          margin: EdgeInsets.symmetric(horizontal: 5),
                          radius: 8,
                          onPressed: () async {
                            final circle =
                                await _controller?.addCircle(CircleOption(
                              center: LatLng(39.999391, 116.135972),
                              radius: 10000,
                              width: 10,
                              strokeColor: Colors.green,
                            ));
                            _circleList.add(circle);
                          },
                        ),
                        new RoundButton(
                          text: " 绘制多边形 ",
                          radius: 8,
                          onPressed: () async {
                            final polygon =
                                await _controller?.addPolygon(PolygonOption(
                              latLngList: [
                                LatLng(39.999391, 116.135972),
                                LatLng(39.898323, 116.057694),
                                LatLng(39.900430, 116.265061),
                                LatLng(39.955192, 116.140092),
                              ],
                              width: 10,
                              strokeColor: Colors.green,
                            ));
                            _polygonList.add(polygon);
                          },
                        ),
                        new RoundButton(
                          text: " 曲线 ",
                          radius: 8,
                          margin: EdgeInsets.symmetric(horizontal: 5),
                          onPressed: () async {
                            _pointList = [
                              getNextLatLng(),
                              getNextLatLng(),
                              getNextLatLng(),
                              getNextLatLng(),
                            ];
                            _currentPolyline =
                                await _controller?.addPolyline(PolylineOption(
                              latLngList: _pointList,
                              width: 10,
                              strokeColor: Colors.green,
                            ));
                          },
                        ),
                        new RoundButton(
                          text: " 地图缩放 ",
                          radius: 8,
                          onPressed: () async {
                            _controller?.zoomToSpan(
                              _pointList,
                              padding: EdgeInsets.only(top: 100),
                            );
                          },
                        ),
                      ],
                    ),
                  )
                ]),
          ),
          new Positioned(
              // 左上角功能栏
              left: 10.0,
              top: 60.0,
              child: functionBar),
        ]));
  }
}