簡體   English   中英

如何從 flutter_reactive_ble 示例中獲取 deviceServices

[英]How to get deviceServices from flutter_reactive_ble example

我正在使用 flutter_reactive_ble 項目( https://github.com/PhilipsHue/flutter_reactive_ble )中提供的示例,特別是在device_detail_screen.dart文件中。

它的工作原理與我認為應該工作的一樣多,但我想知道如何將discoverServices(device.id)的結果保存為變量,以便我可以在文本小部件或其他東西中顯示它(這是計划至少)。 每次我嘗試這樣做時,都會收到一條錯誤消息:此表達式的類型為“void”,因此無法使用其值。

我相信這是因為它是 Future<List< DiscoveredService>> 類型(參見下面的聲明)

Future<List< DiscoveredService>> discoverServices (String deviceId)

我對此很陌生,所以我只是想弄清楚這一切是如何運作的。

每當我單擊“發現服務”按鈕時,所有服務都會顯示在我的計算機終端中,但我希望它們最終顯示在設備上。

如果您不想查看整個項目,這里是實際代碼。 我很確定這是適用的文件。 我已經在我詢問的行上加上了“***”。

如果您需要更多信息或澄清,請告訴我。 謝謝!

import 'package:flutter/material.dart';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:flutter_reactive_ble_example/src/ble/ble_device_connector.dart';
import 'package:provider/provider.dart';

class DeviceDetailScreen extends StatelessWidget {
  final DiscoveredDevice device;

  const DeviceDetailScreen({@required this.device}) : assert(device != null);

  @override
  Widget build(BuildContext context) =>
      Consumer2<BleDeviceConnector, ConnectionStateUpdate>(
        builder: (_, deviceConnector, connectionStateUpdate, __) =>
            _DeviceDetail(
          device: device,
          connectionUpdate: connectionStateUpdate != null &&
                  connectionStateUpdate.deviceId == device.id
              ? connectionStateUpdate
              : ConnectionStateUpdate(
                  deviceId: device.id,
                  connectionState: DeviceConnectionState.disconnected,
                  failure: null,
                ),
          connect: deviceConnector.connect,
          disconnect: deviceConnector.disconnect,
          discoverServices: deviceConnector.discoverServices,
        ),
      );
}

class _DeviceDetail extends StatelessWidget {
  const _DeviceDetail({
    @required this.device,
    @required this.connectionUpdate,
    @required this.connect,
    @required this.disconnect,
    @required this.discoverServices,
    Key key,
  })  : assert(device != null),
        assert(connectionUpdate != null),
        assert(connect != null),
        assert(disconnect != null),
        assert(discoverServices != null),
        super(key: key);

  final DiscoveredDevice device;
  final ConnectionStateUpdate connectionUpdate;
  final void Function(String deviceId) connect;
  final void Function(String deviceId) disconnect;
  final void Function(String deviceId) discoverServices;

  bool _deviceConnected() =>
      connectionUpdate.connectionState == DeviceConnectionState.connected;

  @override
  Widget build(BuildContext context) => WillPopScope(
        onWillPop: () async {
          disconnect(device.id);
          return true;
        },
        child: Scaffold(
          appBar: AppBar(
            title: Text(device.name ?? "unknown"),
          ),
          body: Center(
            child: SafeArea(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text(
                      "ID: ${connectionUpdate.deviceId}",
                      style: const TextStyle(fontWeight: FontWeight.bold),
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text(
                      "Status: ${connectionUpdate.connectionState}",
                      style: const TextStyle(fontWeight: FontWeight.bold),
                    ),
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: <Widget>[
                      Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: ElevatedButton(
                          onPressed: !_deviceConnected()
                              ? () => connect(device.id)
                              : null,
                          child: const Text("Connect"),
                        ),
                      ),
                      Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: ElevatedButton(
                          onPressed: _deviceConnected()
                              ? () => disconnect(device.id)
                              : null,
                          child: const Text("Disconnect"),
                        ),
                      ),
                    ],
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: ElevatedButton(
                          // onPressed: _deviceConnected()                    // *** original code from example
                          //     ? () => discoverServices(device.id)          // *** original code from example
                          //     : null,                                      // *** original code from example
                          onPressed: (){
                            if (_deviceConnected()){                          // *** My attempt at storing as a variable (this entire anonymous function)
                              var services = discoverServices(device.id);
                              print("services: $services");                   // *** services is underlined with an error: This expression has a type of 'void' so its value can't be used.
                            }
                          },
                          child: const Text("Discover Services"),
                        ),
                      ),
                    ],
                  ),
                  Text("data"),                                               // *** Where I'd like to populate the results of the discoverServices(device.id)
                ],
              ),
            ),
          ),
        ),
      );
}

我希望您的BleDeviceConnector等於this

如果要使用FlutterReactiveBle::discoverServices(...)中的值List<DiscoveredService> ,則必須將BleDeviceConnector::discoverServices(...) function 修改為...

Future<List<DiscoveredService>> discoverServices(String deviceId) => _ble.discoverServices(deviceId);

而你的onPressed回調...

onPressed: () async {
    if (_deviceConnected()) {
        var services = await discoverServices(device.id);
        print("services: $services");
        // TODO: Insert your code to update the UI of "Text("data"),"
    }
},

編輯:您還需要將_DeviceDetaildiscoverServices修改為...

final Future<List<DiscoveredService>> Function(String deviceId) discoverServices;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM