Проблема с FlutterBluePlus: обработка сканирования устройств и выбор устройств в приложении FlutterAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с FlutterBluePlus: обработка сканирования устройств и выбор устройств в приложении Flutter

Сообщение Anonymous »

Я работаю над приложением 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»