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
更多关于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
插件:
- 导入插件:
在你的Dart文件中导入插件:
import 'package:courier_flutter/courier_flutter.dart';
- 初始化插件:
根据插件的文档,你可能需要进行一些初始化操作。不过,大多数Flutter插件在调用其功能时会自动初始化。
- 查询物流信息:
假设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部分寻求帮助。