Flutter藍牙BLE開發完全指南(內含高級功能擴展)

Flutter藍牙BLE開發完全指南

我將為您提供一個完整的Flutter藍牙BLE實現方案,包含UI設計、權限處理、設備掃描、連接通信等完整功能。

完整實現方案

1. 添加依賴與權限配置

pubspec.yaml

dependencies:flutter:sdk: flutterflutter_blue_plus: ^1.10.0permission_handler: ^10.4.0provider: ^6.0.5animated_text_kit: ^4.2.2percent_indicator: ^4.2.3

AndroidManifest.xml

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

Info.plist (iOS)

<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要藍牙權限來連接設備</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>需要藍牙權限來連接設備</string>
<key>UIBackgroundModes</key>
<array><string>bluetooth-central</string><string>bluetooth-peripheral</string>
</array>

2. 藍牙狀態管理類

import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:provider/provider.dart';class BluetoothProvider extends ChangeNotifier {List<ScanResult> scannedDevices = [];BluetoothDevice? connectedDevice;List<BluetoothService> services = [];BluetoothCharacteristic? targetCharacteristic;bool isScanning = false;bool isConnecting = false;bool isDiscovering = false;String connectionStatus = "未連接";List<List<int>> receivedData = [];Future<void> startScan() async {if (isScanning) return;scannedDevices.clear();isScanning = true;notifyListeners();try {await FlutterBluePlus.startScan(timeout: const Duration(seconds: 15),androidUsesFineLocation: true,);FlutterBluePlus.scanResults.listen((results) {scannedDevices = results;notifyListeners();});} catch (e) {print("掃描錯誤: $e");isScanning = false;notifyListeners();}}Future<void> stopScan() async {if (!isScanning) return;await FlutterBluePlus.stopScan();isScanning = false;notifyListeners();}Future<void> connectToDevice(BluetoothDevice device) async {if (isConnecting) return;isConnecting = true;connectionStatus = "連接中...";notifyListeners();try {await device.connect(autoConnect: false);connectedDevice = device;connectionStatus = "已連接";// 監聽連接狀態device.connectionState.listen((state) {if (state == BluetoothConnectionState.disconnected) {connectedDevice = null;services.clear();targetCharacteristic = null;connectionStatus = "已斷開";notifyListeners();}});// 發現服務isDiscovering = true;notifyListeners();services = await device.discoverServices();isDiscovering = false;notifyListeners();} catch (e) {print("連接錯誤: $e");connectionStatus = "連接失敗";isConnecting = false;notifyListeners();}isConnecting = false;notifyListeners();}Future<void> disconnectDevice() async {if (connectedDevice == null) return;try {await connectedDevice!.disconnect();} catch (e) {print("斷開連接錯誤: $e");} finally {connectedDevice = null;services.clear();targetCharacteristic = null;connectionStatus = "已斷開";notifyListeners();}}Future<void> setCharacteristic(BluetoothCharacteristic characteristic) async {targetCharacteristic = characteristic;// 設置通知監聽await characteristic.setNotifyValue(true);characteristic.value.listen((value) {receivedData.add(value);notifyListeners();});notifyListeners();}Future<void> writeData(List<int> data) async {if (targetCharacteristic == null) return;try {await targetCharacteristic!.write(data);} catch (e) {print("寫入錯誤: $e");}}
}

3. 主界面實現

