amap_track_fluttify 0.1.0 copy "amap_track_fluttify: ^0.1.0" to clipboard
amap_track_fluttify: ^0.1.0 copied to clipboard

An `Amap` Track Component, Powered By `Fluttify` Compiler, A Dart Bindings Generator For Native SDK.

example/lib/main.dart

import 'package:amap_map_fluttify/amap_map_fluttify.dart';
import 'package:amap_track_fluttify/amap_track_fluttify.dart';
import 'package:decorated_flutter/decorated_flutter.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:oktoast/oktoast.dart';
import 'package:permission_handler/permission_handler.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AmapTrack.instance.init(
    iosKey: 'f683a5d453e95e6a8bd9382469d8f3ec',
    serviceId: 192996,
  );
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return OKToast(child: MaterialApp(home: _Home()));
  }
}

class _Home extends StatefulWidget {
  @override
  __HomeState createState() => __HomeState();
}

class __HomeState extends State<_Home> {
  TextEditingController _terminalName;
  int _terminalId;
  int _trackId;
  List<String> _state = [];
  ScrollController _stateController;

  bool _correct;

  @override
  void initState() {
    super.initState();
    _terminalName = TextEditingController(text: '测试终端');
    _stateController = ScrollController();
    _correct = false;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: false,
      appBar: AppBar(title: const Text('Plugin example app')),
      body: DecoratedColumn(
        padding: EdgeInsets.all(kSpace16),
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: [
          Row(
            children: [
              Expanded(
                child: TextField(
                  controller: _terminalName,
                  decoration: InputDecoration(hintText: '请输入终端名称'),
                ),
              ),
              RaisedButton(
                onPressed: _handleQueryTerminal,
                child: Text('查询终端'),
              ),
            ],
          ),
          DecoratedRow(
            expanded: true,
            crossAxisAlignment: CrossAxisAlignment.start,
            padding: EdgeInsets.symmetric(vertical: kSpace16),
            children: [
              DecoratedColumn(
                expanded: true,
                children: [
                  RaisedButton(
                    onPressed: _handleStartService,
                    child: Text('启动追踪服务'),
                  ),
                  RaisedButton(
                    onPressed: _handleStopService,
                    child: Text('停止追踪服务'),
                  ),
                  RaisedButton(
                    onPressed: _handleStartGather,
                    child: Text('开始收集定位数据'),
                  ),
                  RaisedButton(
                    onPressed: _handleStopGather,
                    child: Text('停止收集定位数据'),
                  ),
                  RaisedButton(
                    onPressed: _handleQueryLastPoint,
                    child: Text('查询终端最近一次位置'),
                  ),
                  RaisedButton(
                    onPressed: _handleQueryDistance,
                    child: Text('查询终端行驶里程'),
                  ),
                  RaisedButton(
                    onPressed: _handleQueryHistoryTrack,
                    child: Text('查询终端历史轨迹'),
                  ),
                  SwitchListTile(
                    onChanged: (value) {
                      setState(() => _correct = value);
                    },
                    title: Text('轨迹纠偏'),
                    value: _correct,
                  ),
                  RaisedButton(
                    onPressed: _handleAddTrack,
                    child: Text('创建轨迹'),
                  ),
                  RaisedButton(
                    onPressed: _handleStartTrackToTrackId,
                    child: Text('上报到指定轨迹'),
                  ),
                ],
              ),
              SPACE_8,
              Expanded(
                child: ListView.builder(
                  itemCount: _state.length,
                  shrinkWrap: true,
                  reverse: true,
                  controller: _stateController,
                  itemBuilder: (_, index) {
                    final data = _state[index];
                    final error = data.startsWith('__');
                    return Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Text(
                        data.replaceFirst('__', ''),
                        style: TextStyle(
                          color: error ? Colors.red : Colors.black,
                        ),
                      ),
                    );
                  },
                ),
              ),
            ],
          ),
        ],
      ),
    );
  }

  void _handleQueryTerminal() async {
    if (isEmpty(_terminalName.text)) {
      toast('请输入终端名称');
      return;
    }
    try {
      final response =
          await AmapTrack.instance.queryTerminal(_terminalName.text);
      _terminalId = response.terminalId;
      if (_terminalId <= 0) {
        _terminalId = await AmapTrack.instance.addTerminal(_terminalName.text);
        _addState('创建新终端: $_terminalId');
      } else {
        _addState('查询到已有终端: $_terminalId');
      }
    } catch (e) {
      _addState(e.toString(), error: true);
    }
  }

  void _handleStartService() async {
    if (_terminalId == null) {
      toast('请先创建终端');
      return;
    }
    final status = await Permission.location.request();
    if (status.isGranted) {
      try {
        await AmapTrack.instance.startService(_terminalId);
        _addState('寻迹服务开启成功');
      } catch (e) {
        _addState(e.toString(), error: true);
      }
    } else {
      _addState('需要定位权限', error: true);
    }
  }

  void _handleStopService() async {
    if (_terminalId == null) {
      toast('请先创建终端');
      return;
    }
    try {
      await AmapTrack.instance.stopService(_terminalId);
      _addState('寻迹停止服务成功');
    } catch (e) {
      _addState(e.toString(), error: true);
    }
  }

  void _handleStartGather() async {
    if (_terminalId == null) {
      toast('请先创建终端');
      return;
    }
    final status = await Permission.location.request();
    if (status.isGranted) {
      try {
        await AmapTrack.instance.startGather(_terminalId);
        _addState('开始采集定位');
      } catch (e) {
        _addState(e.toString(), error: true);
      }
    } else {
      _addState('需要定位权限', error: true);
    }
  }

  void _handleStopGather() async {
    if (_terminalId == null) {
      toast('请先创建终端');
      return;
    }
    try {
      await AmapTrack.instance.stopGather();
      _addState('停止采集定位');
    } catch (e) {
      _addState(e.toString(), error: true);
    }
  }

  void _handleQueryLastPoint() async {
    if (_terminalId == null) {
      toast('请先创建终端');
      return;
    }
    try {
      final point = await AmapTrack.instance.queryLastPoint(_terminalId);
      _addState('实时位置: $point');
    } catch (e) {
      _addState(e.toString(), error: true);
    }
  }

  void _handleQueryDistance() async {
    toast('请购买专业版使用');
  }

  void _handleQueryHistoryTrack() async {
    toast('请购买专业版使用');
  }

  void _handleAddTrack() async {
    toast('请购买专业版使用');
  }

  void _handleStartTrackToTrackId() async {
    if (_terminalId == null) {
      toast('请先创建终端');
      return;
    }
    if (_trackId == null) {
      toast('请先创建轨迹');
      return;
    }
    final status = await Permission.location.request();
    if (status.isGranted) {
      try {
        await AmapTrack.instance.startService(_terminalId, trackId: _trackId);
        _addState('指定轨迹id开启成功');
      } catch (e) {
        _addState(e.toString(), error: true);
      }
    } else {
      _addState('需要定位权限', error: true);
    }
  }

  void _addState(String content, {bool error = false}) {
    final text =
        '${error ? '__' : ''}${DateFormat('yMd HH:mm:ss').format(DateTime.now())} $content';
    setState(() => _state.add(text));
    _stateController.jumpTo(_stateController.position.maxScrollExtent);
  }
}

class TrackScreen extends StatelessWidget {
  const TrackScreen(this.track, {Key key}) : super(key: key);

  final List<LatLng> track;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Track')),
      body: AmapView(
        zoomLevel: 17,
        onMapCreated: (controller) async {
          await controller.showMyLocation(MyLocationOption());
          await controller.addPolyline(PolylineOption(latLngList: track));
        },
      ),
    );
  }
}
0
likes
30
pub points
0%
popularity

Publisher

verified publisherfluttify.com

An `Amap` Track Component, Powered By `Fluttify` Compiler, A Dart Bindings Generator For Native SDK.

Homepage

License

unknown (LICENSE)

Dependencies

amap_core_fluttify, amap_location_fluttify, core_location_fluttify, flutter, foundation_fluttify

More

Packages that depend on amap_track_fluttify