Flutter集成AidLab SDK插件aidlab_sdk的使用

Flutter集成AidLab SDK插件aidlab_sdk的使用

欢迎使用官方的Aidlab Flutter SDK。有关安装说明、使用指南和示例,请访问我们的文档

支持的平台

  • Android
  • iOS

完整示例Demo

以下是一个完整的示例,展示了如何在Flutter应用中集成AidLab SDK插件aidlab_sdk

示例代码

import 'package:aidlab_sdk/aidlab_sdk.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'line_chart.dart';

AidlabManager? aidlabManager;

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Aidlab Flutter SDK Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const DeviceListScreen(),
    );
  }
}

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

  [@override](/user/override)
  _DeviceListScreenState createState() => _DeviceListScreenState();
}

class _DeviceListScreenState extends State<DeviceListScreen> implements AidlabManagerDelegate {
  final List<Device> _devices = [];
  bool _isScanning = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    Permission.bluetooth.request();
    Permission.locationWhenInUse.request();
    aidlabManager = AidlabManager(this);
  }

  [@override](/user/override)
  void dispose() {
    aidlabManager?.dispose();
    aidlabManager = null;
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Devices'),
      ),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              itemCount: _devices.length,
              itemBuilder: (context, index) {
                final device = _devices[index];
                return ListTile(
                  title: Text(device.address),
                  onTap: () {
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => DeviceDetailScreen(device: device),
                      ),
                    );
                  },
                );
              },
            ),
          ),
          Padding(
            padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
            child: _isScanning
                ? ElevatedButton(
                    onPressed: () => stopScan(),
                    style: ElevatedButton.styleFrom(backgroundColor: Colors.red),
                    child: const Text('Stop scan'),
                  )
                : ElevatedButton(
                    onPressed: () => startScan(),
                    child: const Text('Start scan'),
                  ),
          ),
        ],
      ),
    );
  }

  void startScan() {
    aidlabManager?.scan(ScanMode.aggressive);
    setState(() {
      _isScanning = true;
    });
  }

  void stopScan() {
    aidlabManager?.stopScan();
    setState(() {
      _isScanning = false;
      _devices.clear();
    });
  }

  [@override](/user/override)
  void didDiscover(Device device, int rssi) {
    setState(() {
      if (!_devices.any((d) => d.address == device.address)) {
        _devices.add(device);
      } else {
        _devices.removeWhere((d) => d.address == device.address);
        _devices.add(device);
      }
    });
  }

  [@override](/user/override)
  void onBluetoothStarted() {
    ScaffoldMessenger.of(context)
        .showSnackBar(const SnackBar(content: Text("Bluetooth started")));
  }

  [@override](/user/override)
  void onDeviceScanStarted() {}

  [@override](/user/override)
  void onDeviceScanStopped() {}

  [@override](/user/override)
  void onScanFailed(int errorCode) {
    /// Show toast
    ScaffoldMessenger.of(context)
        .showSnackBar(SnackBar(content: Text("Scan failed: $errorCode")));
  }
}

class DeviceDetailScreen extends StatefulWidget {
  final Device device;

  const DeviceDetailScreen({super.key, required this.device});

  [@override](/user/override)
  _DeviceDetailScreenState createState() => _DeviceDetailScreenState();
}

class _DeviceDetailScreenState extends State<DeviceDetailScreen> implements DeviceDelegate {
  /// Device information
  String _firmwareRevision = "Unknown";
  String _hardwareRevision = "Unknown";
  String _serialNumber = "Unknown";

  String _heartRate = "Unknown";
  String _skinTemperature = "Unknown";
  String _respirationRate = "Unknown";
  String _rr = "Unknown";
  String _activity = "Unknown";
  int _steps = 0;
  String _soundVolume = "Unknown";
  String _batteryLevel = "Unknown";
  String _signalQuality = "Unknown";
  String _bodyPosition = "Unknown";
  String _wearState = "Unknown";
  String _syncState = "Unknown";
  String _exercise = "Unknown";

  final List<double> _ecg = [];
  final List<double> _respiration = [];

