Anonymous
Проблема с FlutterBluePlus: обработка сканирования устройств и выбор устройств в приложении Flutter
Сообщение
Anonymous » 16 сен 2024, 09:02
Я работаю над приложением Flutter, которое использует пакет flutter_blue_plus для сканирования и подключения к устройствам BLE. Я столкнулся с проблемой, когда я пытаюсь обработать процесс сканирования устройства и разрешить пользователю выбрать устройство. Однако я получаю сообщение об ошибке при использовании FlutterBluePlus.instance.isScanning и обработке выбора устройства.
Ниже приведен соответствующий код для процесса сканирования и выбора устройства Bluetooth:< /p>
Код: Выделить всё
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:whizpad_lan_flutter/blocs/add_device_bloc.dart';
import 'package:provider/provider.dart';
import 'package:whizpad_lan_flutter/blocs/ble/device_discovery_bloc.dart';
import 'package:whizpad_lan_flutter/utils/values.dart';
import 'package:whizpad_lan_flutter/widgets/bottom_sheet_background.dart';
import 'package:whizpad_lan_flutter/widgets/one_line_text.dart';
import 'package:whizpad_lan_flutter/models/device_model.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'button_add_device.dart';
class InputDeviceMacBottomSheet extends StatefulWidget {
const InputDeviceMacBottomSheet({
Key? key,
required this.screenSize,
required this.parentContext,
required this.deviceType,
}) : super(key: key);
final Size screenSize;
final BuildContext parentContext;
final DeviceType? deviceType;
@override
_InputDeviceMacBottomSheetState createState() =>
_InputDeviceMacBottomSheetState();
}
class _InputDeviceMacBottomSheetState extends State {
TextEditingController textEditingController = TextEditingController();
late AddDeviceBloc addDeviceBloc;
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
addDeviceBloc = Provider.of(context);
return StreamBuilder(
stream: addDeviceBloc.selectedDevice,
builder: (context, selectedDevice) {
return StreamBuilder(
stream: addDeviceBloc.selectedDeviceId,
builder: (context, selectedDeviceMac) {
if (selectedDeviceMac.hasData == false) {
return SizedBox();
}
textEditingController.text = selectedDeviceMac.data!;
textEditingController.selection = TextSelection.collapsed(
offset: textEditingController.text.length);
return MyBottomSheetBackground(
screenSize: widget.screenSize,
title: AppLocalizations.of(context)!.enterDeviceMacPage,
subtitle: AppLocalizations.of(context)!.enterDeviceMac,
child: Column(
children: [
Container(
color: Colors.white,
child: Row(
children: [
Padding(
padding: const EdgeInsets.only(left: 24.0),
child: Text(AppLocalizations.of(context)!.deviceMac,
style: textStyle45pt),
),
Expanded(
child: TextFieldContainer(
child: TextField(
controller: textEditingController,
onEditingComplete: () {
addDeviceBloc.updateSelectedMac(
textEditingController.text);
FocusScope.of(context).unfocus();
},
cursorColor: primaryBlackColor,
decoration: InputDecoration(
hintText: AppLocalizations.of(context)!.enterMac,
border: InputBorder.none,
hintStyle: textStyle30ptGrey,
),
textCapitalization:
TextCapitalization.characters,
inputFormatters: [
FilteringTextInputFormatter.allow(inputMacRegExp),
LengthLimitingTextInputFormatter(12),
],
),
)),
],
),
),
StreamBuilder(
stream: FlutterBluePlus.instance.isScanning,
builder: (context, isScanning) {
return Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(AppLocalizations.of(context)!.anyDeviceMac,
style: textStyleBold),
if (isScanning.hasData && isScanning.data != null)
Container(
width: 16.0,
height: 16.0,
margin: EdgeInsets.only(left: 8.0),
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation(
Colors.grey,
),
strokeWidth: 2,
),
),
],
),
),
);
}),
Expanded(
child: StreamBuilder(
stream: Provider.of(
widget.parentContext)
.targetDevices(widget.deviceType),
builder: (context, snapshot) {
if (snapshot.data == null) {
return Container();
}
return ListView.separated(
separatorBuilder: (context, index) {
return Divider(
height: 2.0,
);
},
itemCount: snapshot.data!.length + 1,
itemBuilder: (context, index) {
if (index == snapshot.data!.length) {
return StreamBuilder(
stream:
FlutterBluePlus.instance.isScanning,
builder: (context, isScanning) {
if (isScanning.data == null ||
isScanning.data == true) {
return SizedBox();
}
return Padding(
padding:
const EdgeInsets.only(top: 8.0),
child: Row(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
Text(AppLocalizations.of(context)!
.bottonDeviceNotFound),
GestureDetector(
child: Text(
AppLocalizations.of(context)!
.refresh,
style: TextStyle(
color: Colors.blue,
decoration:
TextDecoration.underline),
),
onTap: () {
FlutterBluePlus.instance
.startScan(
timeout: Duration(
seconds: 10));
},
)
],
),
);
});
}
String macStr = '';
final Device? device = snapshot.data![index];
macStr = device?.getDecodedAdvServiceData();
return ListTile(
onTap: () {
Provider.of(context, listen: false)
.selectDevice(snapshot.data![index]!);
},
tileColor: Colors.white,
title: Align(
alignment: Alignment(-1, 0),
child: OneLineText("$macStr")),
trailing: selectedDevice.data?.deviceId ==
snapshot.data![index]?.deviceId
? Icon(Icons.check_circle_sharp, color: Colors.green)
: SizedBox(),
);
},
);
},
),
)
],
),
bottomButton: MyButton(
title: AppLocalizations.of(context)!.add,
onPress: (textEditingController.text == "" ||
textEditingController.text.length < 12)
? null
: () {
Navigator.pop(context, textEditingController.text);
},
),
);
});
});
}
}
Проблема:
Я использую flutter_blue_plus для сканирования устройств BLE и разрешения пользователям выбирать их. У меня возникают проблемы с обработкой потока сканирования с помощью FlutterBluePlus.instance.isScanning, а также я не уверен, правильно ли я обрабатываю выбор устройства.
У меня есть StreamBuilder для isScanning , но я не уверен, использую ли я правильный API для обработки статуса сканирования или мне следует использовать isScanningStream. Кроме того, мне нужна помощь в подтверждении того, что я правильно выполняю процесс выбора устройства, извлекая необходимые сведения из результатов сканирования.
Вопросы:
Правильно ли сканирование FlutterBluePlus.instance.isScanning API для проверки текущего сканирования, или мне следует использовать isScanningStream?
Как правильно обрабатывать процесс выбора устройства с помощью flutter_blue_plus, особенно для получения MAC-адреса устройства и передачи его в мой AddDeviceBloc?
Подробнее здесь:
https://stackoverflow.com/questions/789 ... ices-in-fl
1726466554
Anonymous
Я работаю над приложением Flutter, которое использует пакет flutter_blue_plus для сканирования и подключения к устройствам BLE. Я столкнулся с проблемой, когда я пытаюсь обработать процесс сканирования устройства и разрешить пользователю выбрать устройство. Однако я получаю сообщение об ошибке при использовании FlutterBluePlus.instance.isScanning и обработке выбора устройства. Ниже приведен соответствующий код для процесса сканирования и выбора устройства Bluetooth:< /p> [code]import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:whizpad_lan_flutter/blocs/add_device_bloc.dart'; import 'package:provider/provider.dart'; import 'package:whizpad_lan_flutter/blocs/ble/device_discovery_bloc.dart'; import 'package:whizpad_lan_flutter/utils/values.dart'; import 'package:whizpad_lan_flutter/widgets/bottom_sheet_background.dart'; import 'package:whizpad_lan_flutter/widgets/one_line_text.dart'; import 'package:whizpad_lan_flutter/models/device_model.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'button_add_device.dart'; class InputDeviceMacBottomSheet extends StatefulWidget { const InputDeviceMacBottomSheet({ Key? key, required this.screenSize, required this.parentContext, required this.deviceType, }) : super(key: key); final Size screenSize; final BuildContext parentContext; final DeviceType? deviceType; @override _InputDeviceMacBottomSheetState createState() => _InputDeviceMacBottomSheetState(); } class _InputDeviceMacBottomSheetState extends State { TextEditingController textEditingController = TextEditingController(); late AddDeviceBloc addDeviceBloc; @override void initState() { super.initState(); } @override Widget build(BuildContext context) { addDeviceBloc = Provider.of(context); return StreamBuilder( stream: addDeviceBloc.selectedDevice, builder: (context, selectedDevice) { return StreamBuilder( stream: addDeviceBloc.selectedDeviceId, builder: (context, selectedDeviceMac) { if (selectedDeviceMac.hasData == false) { return SizedBox(); } textEditingController.text = selectedDeviceMac.data!; textEditingController.selection = TextSelection.collapsed( offset: textEditingController.text.length); return MyBottomSheetBackground( screenSize: widget.screenSize, title: AppLocalizations.of(context)!.enterDeviceMacPage, subtitle: AppLocalizations.of(context)!.enterDeviceMac, child: Column( children: [ Container( color: Colors.white, child: Row( children: [ Padding( padding: const EdgeInsets.only(left: 24.0), child: Text(AppLocalizations.of(context)!.deviceMac, style: textStyle45pt), ), Expanded( child: TextFieldContainer( child: TextField( controller: textEditingController, onEditingComplete: () { addDeviceBloc.updateSelectedMac( textEditingController.text); FocusScope.of(context).unfocus(); }, cursorColor: primaryBlackColor, decoration: InputDecoration( hintText: AppLocalizations.of(context)!.enterMac, border: InputBorder.none, hintStyle: textStyle30ptGrey, ), textCapitalization: TextCapitalization.characters, inputFormatters: [ FilteringTextInputFormatter.allow(inputMacRegExp), LengthLimitingTextInputFormatter(12), ], ), )), ], ), ), StreamBuilder( stream: FlutterBluePlus.instance.isScanning, builder: (context, isScanning) { return Center( child: Padding( padding: const EdgeInsets.all(16.0), child: Row( mainAxisSize: MainAxisSize.min, children: [ Text(AppLocalizations.of(context)!.anyDeviceMac, style: textStyleBold), if (isScanning.hasData && isScanning.data != null) Container( width: 16.0, height: 16.0, margin: EdgeInsets.only(left: 8.0), child: CircularProgressIndicator( valueColor: AlwaysStoppedAnimation( Colors.grey, ), strokeWidth: 2, ), ), ], ), ), ); }), Expanded( child: StreamBuilder( stream: Provider.of( widget.parentContext) .targetDevices(widget.deviceType), builder: (context, snapshot) { if (snapshot.data == null) { return Container(); } return ListView.separated( separatorBuilder: (context, index) { return Divider( height: 2.0, ); }, itemCount: snapshot.data!.length + 1, itemBuilder: (context, index) { if (index == snapshot.data!.length) { return StreamBuilder( stream: FlutterBluePlus.instance.isScanning, builder: (context, isScanning) { if (isScanning.data == null || isScanning.data == true) { return SizedBox(); } return Padding( padding: const EdgeInsets.only(top: 8.0), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text(AppLocalizations.of(context)! .bottonDeviceNotFound), GestureDetector( child: Text( AppLocalizations.of(context)! .refresh, style: TextStyle( color: Colors.blue, decoration: TextDecoration.underline), ), onTap: () { FlutterBluePlus.instance .startScan( timeout: Duration( seconds: 10)); }, ) ], ), ); }); } String macStr = ''; final Device? device = snapshot.data![index]; macStr = device?.getDecodedAdvServiceData(); return ListTile( onTap: () { Provider.of(context, listen: false) .selectDevice(snapshot.data![index]!); }, tileColor: Colors.white, title: Align( alignment: Alignment(-1, 0), child: OneLineText("$macStr")), trailing: selectedDevice.data?.deviceId == snapshot.data![index]?.deviceId ? Icon(Icons.check_circle_sharp, color: Colors.green) : SizedBox(), ); }, ); }, ), ) ], ), bottomButton: MyButton( title: AppLocalizations.of(context)!.add, onPress: (textEditingController.text == "" || textEditingController.text.length < 12) ? null : () { Navigator.pop(context, textEditingController.text); }, ), ); }); }); } } [/code] Проблема: Я использую flutter_blue_plus для сканирования устройств BLE и разрешения пользователям выбирать их. У меня возникают проблемы с обработкой потока сканирования с помощью FlutterBluePlus.instance.isScanning, а также я не уверен, правильно ли я обрабатываю выбор устройства. У меня есть StreamBuilder для isScanning , но я не уверен, использую ли я правильный API для обработки статуса сканирования или мне следует использовать isScanningStream. Кроме того, мне нужна помощь в подтверждении того, что я правильно выполняю процесс выбора устройства, извлекая необходимые сведения из результатов сканирования. Вопросы: Правильно ли сканирование FlutterBluePlus.instance.isScanning API для проверки текущего сканирования, или мне следует использовать isScanningStream? Как правильно обрабатывать процесс выбора устройства с помощью flutter_blue_plus, особенно для получения MAC-адреса устройства и передачи его в мой AddDeviceBloc? Подробнее здесь: [url]https://stackoverflow.com/questions/78988864/issue-with-flutterblueplus-handling-device-scanning-and-selecting-devices-in-fl[/url]