Flutter快递物流查询插件courier_flutter的使用

Flutter快递物流查询插件courier_flutter的使用

需求和支持

需求 支持
快递账户 注册
最低iOS SDK版本 15.0
最低Android SDK版本 23

安装

在项目根目录下运行以下命令:

flutter pub add courier_flutter

iOS设置

1. 支持iOS 15.0+

更新你的部署目标到iOS 15。

更新部署目标

2. 安装CocoaPods

从项目的根目录运行:

cd ios && pod install

Android设置

1. 添加Jitpack仓库

android/build.gradle文件中确保你的构建和仓库值如下:

allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' } // 添加这一行
    }
}

2. 支持合适的SDK版本

app/build.gradle文件中更新这些值:

minSdkVersion 23
targetSdkVersion 33+
compileSdkVersion 33+

3. 同步Gradle

你的应用必须支持至少Gradle 8.4

开始使用

以下是SDK的所有可用功能。

功能 描述
认证 管理用户会话间的凭证。如果想使用收件箱、推送通知和偏好设置,则需要认证。
收件箱 一个可以在其中通知用户的内置通知中心。带有预构建的UI,也支持完全自定义的UI。
推送通知 自动管理推送通知设备令牌,并提供方便的功能来处理推送通知的接收和点击。
偏好设置 允许用户更新他们希望接收的通知类型。
Courier客户端 围绕Courier端点的基本API包装器。如果你有高度定制化的用户体验或代码库需求,这很有用。

示例项目

项目链接
示例

分享反馈

我们希望让这个SDK成为管理通知的最佳工具!如果有任何想法或反馈,请联系我们:


示例代码

以下是完整的示例代码,展示了如何使用courier_flutter插件。

import 'env.dart';
import 'example_server.dart';
import 'firebase_options.dart';
import 'package:courier_flutter/courier_provider.dart';
import 'package:courier_flutter/models/courier_inbox_listener.dart';
import 'package:courier_flutter/models/courier_push_listener.dart';
import 'package:courier_flutter_sample/pages/auth.dart';
import 'package:courier_flutter_sample/pages/inbox.dart';
import 'package:courier_flutter_sample/pages/prefs.dart';
import 'package:courier_flutter_sample/pages/push.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:courier_flutter/courier_flutter.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 这是为了处理FCM令牌
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );

  runApp(
    MaterialApp(
      theme: ThemeData(
          // primaryColor: Colors.pink,
          // TODO: 如果你想让收件箱自动继承样式,可以在这里添加更多主题颜色
      ),
      home: const MyApp(),
    ),
  );
}

class Tab {
  NavigationDestination tab;
  Widget page;

  Tab({
    required this.tab,
    required this.page,
  });
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late CourierInboxListener _inboxListener;
  late CourierPushListener _pushListener;

  int _unreadMessageCount = 0;
  int _currentPageIndex = 0;

  [@override](/user/override)
  void initState() {
    super.initState();
    _start();
  }

  Future _refreshJwt() async {
    final currentUserId = await Courier.shared.userId;

    if (currentUserId != null) {
      try {
        // 获取新的令牌
        final token = await ExampleServer.generateJwt(
            authKey: Env.authKey,
            userId: currentUserId
        );

        // 使用新令牌登录
        await Courier.shared.signIn(
            accessToken: token,
            userId: currentUserId
        );
      } catch (error) {
        print(error);
        await Courier.shared.signOut();
      }
    }
  }

  Future _start() async {
    await _refreshJwt();

    _inboxListener = await Courier.shared.addInboxListener(
      onUnreadCountChanged: (unreadCount) {
        setState(() => _unreadMessageCount = unreadCount);
      }
    );

    _pushListener = await Courier.shared.addPushListener(
      onPushDelivered: (push) => showAlert(context, 'Push Delivered', push.toString()),
      onPushClicked: (push) => showAlert(context, 'Push Clicked', push.toString()),
    );

    try {
      final token = await FirebaseMessaging.instance.getToken();
      if (token != null) {
        Courier.shared.setTokenForProvider(provider: CourierPushProvider.firebaseFcm, token: token);
      }
    } catch (e) {
      print(e);
    }

    // 监听Firebase令牌刷新
    FirebaseMessaging.instance.onTokenRefresh.listen((fcmToken) {
      Courier.shared.setTokenForProvider(provider: CourierPushProvider.firebaseFcm, token: fcmToken);
    }).onError((error) {
      print(error);
    });
  }

