Flutter插件wipter_sdk的安装及使用
Flutter插件wipter_sdk的安装及使用
Wipter SDK Flutter 插件为 Flutter 应用提供了对 Wipter SDK Android 库的封装,使 Flutter 应用能够利用 WipterSDK 的功能,包括管理 OAuth 认证、状态变化以及启动和停止 SDK 功能。
Flutter插件wipter_sdk的安装
- 在
pubspec.yaml
文件中添加以下依赖项:
dependencies:
wipter_sdk: ^<最新版本>
- 然后运行:
flutter pub get
Android
确保您的项目使用了 Maven Central 和 Jitpack.io 作为依赖项仓库。例如:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven {
url = uri("https://jitpack.io")
}
}
}
Flutter插件wipter_sdk的使用
- 导入库:
import 'package:wipter_sdk/wipter_sdk.dart';
初始化
要使用 SDK,必须首先调用 setup
方法并传入所需参数:
clientId
: 您的 OAuth 客户端 ID。clientSecret
: 您的 OAuth 客户端密钥。autoStart
(可选):如果为true
,SDK 将在设置后立即启动,默认参数为false
。
示例:
await WipterSDK.setup(
clientId: '您的客户端ID',
clientSecret: '您的客户端密钥',
autoStart: true,
);
启动SDK
start
方法初始化 SDK 并建立必要的 WebSocket 连接。
参数:
mode
: 确定 SDK 的操作模式:'FOREGROUND_ONLY'
(默认值):仅当应用处于前台时建立连接。'ALWAYS'
:应用处于活跃状态时(前台或后台)保持连接。
networks
: 指定连接的网络类型:'ONLY_UNMETERED_NETWORKS'
(默认值):仅使用 Wi-Fi 或无限制连接。'ALL_NETWORKS'
:允许计量连接,如蜂窝网络。
示例:
await WipterSDK.start(
mode: 'ALWAYS',
networks: 'ALL_NETWORKS',
);
停止SDK
stop
方法停止 SDK 并断开 WebSocket。一旦停止,SDK 无法自动恢复。
await WipterSDK.stop();
获取设备ID和会话ID
getDeviceId
和 getSessionId
方法分别提供与设备和当前会话相关的唯一标识符。
String? deviceId = await WipterSDK.getDeviceId();
String? sessionId = await WipterSDK.getSessionId();
监听SDK状态变化
SDK 通过流发出状态变化。使用 stateStream
获取器监听这些变化。
可能的状态:
Uninitialized
: SDK 尚未初始化。Initializing
: SDK 正在初始化。Initialized
: SDK 已初始化但尚未连接。Authenticating
: SDK 正在认证。Authenticated
: SDK 有一个有效的会话。Connecting
: SDK 正在建立 WebSocket 连接。Running
: SDK 完全连接且正常运行。Error
: SDK 中发生错误。Stopped
: SDK 已停止或连接已断开。Paused
: SDK 因条件未满足而暂停(例如,网络可用性)。
WipterSDK.stateStream.listen(
(state) {
print('SDK State Changed: $state');
},
onError: (error) {
print('Error: $error');
},
);
要求
Android
- 最低 API 级别: 24 (Android 7.0)
- Java 版本: 17 或更高版本
Flutter
- Flutter SDK: 3.10 或更新版本
以下是完整的示例代码:
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:wipter_sdk/wipter_sdk.dart';
import 'dart:io';
import 'package:permission_handler/permission_handler.dart';
import 'package:wipter_sdk/wipter_sdk_model.dart';
import 'package:wipter_sdk/wipter_sdk_state.dart';
import 'package:wipter_sdk/wipter_sdk_transfer_rate.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(primarySwatch: Colors.blue),
home: const MainScreen(),
);
}
}
class MainScreen extends StatefulWidget {
const MainScreen({super.key});
[@override](/user/override)
State<MainScreen> createState() => _MainScreenState();
}
class _MainScreenState extends State<MainScreen> {
SDKState _sdkState = SDKState.uninitialized;
SDKTransferRate _sdkTransferRate = SDKTransferRate(upstreamRate: 0.0, downstreamRate: 0.0);
String? _deviceId = "Not available";
String? _sessionId = "Not available";
[@override](/user/override)
void initState() {
super.initState();
_initializeSDK();
_requestNotificationPermission();
}
Future<void> _initializeSDK() async {
WipterSDK.stateStream.listen((SDKState state) async {
setState(() {
_sdkState = state;
});
if (state == SDKState.running) {
// 请求会话ID
var sessionId = await WipterSDK.getSessionId();
setState(() {
_sessionId = sessionId;
});
}
}, onError: (error) {
// 处理错误
});
WipterSDK.transferRateStream.listen((SDKTransferRate rate) async {
setState(() {
_sdkTransferRate = rate;
});
});
var clientId = "<< 使用您的客户端ID >>";
var clientSecret = "<< 使用您的密钥 >>";
WipterSDK.setupWithClientCredentials(clientId: clientId, clientSecret: clientSecret);
WipterSDK.setBackgroundNotificationProperties(
title: "通知标题",
text: "通知文本"
);
// 连接后请求设备ID
var deviceId = await WipterSDK.getDeviceId();
setState(() {
_deviceId = deviceId;
});
final state = await WipterSDK.getState();
debugPrint("SDK 当前状态: $state");
}
Future<void> _requestNotificationPermission() async {
if (Platform.isAndroid) {
var status = await Permission.notification.status;
if (!status.isGranted) {
await Permission.notification.request();
}
}
}
Future<void> _copyToClipboard(BuildContext context, String label, String text) async {
final ScaffoldMessengerState messenger = ScaffoldMessenger.of(context);
final data = ClipboardData(text: text);
await Clipboard.setData(data);
messenger.showSnackBar(
SnackBar(content: Text('$label 复制到剪贴板')),
);
}
Future<void> _copyLogToClipboard(BuildContext context) async {
final ScaffoldMessengerState messenger = ScaffoldMessenger.of(context);
final logFile = File('${Directory.systemTemp.path}/m_log.txt');
String logContent = "日志文件不存在";
if (await logFile.exists()) {
logContent = await logFile.readAsString();
}
messenger.showSnackBar(
const SnackBar(content: Text('日志文件复制到剪贴板')),
);
await Clipboard.setData(ClipboardData(text: logContent));
}
Future<void> _startSDK(SDKServiceMode mode) async {
await WipterSDK.start(mode: mode);
}
Future<void> _stopSDK() async {
await WipterSDK.stop();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Wipter SDK 示例"),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text("设备ID: $_deviceId"),
Text("会话ID: $_sessionId"),
if (_deviceId != null && _deviceId!.isNotEmpty)
ElevatedButton(
onPressed: () => _copyToClipboard(context, "设备ID", _deviceId!),
child: const Text("将设备ID复制到剪贴板"),
),
if (_sessionId != null && _sessionId!.isNotEmpty)
ElevatedButton(
onPressed: () => _copyToClipboard(context, "会话ID", _sessionId!),
child: const Text("将会话ID复制到剪贴板"),
),
const Divider(),
Text("$_sdkTransferRate"),
const Divider(),
ElevatedButton(
onPressed: () => _copyLogToClipboard(context),
child: const Text("将日志文件内容复制到剪贴板"),
),
const Divider(),
Text("SDK 状态: ${_sdkState.toReadableString()}"),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () => _startSDK(SDKServiceMode.foregroundOnly),
child: const Text("启动SDK(仅前台)"),
),
const SizedBox(height: 8),
ElevatedButton(
onPressed: () => _startSDK(SDKServiceMode.always),
child: const Text("启动SDK(始终)"),
),
const SizedBox(height: 8),
ElevatedButton(
onPressed: _stopSDK,
child: const Text("停止SDK"),
),
],
),
),
),
);
}
}
更多关于Flutter插件wipter_sdk的安装及使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html