select_address_page.dart 4.32 KB
import 'package:flutter/material.dart';
import 'package:Parlando/routers/fluro_navigator.dart';
import 'package:Parlando/util/toast_utils.dart';
import 'package:Parlando/widgets/my_button.dart';
import 'package:Parlando/widgets/search_bar.dart';
import 'package:flutter_baidu_mapapi_map/flutter_baidu_mapapi_map.dart';

import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
import '../../map/flutter_2d_amap.dart';
import '../../map/interface/amap_2d_controller.dart';
import '../../map/poi_search_model.dart';

class AddressSelectPage extends StatefulWidget {
  const AddressSelectPage({Key? key}) : super(key: key);

  @override
  AddressSelectPageState createState() => AddressSelectPageState();
}

class AddressSelectPageState extends State<AddressSelectPage> {
  List<PoiSearch> _list = [];
  int _index = 0;
  final ScrollController _controller = ScrollController();
  AMap2DController? _aMap2DController;
  late BMFMapController myMapController;

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

  @override
  void initState() {
    super.initState();
    // TODO 需要根据项目单独设置keys
    Flutter2dAMap.setApiKey(
      iOSKey: 'd94fbf50f5bfa86cd4e793c9ed4a9a97',
    );
  }

  /// 创建完成回调
  void onBMFMapCreated(BMFMapController controller) {
    myMapController = controller;

    /// 地图加载回调
    myMapController.setMapDidLoadCallback(callback: () {
      print('mapDidLoad-地图加载完成');
    });
  }

  /// 设置地图参数
  BMFMapOptions initMapOptions() {
    BMFMapOptions mapOptions = BMFMapOptions(
      center: BMFCoordinate(39.917215, 116.380341),
      zoomLevel: 12,
    );
    return mapOptions;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: false,
      appBar: SearchBar(
        hintText: '搜索地址',
        onPressed: (text) {
          _controller.animateTo(0.0,
              duration: const Duration(milliseconds: 10), curve: Curves.ease);
          _index = 0;
          _aMap2DController?.search(text);
        },
      ),
      body: SafeArea(
        child: Column(
          children: <Widget>[
            Expanded(
              flex: 9,
              child: BMFMapWidget(
                onBMFMapCreated: onBMFMapCreated,
                mapOptions: initMapOptions(),
              ),
            ),
            Expanded(
              flex: 11,
              child: ListView.separated(
                controller: _controller,
                itemCount: _list.length,
                separatorBuilder: (_, index) => const Divider(),
                itemBuilder: (_, index) {
                  return _AddressItem(
                    isSelected: _index == index,
                    date: _list[index],
                    onTap: () {
                      _index = index;
                      _aMap2DController?.move(
                          _list[index].latitude!, _list[index].longitude!);
                      setState(() {});
                    },
                  );
                },
              ),
            ),
            MyButton(
              onPressed: () {
                if (_list.isEmpty) {
                  Toast.show('未选择地址!');
                  return;
                }
                NavigatorUtils.goBackWithParams(context, _list[_index]);
              },
              text: '确认选择地址',
            )
          ],
        ),
      ),
    );
  }
}

class _AddressItem extends StatelessWidget {
  const _AddressItem({
    Key? key,
    required this.date,
    this.isSelected = false,
    this.onTap,
  }) : super(key: key);

  final PoiSearch date;
  final bool isSelected;
  final GestureTapCallback? onTap;

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: onTap,
      child: Container(
        alignment: Alignment.centerLeft,
        padding: const EdgeInsets.symmetric(horizontal: 16.0),
        height: 50.0,
        child: Row(
          children: <Widget>[
            Expanded(
              child: Text(
                '${date.provinceName!} ${date.cityName!} ${date.adName!} ${date.title!}',
              ),
            ),
            Visibility(
              visible: isSelected,
              child: const Icon(Icons.done, color: Colors.blue),
            )
          ],
        ),
      ),
    );
  }
}