Flutter颜色管理插件simpleblue的使用

Flutter颜色管理插件simpleblue的使用

特性

  • 支持Android和iOS。
  • 代码量小,因此底层系统(例如蓝牙相关更新)的更改可以轻松升级。
  • 使用简单,只需几个函数即可创建一个功能完备的应用。

Android

AndroidManifest.xml文件中添加以下权限。您可以使用permission_handler包来处理权限。

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

<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28" />

iOS

在Xcode的Info.plist文件中添加以下属性:

  • Privacy - Bluetooth Always Usage Description
  • Privacy - Bluetooth Peripheral Usage Description

使用示例

以下是一个完整的示例代码,展示了如何使用simpleblue插件进行蓝牙设备的扫描和连接。

import 'dart:io';

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

import 'package:simpleblue/model/bluetooth_device.dart';
import 'package:simpleblue/simpleblue.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

const serviceUUID = null;
const scanTimeout = 15000;

class _MyAppState extends State<MyApp> {
  final _simplebluePlugin = Simpleblue();

  bool _isBluetoothTurnedOn = false;
  var devices = <String, BluetoothDevice>{};

  String receivedData = '';

  [@override](/user/override)
  void initState() {
    super.initState();

    _simplebluePlugin.listenConnectedDevice().listen((connectedDevice) {
      debugPrint("Connected device: $connectedDevice");

      if (connectedDevice != null) {
        setState(() {
          devices[connectedDevice.uuid] = connectedDevice;
        });
      }

      connectedDevice?.stream?.listen((received) {
        setState(() {
          receivedData += "${DateTime.now().toString()}: $received\n";
        });
      });
    }).onError((err) {
      debugPrint(err);
    });

    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      scan();
    });

    _simplebluePlugin.getDevices().then((value) => setState(() {
          for (var device in value) {
            devices[device.uuid] = device;
          }
        }));

    _simplebluePlugin.isTurnedOn().then((value) => setState(() {
      _isBluetoothTurnedOn = value ?? false;
    }));

    _simplebluePlugin.listenStateChanges().listen((state) {
      debugPrint('Bluetooth state changed to: $state');

      setState(() {
        _isBluetoothTurnedOn = state == SimpleblueState.on;
      });
    });
  }

  void scan() async {
    final isBluetoothGranted = Platform.isIOS ||
        (await Permission.bluetoothScan.status) == PermissionStatus.granted ||
        (await Permission.bluetoothScan.request()) == PermissionStatus.granted;

    if (isBluetoothGranted) {
      print("Bluetooth permission granted");

      final isLocationGranted = Platform.isIOS ||
          (await Permission.location.status) == PermissionStatus.granted ||
          (await Permission.location.request()) == PermissionStatus.granted;

      if (isLocationGranted) {
        print("Location permission granted");
        _simplebluePlugin
            .scanDevices(serviceUUID: serviceUUID, timeout: scanTimeout)
            .listen((event) {
          setState(() {
            for (var device in event) {
              devices[device.uuid] = device;
            }
          });
        });
      }
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Column(children: [
          if (_isBluetoothTurnedOn)
            TextButton(
                child: Text('关闭蓝牙'),
                onPressed: () {
                  _simplebluePlugin.turnOff();
                }),
          if (!_isBluetoothTurnedOn)
            TextButton(
                child: Text('打开蓝牙'),
                onPressed: () {
                  _simplebluePlugin.turnOn();
                }),
          TextButton(
              child: Text('获取设备'),
              onPressed: () {
                _simplebluePlugin.getDevices().then((value) {
                  setState(() {
                    for (var device in value) {
                      devices[device.uuid] = device;
                    }
                  });
                });
              }),
          TextButton(
              child: Text('扫描设备'),
              onPressed: () {
                scan();
              }),
          Expanded(
            child: buildDevices(),
          ),
          SizedBox(
              height: 200,
              child: Align(
                  alignment: Alignment.topLeft,
                  child: Text(
                    receivedData,
                    style: const TextStyle(fontSize: 10),
                  )))
        ]),
      ),
    );
  }

  final _connectingUUIDs = <String>[];

  Widget buildDevices() {
    final devList = devices.values.toList();
    return ListView.builder(
        itemCount: devList.length,
        itemBuilder: (context, index) {
          final device = devList[index];

          return ListTile(
            onTap: () {
              if (device.isConnected) {
                _simplebluePlugin.disconnect(device.uuid);
              } else {
                setState(() {
                  _connectingUUIDs.add(device.uuid);
                });
                _simplebluePlugin.connect(device.uuid).then((value) {
                  setState(() {
                    _connectingUUIDs.remove(device.uuid);
                  });
                });
              }
            },
            leading: _connectingUUIDs.contains(device.uuid)
                ? Icon(Icons.bluetooth, color: Colors.orange)
                : (device.isConnected
                    ? Icon(Icons.bluetooth_connected, color: Colors.blue)
                    : Icon(
                        Icons.bluetooth,
                        color: Colors.grey.shade300,
                      )),
            title: Text('${device.name ?? '无名称'}\n${device.uuid}'),
            subtitle: device.isConnected
                ? Row(
                    children: [
                      TextButton(
                          child: Text('写入数据1'),
                          onPressed: () {
                            _simplebluePlugin.write(
                                device.uuid, "样本数据".codeUnits);
                          }),
                      TextButton(
                          child: Text('写入数据2'),
                          onPressed: () {
                            _simplebluePlugin.write(
                                device.uuid, "样本数据2".codeUnits);
                          })
                    ],
                  )
                : null,
          );
        });
  }
}