  /// Connect to device when the screen is created
  [@override](/user/override)
  void initState() {
    super.initState();
    widget.device.connect(this);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Device'),
      ),
      body: SingleChildScrollView(
        child: Column(
          children: [
            ListTile(
              title: const Text('Device Address'),
              trailing: Text(widget.device.address),
            ),
            ListTile(
              title: const Text('Device Name'),
              trailing: Text(widget.device.name ?? "Unknown"),
            ),
            ListTile(
              title: const Text('Firmware revision'),
              trailing: Text(_firmwareRevision),
            ),
            ListTile(
              title: const Text('Hardware revision'),
              trailing: Text(_hardwareRevision),
            ),
            ListTile(
              title: const Text('Serial number'),
              trailing: Text(_serialNumber),
            ),
            ListTile(
              title: const Text('Battery Level'),
              trailing: Text(_batteryLevel),
            ),
            ListTile(
              title: const Text('Signal Quality'),
              trailing: Text(_signalQuality),
            ),
            ListTile(
              title: const Text('Heart Rate'),
              trailing: Text(_heartRate),
            ),
            ListTile(
              title: const Text('Skin Temperature'),
              trailing: Text(_skinTemperature),
            ),
            ListTile(
              title: const Text('Respiration Rate'),
              trailing: Text(_respirationRate),
            ),
            ListTile(
              title: const Text('RR'),
              trailing: Text(_rr),
            ),
            ListTile(
              title: const Text('Activity'),
              trailing: Text(_activity),
            ),
            ListTile(
              title: const Text('Steps'),
              trailing: Text(_steps.toString()),
            ),
            ListTile(
              title: const Text('Sound Volume'),
              trailing: Text(_soundVolume),
            ),
            ListTile(
              title: const Text('Body Position'),
              trailing: Text(_bodyPosition),
            ),
            ListTile(
              title: const Text('Wear State'),
              trailing: Text(_wearState),
            ),
            ListTile(
              title: const Text('Sync State'),
              trailing: Text(_syncState),
            ),
            ListTile(
              title: const Text('Exercise'),
              trailing: Text(_exercise),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: SizedBox(
                  width: MediaQuery.of(context).size.width,
                  height: 100,
                  child: LineChart(_ecg)),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: SizedBox(
                  width: MediaQuery.of(context).size.width,
                  height: 100,
                  child: LineChart(_respiration)),
            ),
            ListTile(
              title: const Text('Disconnect'),
              onTap: () => disconnect(),
              tileColor: Colors.redAccent,
            ),
          ],
        ),
      ),
    );
  }

  void disconnect() {
    widget.device.disconnect();
  }

  [@override](/user/override)
  void didConnect(Device device) {
    /// Update device information
    setState(() {
      _firmwareRevision = device.firmwareRevision ?? "Unknown";
      _hardwareRevision = device.hardwareRevision ?? "Unknown";
      _serialNumber = device.serialNumber ?? "Unknown";
    });
    List<DataType> dataTypes = [
      DataType.ECG,
      DataType.RESPIRATION,
      DataType.SKIN_TEMPERATURE,
      DataType.ACTIVITY,
      DataType.STEPS,
      DataType.HEART_RATE,
      DataType.RR,
      // DataType.SOUND_VOLUME,
      DataType.RESPIRATION_RATE,
      DataType.BODY_POSITION,
      DataType.PRESSURE,
    ];

    device.collect(dataTypes, []);
  }

  [@override](/user/override)
  void didDetectUserEvent(Device device, int timestamp) {}

  [@override](/user/override)
  void didDisconnect(Device? device, DisconnectReason reason) {
    Navigator.pop(context);
  }

  [@override](/user/override)
  void didDetectExercise(Device device, Exercise exercise) {
    setState(() {
      _exercise = exercise.toString().split('.').last;
    });
  }

  [@override](/user/override)
  void didReceiveAccelerometer(
      Device device, int timestamp, double ax, double ay, double az) {}

  [@override](/user/override)
  void didReceiveActivity(Device device, int timestamp, ActivityType activity) {
    setState(() {
      _activity = activity.toString().split('.').last;
    });
  }

  [@override](/user/override)
  void didReceiveBatteryLevel(Device device, int stateOfCharge) {
    setState(() {
      _batteryLevel = "$stateOfCharge%";
    });
  }

  [@override](/user/override)
  void didReceiveBodyPosition(
      Device device, int timestamp, BodyPosition bodyPosition) {
    setState(() {
      _bodyPosition = bodyPosition.toString().split('.').last;
    });
  }

  [@override](/user/override)
  void didReceiveCommand(Device device) {}

  [@override](/user/override)
  void didReceiveECG(Device device, int timestamp, double value) {
    setState(() {
      _ecg.add(value);
      while (_ecg.length > 500) {
        _ecg.removeAt(0);
      }
    });
  }

  [@override](/user/override)
  void didReceiveError(String error) {
    /// Show toast
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(error)));
  }

  [@override](/user/override)
  void didReceiveGyroscope(
      Device device, int timestamp, double qx, double qy, double qz) {}

  [@override](/user/override)
  void didReceiveHeartRate(Device device, int timestamp, int heartRate) {
    setState(() {
      _heartRate = "$heartRate";
    });
  }

  [@override](/user/override)
  void didReceiveMagnetometer(
      Device device, int timestamp, double mx, double my, double mz) {}

  [@override](/user/override)
  void didReceiveMessage(Device device, String process, String message) {}

  [@override](/user/override)
  void didReceiveOrientation(
      Device device, int timestamp, double roll, double pitch, double yaw) {}

  [@override](/user/override)
  void didReceiveQuaternion(Device device, int timestamp, double qw, double qx,
      double qy, double qz) {}

  [@override](/user/override)
  void didReceiveRespiration(Device device, int timestamp, double value) {
    setState(() {
      _respiration.add(value);
      while (_respiration.length > 500) {
        _respiration.removeAt(0);
      }
    });
  }

  [@override](/user/override)
  void didReceiveRespirationRate(Device device, int timestamp, int value) {
    setState(() {
      _respirationRate = "$value";
    });
  }

  [@override](/user/override)
  void didReceiveRr(Device device, int timestamp, int rr) {
    setState(() {
      _rr = "$rr";
    });
  }

  [@override](/user/override)
  void didReceiveSignalQuality(Device device, int timestamp, int value) {
    setState(() {
      _signalQuality = "$value";
    });
  }

  [@override](/user/override)
  void didReceiveSkinTemperature(Device device, int timestamp, double value) {
    setState(() {
      _skinTemperature = "${value.toStringAsFixed(1)} °C";
    });
  }

  [@override](/user/override)
  void didReceiveSoundFeatures(
      Device device, int timestamp, List<double?> values) {}

  [@override](/user/override)
  void didReceiveSoundVolume(Device device, int timestamp, int value) {
    setState(() {
      _soundVolume = "$value dB";
    });
  }

  [@override](/user/override)
  void didReceiveSteps(Device device, int timestamp, int steps) {
    setState(() {
      _steps += steps;
    });
  }

  [@override](/user/override)
  void didReceivePressure(Device device, int timestamp, int value) {}

  [@override](/user/override)
  void didReceivePressureWearState(Device device, WearState wearState) {}

  [@override](/user/override)
  void didReceiveUnsynchronizedSize(
      Device device, int unsynchronizedSize, double syncBytesPerSecond) {}

  [@override](/user/override)
  void syncStateDidChange(Device device, SyncState state) {
    setState(() {
      _syncState = state.toString().split('.').last;
    });
  }

  [@override](/user/override)
  void wearStateDidChange(Device device, WearState wearState) {
    setState(() {
      _wearState = wearState.toString().split('.').last;
    });
  }

  [@override](/user/override)
  void didReceivePastAccelerometer(
      Device device, int timestamp, double ax, double ay, double az) {}

  [@override](/user/override)
  void didReceivePastActivity(
      Device device, int timestamp, ActivityType activity) {}

  [@override](/user/override)
  void didReceivePastBodyPosition(
      Device device, int timestamp, BodyPosition bodyPosition) {}

  [@override](/user/override)
  void didReceivePastECG(Device device, int timestamp, double value) {}

  [@override](/user/override)
  void didReceivePastGyroscope(
      Device device, int timestamp, double qx, double qy, double qz) {}

  [@override](/user/override)
  void didReceivePastHeartRate(Device device, int timestamp, int heartRate) {}

  [@override](/user/override)
  void didReceivePastMagnetometer(
      Device device, int timestamp, double mx, double my, double mz) {}

  [@override](/user/override)
  void didReceivePastOrientation(
      Device device, int timestamp, double roll, double pitch, double yaw) {}

  [@override](/user/override)
  void didReceivePastPressure(Device device, int timestamp, int values) {}

  [@override](/user/override)
  void didReceivePastQuaternion(Device device, int timestamp, double qw,
      double qx, double qy, double qz) {}

  [@override](/user/override)
  void didReceivePastRespiration(Device device, int timestamp, double value) {}

  [@override](/user/override)
  void didReceivePastRespirationRate(Device device, int timestamp, int value) {}

  [@override](/user/override)
  void didReceivePastRr(Device device, int timestamp, int rr) {}

  [@override](/user/override)
  void didReceivePastSignalQuality(Device device, int timestamp, int value) {}

  [@override](/user/override)
  void didReceivePastSkinTemperature(
      Device device, int timestamp, double value) {}

  [@override](/user/override)
  void didReceivePastSoundFeatures(
      Device device, int timestamp, List<double?> values) {}

  [@override](/user/override)
  void didReceivePastSoundVolume(
      Device device, int timestamp, int soundVolume) {}

  [@override](/user/override)
  void didReceivePastSteps(Device device, int timestamp, int value) {}

  [@override](/user/override)
  void didReceivePastUserEvent(Device device, int timestamp) {}
}

