Flutter物流运费计算插件xbr_network_freight的使用
Flutter物流运费计算插件xbr_network_freight的使用
说明
物流-部分货运:网络货运SDK
调试版本就可以完成网络货运接入申请,并附带电子围栏。
截图
调试
1. 打开版本列表,下载最新版本工程
2. Android Studio 打开工程,Flutter 版本不得低于2.2.3
3. 打开 example > lib > auth > yilin_auth.dart, 填写自己公司申请的网络货运相应账号
4. 点击运行,安装 APP
(一)标准一车一单,正常运输:
- 点击右上角添加一条运单,注意起点设置在当前位置,
- 点击开始运输,选择运单,确认开始。
- 驾车前往收货点,必须正常行驶,中途 APP 不要关闭。
- 到达收货围栏范围,点击结束运输即可。
(二)一车多单
- 点击右上角添加多条运单,起点可以不设置在当前位置,但是模拟时不方便。
- 驾车前往对应的装货点,点击开始运输,选择围栏内的运单(可以一次多选,也可以分批选),确认开始,
- 依次前往对应的装货点,完成(2),让运单全部装货完成
- 依次前往收货点,选择围栏内的运单(可多选),点击结束运输即可
(三)中途换车
- 右上角添加一条运单(多条也行)点击开始运输
- 点击暂停运输,并标记暂停原因(要记下来选的哪一个)
- 点击右上角换车,根据标记的原因,换车只修改车牌号,换人只修改司机,换人换车两个都修改,换手机需要先记下运单号+分单号+运单起点+终点(点击运单列表项可以查看运单信息),替换手机后点击右上角添加相同的运单数据,点击开始运输即可(正常应该走重启运单,但其实两个接口都可以。不建议做换手机测试,太麻烦)。
- 点击恢复运单,选择之前标记的原因,重新开始。
- 到达收货围栏结束运输即可
(四)临时更换收货地址
- 正常开始一条运单,参考上面
- 未达到收货点,点击强制结束,选择需要强制结束的订单
- 选择强制结束的原因即可
开始使用
1. 引入:xbr_network_freight.3.0.0
dependencies:
xbr_network_freight: ^3.0.0
2. APP 进入时完成 FreightTask 初始化,做好懒加载
freightTask = FreightTask.getInstance(
tmsAppId: Yilin.tmsAppId,
appSecurity: Yilin.appSecurity,
enterpriseSenderCode: Yilin.enterpriseSenderCode,
environment: Yilin.environment,
taskListener: (bool success, String? code, String? msg, List<ShippingNoteInfo>? infos) {
// 这里是日志回调接口,用于打印任务日志
},
);
3. APP 进入时:取出平台后台服务器的运输中的运单数据,构造(localInfoList)数据,传进认证接口
freightTask?.authInitRun(localInfoList: localInfoList, successBack: (code, msg, infos) {
// 认证成功,返回的 infos 状态已全部是已开始状态,如果没有运行中的订单,这里就不用管了
// 如果 infos 大小不为空,需要保存 infos,同步到运单也行
});
4. 新运单开始,运单开始成功任务系统自动发送定位,send。
freightTask?.startRunTask(shippingNoteInfos: list, remark: remark, successBack: (code, msg, infos) {
// 运单开始传入 list 运单信息,如果是一车多单,remark 要标记 [99] 车牌号,list 如果起点一致可以一起传,如果起点不一致就到达装货点分开传,传一个也不影响一车多单
// 但是必须在结束前,保证全部开始一车多单的所有运单
// 开始运单要设置电子围栏,在发货点位置附近才能点击开始运单,否则打印的运单轨迹会出问题。
});
5. 恢复运单,运单恢复成功任务系统自动发送定位,send。
freightTask?.reStartRunTask(shippingNoteInfos: list, remark: value, successBack: (code, msg, infos) {
// 暂停运单后,平台运单体系运单是暂停状态,可以恢复,根据运单标记的状态,替换相应数据后传入 list
// 注意:运单暂停 > 恢复运单 标记要一致, 操作场景要一致(标记换车就要换车,标记换人就要换司机,标记换手机就要换手机)。
// 标记换手机时:在上一台手机上点击暂停运单,remark 标记为 [02] 换手机,并关闭手机,打开新手机,获取平台运单暂停数据,
// 点击恢复运单,remark 标记为 [02] 换手机
// 如果旧手机无法暂停怎么办,突然没电,突然死机,损坏等意外:直接在新手机上开始运单(不用恢复,因为旧手机没有标记暂停,运单应该还是标记为开始运行状态,
// 利用平台运单体系,重新执行开始运输运单(只要单号相同,最终轨迹线还是会连在一起的)。
// 但是注意:平台要判断,平台标记运输完成的运单,即使 SDK 初始化时显示在运行中,也不能执行发送定位
// (这个插件只要把平台数据传入认证(authInitRun),插件是不会执行平台没有的运单的,但要保证传入的运单是运行中的)。
});
6. 结束运单 定位也会自动停止
freightTask?.stopRunTask(shippingNoteInfos: list, remark: value, successBack: (code, msg, infos) {
// 正常情况下要利用电子围栏判断运单能不能结束,否则如果在非地点结束的话又没有标记运单,是要被查的,
// 只要在非收货地点附近(我设的是300米,运管要求应该没有这么严)结束运单,必须标记非正常结束的原因([00]车辆损坏 [01]货主临时改变收货位置)。
// 正常在收货围栏结束后,可以登录运管系统查看运单轨迹。
});
7. 退出登录/关闭网络货运任务系统 视情况关闭
freightTask?.disposeTask(); // 关闭网络货运任务系统,FreightTask
controller?.disponse(); // 地图控制器
uiController.dispose(); // 地图绘制控制器
XbrGaodeLocation.instance().destroyLocation(); // 销毁围栏中使用的定位
参与贡献
- 本插件 由小镖人开发团队 开发并维护
- 贵州省网络货运社区平台 已上线,免费帮助物流企业完成网络货运转型,免费提供网络货运材料,所有 APP, 软件免费提供,45天内拿证
- 小镖人网络货运平台 系 贵州省网络货运孵化平台 子平台,欢迎货主用户、车主用户入驻,共享政策福利
- 在 贵州省网络货运社区平台 完成孵化的企业,产品名称、LOGO、APP 支持自定义,完全免费,但是需植入 由小镖人开发的 社区系统,社区系统由小镖人维护,但可以与孵化平台共享收益,且孵化平台企业独立运营自己的产品,社区平台不参与孵化平台的其他业务收益。
- 申请网络货运孵化 请移步 https://www.yilinwuliu.cn 或直接联系平台业务专员:程 | 15286063702
SDK 插件版本
高德版:2.1.1
示例代码
import 'package:flutter/material.dart';
import 'package:xbr_gaode_amap/xbr_gaode_amap.dart';
import 'package:xbr_gaode_location/xbr_gaode_location.dart';
import 'package:xbr_network_freight/xbr_network_freight.dart';
import 'core/permission_check.dart';
import 'net_freght_page.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
[@override](/user/override)
void initState() {
super.initState();
///初始化
initKey(
androidKey:"488c701a9879b03854e5324f173d6fbd",
iosKey: "921894ad2f90670087f59b9356c04769",
);
initNetFreight();
}
void initKey({androidKey,iosKey}){
XbrGaodeAmap.initKey(androidKey: androidKey, iosKey: iosKey);
XbrGaodeAmap.updatePrivacy(hasContains: true, hasShow: true, hasAgree: true);
XbrGaodeLocation.initKey(androidKey: androidKey, iosKey: iosKey);
XbrGaodeLocation.updatePrivacy(hasContains: true, hasShow: true, hasAgree: true);
}
void initNetFreight(){
XbrNetworkFreight.init();
}
[@override](/user/override)
Widget build(BuildContext context) {
return const MaterialApp(
home: IndexPage(),
);
}
}
///
/// HOME
///
class IndexPage extends StatefulWidget{
const IndexPage({Key? key}) : super(key: key);
[@override](/user/override)
State<IndexPage> createState() => _IndexPageState();
}
class _IndexPageState extends State<IndexPage> {
String permissionCheck = "正在检查权限";
[@override](/user/override)
void initState() {
super.initState();
permissionInit();
}
// 权限检查
void permissionInit() {
PermissionCheck(context, (success) {
setState(() {
permissionCheck = "权限检查成功";
});
}).request();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("网络货运官方SDK,FLUTTER插件"),
),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(permissionCheck),
const SizedBox(height: 20),
ElevatedButton(
style: ElevatedButton.styleFrom(minimumSize: const Size(150,48)),
child: const Text("打开模拟运单(地图)界面"),
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => const NetFreghtPage()));
},
)
],
),
),
);
}
}
更多关于Flutter物流运费计算插件xbr_network_freight的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter物流运费计算插件xbr_network_freight的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
xbr_network_freight
是一个用于计算物流运费的 Flutter 插件。它可以帮助开发者轻松集成物流运费计算功能到他们的 Flutter 应用中。以下是如何使用 xbr_network_freight
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 xbr_network_freight
插件的依赖。
dependencies:
flutter:
sdk: flutter
xbr_network_freight: ^1.0.0 # 请查看最新版本号
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在你的 Dart 文件中导入 xbr_network_freight
插件。
import 'package:xbr_network_freight/xbr_network_freight.dart';
3. 初始化插件
在使用插件之前,通常需要进行初始化。你可以通过调用 initialize
方法来设置一些基本的配置。
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await XbrNetworkFreight.initialize(
apiKey: 'YOUR_API_KEY', // 你的API密钥
baseUrl: 'https://api.example.com', // API的基本URL
);
runApp(MyApp());
}
4. 计算运费
使用 calculateFreight
方法来计算运费。你需要提供一些必要的信息,如起始地、目的地、货物重量、体积等。
void calculateFreight() async {
try {
FreightRequest request = FreightRequest(
origin: 'Shanghai', // 起始地
destination: 'Beijing', // 目的地
weight: 10.0, // 重量 (kg)
volume: 0.5, // 体积 (m³)
serviceType: 'standard', // 服务类型
);
FreightResponse response = await XbrNetworkFreight.calculateFreight(request);
print('Freight Cost: ${response.cost}');
print('Estimated Delivery Time: ${response.estimatedDeliveryTime}');
} catch (e) {
print('Error calculating freight: $e');
}
}
5. 处理响应
calculateFreight
方法返回一个 FreightResponse
对象,其中包含运费、预计送达时间等信息。你可以根据需要进行处理。
if (response.cost != null) {
// 显示运费
} else {
// 处理错误或提示用户
}
6. 错误处理
在使用插件时,可能会遇到各种错误,如网络错误、API 错误等。你可以使用 try-catch
块来捕获并处理这些错误。
try {
FreightResponse response = await XbrNetworkFreight.calculateFreight(request);
// 处理响应
} catch (e) {
print('Error: $e');
// 显示错误信息给用户
}
7. 其他功能
xbr_network_freight
插件可能还提供其他功能,如获取支持的物流公司列表、查询物流状态等。你可以查阅插件的文档或源代码以了解更多信息。
8. 示例代码
以下是一个完整的示例代码,展示了如何使用 xbr_network_freight
插件计算运费。
import 'package:flutter/material.dart';
import 'package:xbr_network_freight/xbr_network_freight.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await XbrNetworkFreight.initialize(
apiKey: 'YOUR_API_KEY',
baseUrl: 'https://api.example.com',
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('物流运费计算')),
body: Center(
child: ElevatedButton(
onPressed: calculateFreight,
child: Text('计算运费'),
),
),
),
);
}
void calculateFreight() async {
try {
FreightRequest request = FreightRequest(
origin: 'Shanghai',
destination: 'Beijing',
weight: 10.0,
volume: 0.5,
serviceType: 'standard',
);
FreightResponse response = await XbrNetworkFreight.calculateFreight(request);
print('Freight Cost: ${response.cost}');
print('Estimated Delivery Time: ${response.estimatedDeliveryTime}');
} catch (e) {
print('Error calculating freight: $e');
}
}
}