amap_track_fluttify 0.1.0 amap_track_fluttify: ^0.1.0 copied to clipboard
An `Amap` Track Component, Powered By `Fluttify` Compiler, A Dart Bindings Generator For Native SDK.
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));
},
),
);
}
}