Flutter插件wipter_sdk的安装及使用

Flutter插件wipter_sdk的安装及使用

Wipter SDK Flutter 插件为 Flutter 应用提供了对 Wipter SDK Android 库的封装,使 Flutter 应用能够利用 WipterSDK 的功能,包括管理 OAuth 认证、状态变化以及启动和停止 SDK 功能。

Flutter插件wipter_sdk的安装

  1. pubspec.yaml 文件中添加以下依赖项:
dependencies:
  wipter_sdk: ^<最新版本>
  1. 然后运行:
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的使用

  1. 导入库:
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

getDeviceIdgetSessionId 方法分别提供与设备和当前会话相关的唯一标识符。

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

回到顶部