Flutter位置追踪插件flutter_radar的使用
Flutter位置追踪插件flutter_radar的使用
Radar 是一个领先的地理围栏和位置跟踪平台。通过 Radar SDK,您可以轻松地为应用程序添加地理围栏、位置跟踪、行程跟踪、地理编码和搜索功能。
文档
示例代码
以下是一个完整的示例应用,展示了如何在 Flutter 中使用 flutter_radar
插件进行位置跟踪和相关操作。
完整示例 Demo
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter_radar/flutter_radar.dart';
import 'package:permission_handler/permission_handler.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
final ButtonStyle raisedButtonStyle = ElevatedButton.styleFrom(
minimumSize: Size(88, 36),
padding: EdgeInsets.symmetric(horizontal: 16),
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(2)),
),
);
[@override](/user/override)
void initState() {
super.initState();
initRadar();
}
[@override](/user/override)
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.inactive) {
Radar.logResigningActive();
} else if (state == AppLifecycleState.paused) {
Radar.logBackgrounding();
}
}
// 静态回调函数
[@pragma](/user/pragma)('vm:entry-point')
static void onLocation(Map res) {
print('📍📍 onLocation: $res');
}
[@pragma](/user/pragma)('vm:entry-point')
static void onClientLocation(Map res) {
print('📍📍 onClientLocation: $res');
}
[@pragma](/user/pragma)('vm:entry-point')
static void onError(Map res) {
print('📍📍 onError: $res');
}
[@pragma](/user/pragma)('vm:entry-point')
static void onLog(Map res) {
print('📍📍 onLog: $res');
}
[@pragma](/user/pragma)('vm:entry-point')
static void onEvents(Map res) {
print('📍📍 onEvents: $res');
}
[@pragma](/user/pragma)('vm:entry-point')
static void onToken(Map res) {
print('📍📍 onToken: $res');
}
Future<void> initRadar() async {
// 初始化 Radar SDK
Radar.initialize('prj_test_pk_0000000000000000000000000000000000000000');
Radar.setUserId('flutter');
Radar.setDescription('Flutter');
Radar.setMetadata({'foo': 'bar', 'bax': true, 'qux': 1});
Radar.setLogLevel('info');
Radar.setAnonymousTrackingEnabled(false);
// 设置回调函数
Radar.onLocation(onLocation);
Radar.onClientLocation(onClientLocation);
Radar.onError(onError);
Radar.onEvents(onEvents);
Radar.onLog(onLog);
Radar.onToken(onToken);
// 请求权限
await Radar.requestPermissions(false);
await Radar.requestPermissions(true);
var permissionStatus = await Radar.getPermissionsStatus();
if (permissionStatus != "DENIED") {
var b = await Radar.startTrackingCustom({
...Radar.presetResponsive,
"showBlueBar": true,
});
var c = await Radar.getTrackingOptions();
print("Tracking options $c");
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('flutter_radar_example'),
),
body: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Container(
child: Column(children: [
Permissions(),
TrackOnce(),
ElevatedButton(
style: raisedButtonStyle,
onPressed: () async {
var status = await Radar.requestPermissions(false);
print(status);
if (status == 'GRANTED_FOREGROUND') {
status = await Radar.requestPermissions(true);
print(status);
}
},
child: Text('requestPermissions()'),
),
ElevatedButton(
style: raisedButtonStyle,
onPressed: () async {
PermissionStatus status = await Permission.activityRecognition.request();
if (status.isGranted) {
print('Permission granted');
} else {
print('Permission denied');
}
},
child: Text('request activity permissions'),
),
ElevatedButton(
style: raisedButtonStyle,
onPressed: () async {
Radar.setForegroundServiceOptions({
'title': 'Tracking',
'text': 'Trip tracking started',
'icon': 2131165271,
'importance': 2,
'updatesOnly': false,
'activity': 'io.radar.example.MainActivity'
});
var resp = await Radar.startTrip(
tripOptions: {
"externalId": '299',
"destinationGeofenceTag": 'store',
"destinationGeofenceExternalId": '123',
"mode": 'car',
"scheduledArrivalAt": "2020-08-20T10:30:55.837Z",
"metadata": {"test": 123}
},
trackingOptions: {
"desiredStoppedUpdateInterval": 30,
"fastestStoppedUpdateInterval": 30,
"desiredMovingUpdateInterval": 30,
"fastestMovingUpdateInterval": 30,
"desiredSyncInterval": 20,
"desiredAccuracy": "high",
"stopDuration": 0,
"stopDistance": 0,
"replay": "none",
"sync": "all",
"showBlueBar": true,
"useStoppedGeofence": false,
"stoppedGeofenceRadius": 0,
"useMovingGeofence": false,
"movingGeofenceRadius": 0,
"syncGeofences": false,
"syncGeofencesLimit": 0,
"beacons": false,
"foregroundServiceEnabled": true
}
);
print("startTrip: $resp");
},
child: Text('startTrip'),
),
// 其他按钮...
]),
),
),
),
);
}
}
// 权限状态显示组件
class Permissions extends StatefulWidget {
[@override](/user/override)
_PermissionsState createState() => _PermissionsState();
}
class _PermissionsState extends State<Permissions> {
String? _status = 'NOT_DETERMINED';
final ButtonStyle raisedButtonStyle = ElevatedButton.styleFrom(
minimumSize: Size(88, 36),
padding: EdgeInsets.symmetric(horizontal: 16),
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(2)),
),
);
[@override](/user/override)
void initState() {
super.initState();
_getPermissionsStatus();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'$_status',
style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold),
),
ElevatedButton(
style: raisedButtonStyle,
child: Text('getPermissionsStatus()'),
onPressed: () {
_getPermissionsStatus();
},
),
],
);
}
Future _getPermissionsStatus() async {
String? status = await Radar.getPermissionsStatus();
setState(() {
_status = status;
});
}
}
// 跟踪一次位置组件
class TrackOnce extends StatefulWidget {
[@override](/user/override)
_TrackOnceState createState() => _TrackOnceState();
}
class _TrackOnceState extends State<TrackOnce> {
final ButtonStyle raisedButtonStyle = ElevatedButton.styleFrom(
minimumSize: Size(88, 36),
padding: EdgeInsets.symmetric(horizontal: 16),
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(2)),
),
);
[@override](/user/override)
Widget build(BuildContext context) {
return ElevatedButton(
child: Text('trackOnce()'),
style: raisedButtonStyle,
onPressed: () {
_showTrackOnceDialog();
},
);
}
Future<void> _showTrackOnceDialog() async {
var trackResponse = await Radar.trackOnce();
print("trackResponse: $trackResponse");
Widget okButton = TextButton(
child: Text('OK'),
onPressed: () {
Navigator.pop(context);
},
);
AlertDialog alert = AlertDialog(
title: Text('flutter_radar_example'),
content: Text(trackResponse?['status'] ?? ''),
actions: [
okButton,
],
);
showDialog(
context: context,
builder: (BuildContext context) {
return alert;
},
);
}
}
// 显示对话框
showAlertDialog(BuildContext context, String text) {
Widget okButton = TextButton(
child: Text('OK'),
onPressed: () {
Navigator.of(context).pop();
},
);
AlertDialog alert = AlertDialog(
title: Text('flutter_radar_example'),
content: Text(text),
actions: [
okButton,
],
);
showDialog(
context: context,
builder: (BuildContext context) {
return alert;
},
);
}
更多关于Flutter位置追踪插件flutter_radar的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复