Я разрабатываю приложение Bluetooth с Flutter Blue, и основная функция приложения заключается в получении характеристических данных c из службы Bluetooth. Чтобы получить данные c, мне нужно вызвать несколько функций. После подключения к сервису я должен установить итератор построителя StreamBuilder "c" в "! c .isNotifying", чтобы наконец получить характеристические данные c. Можно ли как-нибудь вызвать все эти функции одним вызовом?
Я нашел ответ, но на разных языках. Мне нужно использовать Flutter для этого приложения.
Чтобы быть более наглядным, вот порядок вызовов функций. Первая функция, которую я хочу вызвать: r.device.connect();
StreamBuilder<List<ScanResult>>(
stream: FlutterBlue.instance.scanResults,
initialData: [],
builder: (c, snapshot) => Column(
children: snapshot.data
.map(
(r) => ScanResultTile(
result: r,
onTap: () => Navigator.of(context)
.push(MaterialPageRoute(builder: (context) {
//CALLS r.device.connect() HERE
r.device.connect();
return DeviceScreen(device: r.device);
})),
),
)
.toList(),
),
),
Следующая функция, которую я хочу вызвать, находится внутри оператора switch, где onPressed = () => device.discoverServices
:
switch (snapshot.data) {
case BluetoothDeviceState.connected:
onPressed = () => device.disconnect();
text = 'DISCONNECT';
break;
case BluetoothDeviceState.disconnected:
//CALLS device.discoverServices HERE
onPressed = () => device.discoverServices();
text = 'CONNECT';
break;
default:
onPressed = null;
text = snapshot.data.toString().substring(21).toUpperCase();
break;
}
Наконец, я изменить значение isNotifying
List<Widget> _buildServiceTiles(List<BluetoothService> services) {
return services
.map(
(s) => ServiceTile(
service: s,
characteristicTiles: s.characteristics
.map(
(c) => CharacteristicTile(
characteristic: c,
onReadPressed: () => c.read(),
onWritePressed: () => c.write(_getRandomBytes()),
//isNotifying CHANGES HERE
onNotificationPressed: () =>
c.setNotifyValue(!c.isNotifying),
descriptorTiles: c.descriptors
.map(
(d) => DescriptorTile(
descriptor: d,
onReadPressed: () => d.read(),
onWritePressed: () => d.write(_getRandomBytes()),
),
)
.toList(),
),
)
.toList(),
),
)
.toList();
}