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

(一)标准一车一单,正常运输:

  1. 点击右上角添加一条运单,注意起点设置在当前位置,
  2. 点击开始运输,选择运单,确认开始。
  3. 驾车前往收货点,必须正常行驶,中途 APP 不要关闭。
  4. 到达收货围栏范围,点击结束运输即可。

(二)一车多单

  1. 点击右上角添加多条运单,起点可以不设置在当前位置,但是模拟时不方便。
  2. 驾车前往对应的装货点,点击开始运输,选择围栏内的运单(可以一次多选,也可以分批选),确认开始,
  3. 依次前往对应的装货点,完成(2),让运单全部装货完成
  4. 依次前往收货点,选择围栏内的运单(可多选),点击结束运输即可

(三)中途换车

  1. 右上角添加一条运单(多条也行)点击开始运输
  2. 点击暂停运输,并标记暂停原因(要记下来选的哪一个)
  3. 点击右上角换车,根据标记的原因,换车只修改车牌号,换人只修改司机,换人换车两个都修改,换手机需要先记下运单号+分单号+运单起点+终点(点击运单列表项可以查看运单信息),替换手机后点击右上角添加相同的运单数据,点击开始运输即可(正常应该走重启运单,但其实两个接口都可以。不建议做换手机测试,太麻烦)。
  4. 点击恢复运单,选择之前标记的原因,重新开始。
  5. 到达收货围栏结束运输即可

(四)临时更换收货地址

  1. 正常开始一条运单,参考上面
  2. 未达到收货点,点击强制结束,选择需要强制结束的订单
  3. 选择强制结束的原因即可

开始使用

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(); // 销毁围栏中使用的定位

参与贡献

  1. 本插件 由小镖人开发团队 开发并维护
  2. 贵州省网络货运社区平台 已上线,免费帮助物流企业完成网络货运转型,免费提供网络货运材料,所有 APP, 软件免费提供,45天内拿证
  3. 小镖人网络货运平台 系 贵州省网络货运孵化平台 子平台,欢迎货主用户、车主用户入驻,共享政策福利
  4. 在 贵州省网络货运社区平台 完成孵化的企业,产品名称、LOGO、APP 支持自定义,完全免费,但是需植入 由小镖人开发的 社区系统,社区系统由小镖人维护,但可以与孵化平台共享收益,且孵化平台企业独立运营自己的产品,社区平台不参与孵化平台的其他业务收益。
  5. 申请网络货运孵化 请移步 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

1 回复

更多关于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');
    }
  }
}
回到顶部