Flutter插件atmotuber的介绍与使用

Flutter插件atmotuber的介绍与使用

black_atmotuber_logo

atmotuber

atmotuber 是一个用于直接通过BLE连接处理Atmotube蓝牙API的Flutter包。它使数据在你的应用中易于使用。

Flutter插件atmotuber使用方法

要使用该包,请按以下步骤操作:

添加依赖

在你的 pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  atmotuber:

iOS 配置

ios/Runner/Info.plist 中添加以下内容:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要BLE权限</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>需要BLE权限</string>

Android 配置

android/app/src/main/AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

连接到Atmotube Pro

// 初始化
Atmotuber atm = Atmotuber();

// 连接
await atm.searchAtmotube();

获取实时数据

// 实时数据回调函数
await atm.wrapper(callback: (streams) {
  dataGot.value = streams;
});

获取历史数据

// 历史数据回调函数
await atm.hist_wrapper(callback: (streams) {
  history.value = streams;
});

断开连接

// 断开连接
await atm.dropConnection();

完整示例代码

// ignore_for_file: unnecessary_const

import 'package:atmotuber/atmotuber.dart';
import 'package:flutter/material.dart';
import 'dart:async';

void main() {
  return runApp(
    const MaterialApp(home: HomePage(), debugShowCheckedModeBanner: false),
  );
}

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

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

class HomePageState extends State<HomePage> {
  Atmotuber atm2 = Atmotuber();
  List<String> names = ['日期时间', '状态', 'BME280', 'PM', 'VOC'];
  ValueNotifier<AtmotubeData> dataGot = ValueNotifier(const AtmotubeData());
  ValueNotifier<AtmotubeData> history = ValueNotifier(const AtmotubeData());
  late String _status;

  Future<void> connectDevice() async {
    await atm2.searchAtmotube();
  }

  Future<void> dataTaker() async {
    await atm2.wrapper(callback: (streams) {
      dataGot.value = streams;
    });
  }

  Future<void> dataHist() async {
    await atm2.hist_wrapper(callback: (histStreams) {
      history.value = histStreams;
    });
  }

  [@override](/user/override)
  void initState() {
    _status = '断开';
    super.initState();
  }

  void showsnack(SnackBar snackBar) {
    ScaffoldMessenger.of(context).showSnackBar(snackBar);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: SingleChildScrollView(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Center(
              child: ElevatedButton(
                child: const Text(
                  '连接ATMOTUBE',
                  style: TextStyle(fontSize: 20.0),
                ),
                onPressed: () async {
                  await connectDevice();
                  _status = atm2.getDeviceState();
                  if (_status == 'connected') {
                    const snackBar = SnackBar(
                      content: Text('已连接!'),
                      backgroundColor: Colors.green,
                    );
                    showsnack(snackBar);
                  } else if (_status == 'disconnected') {
                    const snackBar = SnackBar(
                      content: Text('未连接!'),
                      backgroundColor: Colors.red,
                    );
                    showsnack(snackBar);
                  }
                },
              ),
            ),
            Center(
              child: ElevatedButton(
                child: const Text(
                  '断开ATMOTUBE',
                  style: TextStyle(fontSize: 20.0),
                ),
                onPressed: () async {
                  await atm2.dropConnection();
                  _status = atm2.getDeviceState();
                  if (_status == 'disconnected') {
                    const snackBar = SnackBar(
                      content: Text('已断开连接!'),
                      backgroundColor: Colors.red,
                    );
                    showsnack(snackBar);
                  }
                },
              ),
            ),
            Center(
              child: ElevatedButton(
                onPressed: (() async {
                  await dataTaker();
                }),
                child: const Text(
                  '获取数据',
                  style: TextStyle(fontSize: 20.0),
                ),
              ),
            ),
            Center(
              child: ElevatedButton(
                onPressed: (() async {
                  await dataHist();
                }),
                child: const Text(
                  '获取历史数据',
                  style: TextStyle(fontSize: 20.0),
                ),
              ),
            ),
            Center(
              child: ElevatedButton(
                onPressed: (() async {
                  await atm2.cancelStreamHistory();
                }),
                child: const Text(
                  '取消流',
                  style: TextStyle(fontSize: 20.0),
                ),
              ),
            ),
            const SizedBox(height: 30),
            const SizedBox(
              height: 30,
              width: 360,
              child: Align(
                alignment: Alignment.centerLeft,
                child: Text('实时数据',
                    style: TextStyle(fontSize: 30, fontWeight: FontWeight.w400)),
              ),
            ),
            Center(
              child: ValueListenableBuilder(
                valueListenable: history,
                builder: (context, AtmotubeData data, child) {
                  List list = [
                    data.datetime,
                    data.status,
                    data.bme280,
                    data.pm,
                    data.voc
                  ];
                  return Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      ListView.builder(
                        scrollDirection: Axis.vertical,
                        shrinkWrap: true,
                        itemCount: list.length,
                        itemBuilder: (BuildContext context, int index) {
                          return Column(
                            children: [
                              ListTile(
                                title: Text(names[index]),
                                subtitle: Text(list[index].toString()),
                              ),
                              const Divider(height: 2.0)
                            ],
                          );
                        },
                      )
                    ],
                  );
                },
              ),
            )
          ],
        ),
      ),
    );
  }
}