  List<Tab> _getTabs(int unreadCount) {
    return [
      Tab(
          tab: const NavigationDestination(
            selectedIcon: Icon(Icons.person_2_sharp),
            icon: Icon(Icons.person_2_outlined),
            label: 'Auth',
          ),
          page: const AuthPage()),
      Tab(
        tab: const NavigationDestination(
          selectedIcon: Icon(Icons.message_sharp),
          icon: Icon(Icons.message_outlined),
          label: 'Push',
        ),
        page: const PushPage(),
      ),
      Tab(
        tab: NavigationDestination(
          selectedIcon: unreadCount > 0 ? Badge(label: Text(unreadCount.toString()), child: const Icon(Icons.inbox_sharp)) : const Icon(Icons.inbox_sharp),
          icon: unreadCount > 0 ? Badge(label: Text(unreadCount.toString()), child: const Icon(Icons.inbox_outlined)) : const Icon(Icons.inbox_outlined),
          label: 'Inbox',
        ),
        page: const InboxPage(),
      ),
      Tab(
        tab: const NavigationDestination(
          selectedIcon: Icon(Icons.room_preferences_sharp),
          icon: Icon(Icons.room_preferences_outlined),
          label: 'Preferences',
        ),
        page: const PrefsPage(),
      )
    ];
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: _getTabs(_unreadMessageCount).map((tab) => tab.page).toList()[_currentPageIndex],
      bottomNavigationBar: NavigationBar(
        onDestinationSelected: (int index) {
          setState(() {
            _currentPageIndex = index;
          });
        },
        selectedIndex: _currentPageIndex,
        destinations: _getTabs(_unreadMessageCount).map((tab) => tab.tab).toList(),
      ),
    );
  }

  void _removeListeners() {
    _pushListener.remove();
    _inboxListener.remove().catchError((error) {
      Courier.log('Failed to remove inbox listener: $error');
    });
  }

  [@override](/user/override)
  void dispose() {
    _removeListeners();
    super.dispose();
  }
}

// 显示对话框
showAlert(BuildContext context, String title, String body) {
  showDialog(
    context: context,
    builder: (context) => AlertDialog(
      title: Text(title),
      content: Scrollbar(
        child: SingleChildScrollView(
          scrollDirection: Axis.vertical,
          child: Text(body),
        ),
      ),
      actions: [
        TextButton(
          child: const Text('OK'),
          onPressed: () => Navigator.pop(context),
        )
      ],
    ),
  );
}

更多关于Flutter快递物流查询插件courier_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter快递物流查询插件courier_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用courier_flutter插件进行快递物流查询的示例代码。courier_flutter插件(假设存在,因为实际插件可能会有所不同)通常会提供一个接口来查询物流信息。

首先,你需要在你的pubspec.yaml文件中添加这个插件:

dependencies:
  flutter:
    sdk: flutter
  courier_flutter: ^x.y.z  # 替换为实际的版本号

然后运行flutter pub get来获取依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤使用courier_flutter插件:

  1. 导入插件

在你的Dart文件中导入插件:

import 'package:courier_flutter/courier_flutter.dart';
  1. 初始化插件

根据插件的文档,你可能需要进行一些初始化操作。不过,大多数Flutter插件在调用其功能时会自动初始化。

  1. 查询物流信息

假设courier_flutter插件提供了一个queryTracking方法来查询物流信息,你可以这样使用它:

import 'package:flutter/material.dart';
import 'package:courier_flutter/courier_flutter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Courier Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TrackingPage(),
    );
  }
}

class TrackingPage extends StatefulWidget {
  @override
  _TrackingPageState createState() => _TrackingPageState();
}

class _TrackingPageState extends State<TrackingPage> {
  String trackingResult = "";
  String trackingNumber = "YOUR_TRACKING_NUMBER"; // 替换为你的快递单号

  void _queryTracking() async {
    try {
      // 假设插件提供了这个方法
      CourierResult result = await CourierFlutter.queryTracking(trackingNumber);
      
      // 假设CourierResult是一个包含物流信息的类
      setState(() {
        trackingResult = "Status: ${result.status}\n"
            "Location: ${result.location}\n"
            "Event Time: ${result.eventTime}";
      });
    } catch (e) {
      setState(() {
        trackingResult = "Error: $e";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Courier Tracking'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              decoration: InputDecoration(
                labelText: 'Tracking Number',
              ),
              onChanged: (value) {
                setState(() {
                  trackingNumber = value;
                });
              },
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _queryTracking,
              child: Text('Query Tracking'),
            ),
            SizedBox(height: 20),
            Text(trackingResult),
          ],
        ),
      ),
    );
  }
}

// 假设CourierResult类如下(实际应根据插件提供的类定义)
class CourierResult {
  String status;
  String location;
  String eventTime;

  CourierResult({required this.status, required this.location, required this.eventTime});
}

请注意:

  • CourierFlutter.queryTracking方法和CourierResult类是基于假设的,实际使用时需要参考courier_flutter插件的文档。
  • trackingNumber应该是一个用户输入的快递单号。
  • 插件的实际API和方法可能会有所不同,因此请务必参考官方文档。

如果你遇到任何问题,可以查阅courier_flutter插件的官方文档或在其GitHub仓库的issue部分寻求帮助。

回到顶部