map_choice_point.dart 13.4 KB
import 'package:amap_map_fluttify/amap_map_fluttify.dart';
import 'package:flutter/cupertino.dart';

import 'package:flutter/material.dart';
import 'package:amap_search_fluttify/amap_search_fluttify.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/misc.dart';
import 'package:one_key/route/navigator_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:permission_handler/permission_handler.dart';
// import 'package:demo/resources/custom_text_style.dart';
// import 'package:demo/utils/misc.dart';

// import 'package:demo/widgets/network_state/page_loading.dart';

class MapChoicePointPage extends StatefulWidget {
  @override
  _MapChoicePointPageState createState() => _MapChoicePointPageState();
}

class _MapChoicePointPageState extends State<MapChoicePointPage> {
  AmapController _controller;
  List<Poi> poiList;
  static List<PoiModel> list = new List();
  static List<PoiModel> searchlist = new List();
  PoiModel poiModel;
  String keyword = "";
  String address = "";
  bool isloading = true;

  double latitude = 39.684670899;
  double longitude = 118.17630045;

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

    WidgetsBinding.instance.addPostFrameCallback((_) async {
      _requestLocationPermission();
    });
  }

  Future<bool> checkLocationPermission() async {
    PermissionStatus permissionStatus = await Permission.location.status;
    if (permissionStatus == PermissionStatus.granted) {
      return true;
    } else {
      return false;
    }
  }

  ///  检查权限并定
  // _getLocationPermission() async {
  //   if (!(await checkPermission(Permission.location))) {
  //     //没有定位权限

  //     //申请定位权限
  //     _requestLocationPermission();
  //   } else {
  //     //去定位
  //     _requestLocationPermission();
  //   }
  // }

  /// 获取定位权限
  _requestLocationPermission() async {
    await AmapLocation.instance.updatePrivacyShow(true);
    await AmapLocation.instance.updatePrivacyAgree(true);
    bool canLocation = false;

    if (!(await checkPermission(Permission.location))) {
      //没有定位权限

      //申请定位权限
      canLocation = await requestPermission(Permission.location);
    } else {
      canLocation = true;
    }
    // bool canLocation = await requestPermission(Permission.location);
    // 单次定位
    if (canLocation) {
      Future.delayed(Duration(milliseconds: 200), () async {
        await AmapLocation.instance.updatePrivacyShow(true);
        await AmapLocation.instance.updatePrivacyAgree(true);
        final location = await AmapLocation.instance.fetchLocation(
            // needAddress: true,
            // mode: LocationAccuracy.High,
            // timeout: Duration(seconds: 10)
            );

        if (location.city == null || location.city == '') //网络不好,定位失败
        {
          // App.sp.setString("lat", "39.684670899");
          // App.sp.setString("lng", "118.17630045");

        } else {
          latitude = location.latLng.latitude;
          longitude = location.latLng.longitude;
          if (_controller != null) {
            _controller.setCenterCoordinate(
                LatLng(location.latLng.latitude, location.latLng.longitude));
          }

          setState(() {});
        }
      });
    } else {
      //无权限

    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: false, //防止底部布局被顶起
      appBar: SystemAppBar(
        '选择位置信息',
        onTap: () {
          Navigator.pop(context);
        },
      ),

      body: Column(
        children: <Widget>[
          Theme(
            data: new ThemeData(
                primaryColor: Color(0xFFFFCA28), hintColor: Color(0xFFFFCA28)),
            child: Container(
              color: Color(0xFFFFCA28),
              padding: EdgeInsets.all(5),
              child: Container(
                height: 36,
                margin: EdgeInsets.only(left: 5, right: 5, bottom: 5),
                child: TextField(
                  style: TextStyle(fontSize: 16, letterSpacing: 1.0),
                  controller: TextEditingController.fromValue(TextEditingValue(
                    // 设置内容
                    text: keyword,
                    selection: TextSelection.fromPosition(TextPosition(
                        affinity: TextAffinity.downstream,
                        offset: keyword?.length ?? 0)),
                    // 保持光标在最后
                  )),
                  decoration: InputDecoration(
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.all(Radius.circular(40)),
                    ),
                    hintText: '输入关键字',
                    hintStyle:
                        TextStyle(color: Color(0xFFBEBEBE), fontSize: 14),
                    contentPadding:
                        const EdgeInsets.symmetric(vertical: 8, horizontal: 1),
                    prefixIcon: Icon(
                      Icons.search,
                      color: Colors.grey,
                      size: 20,
                    ),
                    suffixIcon: IconButton(
                      icon: Icon(
                        Icons.clear,
                        color: Colors.grey,
                        size: 20,
                      ),
                      onPressed: () {
                        keyword = "";
                        setState(() {});
                      },
                    ),
                    fillColor: Colors.white,
                    filled: true,
                  ),

                  inputFormatters: [],
                  //内容改变的回调
                  onChanged: (text) {
                    print('change $text');
                    keyword = text;
                  },
                  //内容提交(按回车)的回调
                  onSubmitted: (text) {
                    print('submit $text');
                    // 触发关闭弹出来的键盘。
                    keyword = text;
                    setState(() {
                      isloading = true;
                      FocusScope.of(context).requestFocus(FocusNode());
                    });

                    searchAroundAddress(text.toString());
                  },
                  //按回车时调用
                  onEditingComplete: () {
                    print('onEditingComplete');
                  },
                ),
              ),
            ),
          ),
          Container(
            height: 300,
            child: Stack(
              children: <Widget>[
                AmapView(
                  showZoomControl: false,
                  centerCoordinate: LatLng(latitude, longitude),
                  maskDelay: Duration(milliseconds: 500),
                  zoomLevel: 16,
                  onMapCreated: (controller) async {
                    _controller = controller;
                    _controller
                        .setCenterCoordinate(LatLng(latitude, longitude));
                    // if (await requestPermission(PermissionGroup.location)) {
                    //   await controller.showMyLocation(true);
                    //   await controller?.showLocateControl(true);
                    //   final latLng = await _controller?.getLocation(
                    //       delay: Duration(seconds: 2));
                    //   await enableFluttifyLog(false); // 关闭log
                    //   _loadData(latLng);
                    // } else {
                    //   //无权限
                    //   _showLocPemWidget();
                    // }
                  },
                  onMapMoveEnd: (MapMove move) async {
                    _loadData(move.coordinate);
                  },
                ),
                Center(
                  child: Icon(
                    Icons.place,
                    size: 36.0,
                    color: Color(0xFFFF0000),
                  ),
                ),
              ],
            ),
          ),
          Expanded(
            flex: 1,
            child: Visibility(
              visible: !isloading,
              maintainSize: false,
              maintainSemantics: false,
              maintainInteractivity: false,
              replacement: Center(
                child: CupertinoActivityIndicator(),
              ),
              child: ListView.builder(
                  itemCount: list.length,
                  itemBuilder: (BuildContext context, int position) {
                    print("itemBuilder" + list.length.toString());
                    PoiModel item = list[position];
                    return InkWell(
                      child: Column(
                        children: <Widget>[
                          Container(
                            margin:
                                EdgeInsets.only(top: 8, bottom: 5, left: 10),
                            child: Row(
                              children: <Widget>[
                                Icon(
                                  Icons.place,
                                  size: 20.0,
                                  color: position == 0
                                      ? Colors.green
                                      : Colors.grey,
                                ),
                                Expanded(
                                    child: Text(item.title,
                                        style: TextStyle(
                                            fontSize: 16,
                                            color: position == 0
                                                ? Colors.green
                                                : Color(0xFF787878))))
                              ],
                            ),
                          ),
                          Container(
                            margin:
                                EdgeInsets.only(top: 5, bottom: 5, left: 18),
                            alignment: Alignment.centerLeft,
                            child: Text(
                              item.address,
                              style: TextStyle(
                                fontSize: 14,
                                color: Color(0xFF646464),
                              ),
                            ),
                          ),
                          Divider(
                            height: 1,
                          )
                        ],
                      ),
                      onTap: () async {
                        // await _controller.setCenterCoordinate(
                        //     LatLng(item.latLng.latitude, item.latLng.longitude),
                        //     zoomLevel: 16);
                        Navigator.pop(context, {
                          'address': item.address,
                          'lat': item.latLng.latitude.toString(),
                          'lng': item.latLng.longitude.toString()
                        });
                      },
                    );
                  }),
            ),
          ),
        ],
      ),
    );
  }

  void _loadData(LatLng latLng) async {
    setState(() {
      isloading = true;
    });

    /// 逆地理编码(坐标转地址)
    ///
    ///
    await AmapLocation.instance.updatePrivacyShow(true);
    await AmapLocation.instance.updatePrivacyAgree(true);
    ReGeocode reGeocodeList = await AmapSearch.instance.searchReGeocode(
      latLng,
    );

    // print(await reGeocodeList.toFutureString());
    address = reGeocodeList.formatAddress;

    await AmapLocation.instance.updatePrivacyShow(true);
    await AmapLocation.instance.updatePrivacyAgree(true);
    final poiList = await AmapSearch.instance.searchAround(
      latLng,
      city: "",
    );

    poiModel = new PoiModel("当前位置", address, latLng);
    list.clear();
    list.add(poiModel);
    for (var poi in poiList) {
      String title = await poi.title;
      String cityName = await poi.cityName;
      String provinceName = await poi.provinceName;
      String address = await poi.address;
      LatLng latLng = await poi.latLng;
      String bussniss = poi.businessArea;

      list.add(new PoiModel(
          title.toString(),
          provinceName.toString() +
              cityName.toString() +
              address.toString() +
              bussniss.toString(),
          latLng));
    }

    setState(() {
      isloading = false;
    });
  }

  void searchAroundAddress(String text) async {
    await AmapLocation.instance.updatePrivacyShow(true);
    await AmapLocation.instance.updatePrivacyAgree(true);
    final poiList = await AmapSearch.instance.searchKeyword(
      text,
      city: "",
    );

    list.clear();
    list.add(poiModel);
    for (var poi in poiList) {
      String title = await poi.title;
      LatLng latLng = await poi.latLng;
      String cityName = await poi.cityName;
      String provinceName = await poi.provinceName;
      String address = await poi.address;
      list.add(new PoiModel(
          title.toString(),
          provinceName.toString() + cityName.toString() + address.toString(),
          latLng));
    }
    setState(() {
      isloading = false;
      FocusScope.of(context).requestFocus(FocusNode());
    });
  }
}

class PoiModel {
  LatLng latLng;
  String title;
  String address;

  PoiModel(this.title, this.address, this.latLng);
}