更多关于Flutter插件atmotuber的介绍与使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件atmotuber的介绍与使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Flutter 功能未知插件 atmotuber 的介绍与使用

插件介绍

atmotuber 是一个 Flutter 插件,尽管其具体功能和用途可能不太为人所知,但通常 Flutter 插件会封装原生平台(如 Android 和 iOS)的某些功能,使其能够在 Dart 代码中直接调用。如果 atmotuber 插件提供了官方文档,那么理解其最佳途径是查阅这些文档。然而,在没有官方文档的情况下,我们可以通过查看插件的源码和示例代码来推测其功能和使用方法。

使用步骤

  1. 添加依赖

    首先,你需要在 pubspec.yaml 文件中添加 atmotuber 插件的依赖。请注意,由于这是一个假设的插件名称,实际使用时需要替换为正确的插件名称和版本号。

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

    然后运行 flutter pub get 命令来安装依赖。

  2. 导入插件

    在你的 Dart 文件中导入该插件。

    import 'package:atmotuber/atmotuber.dart';
    
  3. 初始化插件

    根据插件的用途,你可能需要进行一些初始化操作。例如,如果插件需要与原生代码进行交互,可能需要在 MainActivity.kt(对于 Android)或 AppDelegate.swift(对于 iOS)中进行额外的配置。但这一步的具体内容取决于插件的文档和源码。

  4. 使用插件的功能

    假设 atmotuber 插件提供了一个用于显示通知的功能,你可以这样调用它:

    void showNotification() async {
      try {
        // 假设插件有一个名为 show 的方法
        await Atmotuber.show(
          title: 'Hello',
          body: 'This is a notification from atmotuber plugin',
        );
      } catch (e) {
        print('Failed to show notification: $e');
      }
    }
    

    请注意,上面的代码是假设性的,Atmotuber.show 方法和其参数需要根据插件的实际 API 进行调整。

  5. 处理回调和事件

    如果插件提供了回调或事件监听功能,你需要设置相应的监听器来处理这些事件。例如,如果插件有一个用于监听设备状态变化的功能,你可以这样设置:

    void listenToDeviceStatus() {
      Atmotuber.deviceStatusStream.listen((status) {
        print('Device status changed: $status');
      });
    }
    

    同样,上面的代码是假设性的,具体的监听方法和事件类型需要根据插件的 API 进行调整。

总结

由于 atmotuber 是一个假设的插件名称,上述代码示例是基于一般 Flutter 插件的使用模式进行编写的。在实际使用中,你需要查阅插件的官方文档或源码来了解其具体功能和 API。如果插件没有提供文档,你可以尝试在其 GitHub 仓库或 Flutter 社区中查找相关信息。

回到顶部