更多关于Flutter集成AidLab SDK插件aidlab_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter集成AidLab SDK插件aidlab_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中集成并使用AidLab SDK插件(aidlab_sdk)的示例代码。请注意,这里假设你已经有一个Flutter项目,并且已经获取了AidLab SDK的必要凭证(如API密钥等)。

步骤 1: 添加依赖

首先,你需要在pubspec.yaml文件中添加aidlab_sdk依赖。确保你的Flutter环境已经配置好,并且网络连接正常。

dependencies:
  flutter:
    sdk: flutter
  aidlab_sdk: ^latest_version  # 请替换为实际的最新版本号

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

步骤 2: 配置AidLab SDK

在你的Flutter项目的main.dart或相应的初始化文件中,配置AidLab SDK。通常,这包括设置API密钥和其他必要的初始化参数。

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

void main() {
  // 初始化AidLab SDK
  AidLab.initialize(apiKey: 'YOUR_API_KEY');  // 替换为你的API密钥

  runApp(MyApp());
}

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

步骤 3: 使用AidLab SDK功能

在你的Flutter应用中,你可以使用AidLab SDK提供的各种功能。以下是一个简单的示例,展示如何调用某个SDK方法(假设SDK有一个fetchData方法用于获取数据):

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String dataFromAidLab = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter AidLab SDK Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Data from AidLab:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            Text(
              dataFromAidLab,
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _fetchDataFromAidLab,
              child: Text('Fetch Data'),
            ),
          ],
        ),
      ),
    );
  }

  void _fetchDataFromAidLab() async {
    try {
      // 假设fetchData是AidLab SDK提供的一个方法
      var data = await AidLab.fetchData();  // 请根据实际SDK方法名称和参数进行调整
      setState(() {
        dataFromAidLab = data.toString();  // 根据实际返回的数据类型进行处理
      });
    } catch (e) {
      setState(() {
        dataFromAidLab = 'Error: ${e.message}';
      });
    }
  }
}

注意事项

  1. API密钥保护:不要在客户端代码中硬编码敏感信息,如API密钥。考虑使用环境变量或安全的密钥管理服务。
  2. 错误处理:在实际应用中,应该添加更详细的错误处理逻辑,以确保应用的健壮性。
  3. SDK文档:请查阅AidLab SDK的官方文档,以获取最新的API信息和最佳实践。
  4. 依赖版本:确保你使用的是与你的Flutter版本兼容的aidlab_sdk版本。

这个示例代码提供了一个基本的框架,展示了如何在Flutter项目中集成并使用AidLab SDK。根据你的具体需求,你可能需要调整代码以适应SDK的实际API和功能。

回到顶部