import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:provider/provider.dart';
import 'bluetooth_provider.dart';void main() {runApp(ChangeNotifierProvider(create: (context) => BluetoothProvider(),child: const MyApp(),),);
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return MaterialApp(title: 'Flutter藍牙BLE',theme: ThemeData(primarySwatch: Colors.blue,scaffoldBackgroundColor: Colors.grey[100],appBarTheme: const AppBarTheme(backgroundColor: Colors.deepPurple,foregroundColor: Colors.white,),),home: const BluetoothHomePage(),);}
}class BluetoothHomePage extends StatefulWidget {const BluetoothHomePage({super.key});State<BluetoothHomePage> createState() => _BluetoothHomePageState();
}class _BluetoothHomePageState extends State<BluetoothHomePage> {void initState() {super.initState();_checkPermissions();}Future<void> _checkPermissions() async {// 檢查并請求權限final locationStatus = await Permission.location.request();final bluetoothStatus = await Permission.bluetooth.request();if (locationStatus.isDenied || bluetoothStatus.isDenied) {showDialog(context: context,builder: (context) => AlertDialog(title: const Text('權限不足'),content: const Text('需要位置和藍牙權限才能掃描設備'),actions: [TextButton(onPressed: () => Navigator.pop(context),child: const Text('確定'),),],),);}}Widget build(BuildContext context) {final bluetoothProvider = Provider.of<BluetoothProvider>(context);return Scaffold(appBar: AppBar(title: const Text('Flutter藍牙BLE'),actions: [IconButton(icon: const Icon(Icons.bluetooth),onPressed: () {if (bluetoothProvider.connectedDevice != null) {bluetoothProvider.disconnectDevice();} else {Navigator.push(context,MaterialPageRoute(builder: (context) => const DeviceScanPage(),),);}},),],),body: _buildBody(bluetoothProvider),);}Widget _buildBody(BluetoothProvider provider) {if (provider.connectedDevice == null) {return Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [const Icon(Icons.bluetooth_disabled, size: 100, color: Colors.grey),const SizedBox(height: 20),const Text('未連接設備',style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),),const SizedBox(height: 10),ElevatedButton(onPressed: () {Navigator.push(context,MaterialPageRoute(builder: (context) => const DeviceScanPage(),),);},child: const Text('掃描設備'),),],),);}return DefaultTabController(length: 3,child: Column(children: [_buildDeviceHeader(provider),const TabBar(tabs: [Tab(icon: Icon(Icons.devices), text: '設備信息'),Tab(icon: Icon(Icons.settings), text: '服務'),Tab(icon: Icon(Icons.message), text: '通信'),],),Expanded(child: TabBarView(children: [_buildDeviceInfo(provider),_buildServices(provider),_buildCommunication(provider),],),),],),);}Widget _buildDeviceHeader(BluetoothProvider provider) {return Container(padding: const EdgeInsets.all(16),color: Colors.deepPurple[50],child: Row(children: [const Icon(Icons.bluetooth_connected, color: Colors.deepPurple, size: 36),const SizedBox(width: 16),Expanded(child: Column(crossA

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93376.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93376.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93376.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 Canvas 替代 <video> 標簽加載并渲染視頻

在部分瀏覽器環境或業務場景下&#xff0c;直接使用 <video> 標簽加載視頻會出現首幀延遲的情況。以下方法通過 WebGPU Canvas 2D 將視頻幀繪制到自定義 Canvas 上&#xff0c;讓 <video> 只做解碼&#xff0c;WebGPU 接管渲染&#xff0c;通過最小化對象創建 精…

基于Flask的智能停車場管理系統開發實踐

在現代城市中&#xff0c;停車難已成為一個普遍問題。為了解決這一問題&#xff0c;我開發了一個基于Python Flask框架的智能停車場管理系統。該系統集成了車牌識別、車位狀態監控、收費管理等多項功能&#xff0c;為停車場的智能化管理提供了完整的解決方案。系統功能概述該停…

【C#獲取高精度時間】

在C#中&#xff0c;有幾種方法可以獲取高精度時間&#xff08;高分辨率時間戳&#xff09;&#xff0c;適用于性能測量、計時等需要高精度的場景。以下是幾種常用方法&#xff1a; 1. 使用 Stopwatch 類&#xff08;推薦&#xff09; Stopwatch 類提供了最高精度的時間測量&…

Spring Boot + React 打造現代化高校成績管理系統實戰記錄

作者: 笙囧同學 發布時間: 2025年7月 技術棧: Spring Boot 3.2.3 React 18 TypeScript 華為云GaussDB 項目類型: 全棧Web應用 開發周期: 30天 代碼量: 15000 行 &#x1f4d6; 前言 大家好&#xff0c;我是笙囧同學&#xff01;&#x1f64b;?♂? 作為一名計算機科學與技…

形參表不匹配(BUG)

在您的代碼中&#xff0c;存在兩個主要問題導致"形參表中不匹配"的錯誤&#xff1a;erase() 函數中的成員變量名錯誤iterator erase(iterator pos) {// ...size--; // ? 錯誤&#xff1a;成員變量名為 _size 而非 sizereturn iterator(next); }修正&#xff1a;ite…

Spring循環依賴以及三個級別緩存

Spring循環依賴以及三個級別緩存 什么是循環依賴&#xff1f; 循環依賴&#xff0c;顧名思義&#xff0c;就是指兩個或多個 Spring Bean 之間相互依賴&#xff0c;形成一個閉環。 最常見也是 Spring 能夠“解決”的循環依賴是構造器注入 和 setter 注入 混合或單獨使用時&…

《零基礎入門AI:OpenCV圖像預處理進一步學習》

本文全面講解OpenCV圖像預處理的七大核心技術&#xff08;插值方法、邊緣填充、圖像矯正&#xff08;透視變換&#xff09;、圖像掩膜、ROI切割、圖像添加水印、圖像噪點消除&#xff09;&#xff0c;每個知識點都配有詳細解釋和實用代碼示例&#xff0c;幫助初學者建立系統的圖…

MongoDB的內存和核心數對于運行效率的影響

在 MongoDB 線上生產環境中&#xff0c;CPU&#xff08;核心&#xff09; 和 內存 是兩大關鍵硬件資源&#xff0c;它們在不同的操作場景下發揮著核心作用&#xff0c;共同影響著數據庫的性能、穩定性和擴展性。理解它們的作用場景至關重要&#xff0c;是容量規劃、性能優化和故…

自己的SAPGUI嘗試

為滿足用戶需求&#xff0c;博主做了一個臺賬管理程序&#xff0c;嘗試用自己的程序做GUI&#xff0c;用SAP 系統做數據庫。 運行了半年&#xff0c;程序很nice,用戶每天都在高效的使用&#xff0c;已經有十幾萬的數據。 總結一下這次自己的GUI嘗試&#xff0c;好處是C# WINFOR…

高效處理 JSON 數據:JsonUtil 工具類全方位解析與實戰

在現代軟件開發中,JSON(JavaScript Object Notation)已成為數據交換的“通用語言”——從前后端接口通信到微服務數據交互,從配置文件解析到日志格式化,幾乎所有場景都離不開JSON的處理。然而,原生JSON框架(如FastJSON、Jackson)的API往往需要大量重復代碼,且空指針、…

Python 庫手冊:xmlrpc.client 與 xmlrpc.server 模塊

xmlrpc.client 和 xmlrpc.server 是 Python 標準庫中用于構建基于 XML-RPC 協議的遠程過程調用&#xff08;RPC&#xff09;通信模塊。xmlrpc.client 用于編寫客戶端程序&#xff0c;向遠程服務器發起方法調用。xmlrpc.server 用于編寫服務器端&#xff0c;暴露本地方法供遠程客…

渲染篇(一):從零實現一個“微型React”:Virtual DOM的真面目

渲染篇(一)&#xff1a;從零實現一個“微型React”&#xff1a;Virtual DOM的真面目 引子&#xff1a;前端性能的“永恒之問” 在前面兩章中&#xff0c;我們已經奠定了堅實的架構基礎。我們用“任務調度器”建立了聲明式和模塊化的編程范式&#xff0c;并通過對比MVC等模式論…

SWC 深入全面講解

一、核心功能與原理 1. 高性能編譯 Rust 架構優勢&#xff1a;SWC 基于 Rust 編寫&#xff0c;利用 Rust 的性能和并發性優勢&#xff0c;編譯速度比 Babel 快約 20 倍&#xff0c;比 TypeScript 編譯器更快。并行編譯&#xff1a;支持多線程并行處理&#xff0c;在四核基準測試…

XML Expat Parser:深入解析與高效應用

XML Expat Parser:深入解析與高效應用 引言 XML(可擴展標記語言)作為一種廣泛使用的標記語言,在數據交換、存儲和表示中扮演著重要角色。XML Expat Parser 是一個高性能、可擴展的XML解析庫,廣泛應用于各種編程語言中。本文將深入探討XML Expat Parser 的原理、特性以及…

【Python】自動化GIT提交

在日常開發中&#xff0c;我們經常需要頻繁地向 Git 倉庫提交代碼。雖然 git add、git commit、git push 這幾個命令并不復雜&#xff0c;但重復操作容易出錯&#xff0c;也浪費時間。本文將介紹如何使用 Python 腳本自動化完成 Git 提交流程&#xff0c;讓開發更高效&#xff…

基于Qlearning強化學習的水下無人航行器路徑規劃與避障系統matlab性能仿真

目錄 1.引言 2.算法仿真效果演示 3.數據集格式或算法參數簡介 4.算法涉及理論知識概要 5.參考文獻 6.完整算法代碼文件獲得 1.引言 水下無人航行器 (Autonomous Underwater Vehicle, AUV) 的路徑規劃與避障是海洋探索、資源開發和軍事應用中的關鍵技術。傳統的路徑規劃方…

模塊自由拼裝!Python重構DSSAT作物模塊教程(以雜交水稻為例)

基于過程的作物生長模型&#xff08;Process-based Crop Growth Simulation Model&#xff09;在模擬作物對氣候變化的響應與適應、農田管理優化、作物品種和株型篩選、農業碳中和、農田固碳減排等領域扮演著越來越重要的作用。Decision Support Systems for Agrotechnology Tr…

Java項目接口權限校驗的靈活實現

引言 在Java Web開發中&#xff0c;接口權限校驗是保護系統資源安全的關鍵機制。本文將介紹一種靈活、可配置的接口權限校驗方案&#xff0c;通過注解驅動和攔截器實現&#xff0c;既能保證安全性&#xff0c;又能靈活控制哪些接口需要校驗。 設計思路 實現方案的核心設計要點&…

瀚高DB兼容MySQL if函數

文章目錄環境癥狀問題原因解決方案環境 系統平臺&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5 癥狀 MySQL if函數在瀚高DB當中沒有&#xff0c;源應用在用到if函數時&#xff0c;就會報if函數不存在的錯誤信息。為此&#xff0c;我們需要根據業…

基于深度學習的胸部 X 光圖像肺炎分類系統(六)

目錄 結果指標解讀 一、為什么選擇這些指標&#xff1f; 二、各指標的定義和解讀 1. 準確率&#xff08;Accuracy&#xff09; 2. 損失&#xff08;Loss&#xff09; 3. 精確率&#xff08;Precision&#xff09; 4. 召回率&#xff08;Recall&#xff09; 三、這些指標…