更多关于Flutter颜色管理插件simpleblue的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter颜色管理插件simpleblue的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


simpleblue 是一个用于在 Flutter 应用中管理颜色的轻量级插件。它旨在简化颜色的定义、管理和使用,特别是在需要管理多个主题色或动态主题切换的场景下。以下是如何在 Flutter 项目中使用 simpleblue 插件的详细步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 simpleblue 依赖:

dependencies:
  flutter:
    sdk: flutter
  simpleblue: ^1.0.0  # 请确保使用最新版本

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

2. 初始化颜色管理器

在你的应用中,首先需要初始化 SimpleBlue 实例。通常,你可以在 main.dart 中完成这个步骤。

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

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

class MyApp extends StatelessWidget {
  final SimpleBlue simpleBlue = SimpleBlue();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SimpleBlue Example',
      theme: ThemeData(
        primarySwatch: simpleBlue.primaryColor,
      ),
      home: MyHomePage(simpleBlue: simpleBlue),
    );
  }
}

3. 定义颜色

你可以在 SimpleBlue 实例中定义颜色。例如:

simpleBlue.defineColors(
  primaryColor: Colors.blue,
  accentColor: Colors.blueAccent,
  backgroundColor: Colors.white,
  textColor: Colors.black,
);

4. 使用颜色

在应用的其他部分,你可以通过 SimpleBlue 实例来访问这些定义的颜色。例如:

class MyHomePage extends StatelessWidget {
  final SimpleBlue simpleBlue;

  MyHomePage({required this.simpleBlue});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: simpleBlue.backgroundColor,
      appBar: AppBar(
        title: Text('SimpleBlue Example'),
        backgroundColor: simpleBlue.primaryColor,
      ),
      body: Center(
        child: Text(
          'Hello, SimpleBlue!',
          style: TextStyle(
            color: simpleBlue.textColor,
            fontSize: 24,
          ),
        ),
      ),
    );
  }
}

5. 动态切换颜色

如果你希望在应用运行时动态切换主题颜色,你可以使用 SimpleBlueupdateColors 方法:

simpleBlue.updateColors(
  primaryColor: Colors.green,
  accentColor: Colors.greenAccent,
  backgroundColor: Colors.white,
  textColor: Colors.black,
);

调用 updateColors 后,所有使用 simpleBlue 颜色的部件都会自动更新。

6. 使用主题

你还可以将 SimpleBlue 的颜色与 Flutter 的主题系统结合使用。例如:

ThemeData buildTheme(SimpleBlue simpleBlue) {
  return ThemeData(
    primaryColor: simpleBlue.primaryColor,
    accentColor: simpleBlue.accentColor,
    backgroundColor: simpleBlue.backgroundColor,
    textTheme: TextTheme(
      bodyText1: TextStyle(color: simpleBlue.textColor),
      bodyText2: TextStyle(color: simpleBlue.textColor),
    ),
  );
}

然后在 MaterialApp 中使用这个主题:

return MaterialApp(
  title: 'SimpleBlue Example',
  theme: buildTheme(simpleBlue),
  home: MyHomePage(simpleBlue: simpleBlue),
);
回到顶部