Во всяком случае, чтобы вызвать несколько функций с одним обратным вызовом во флаттере? - PullRequest
0 голосов
/ 24 января 2020

Я разрабатываю приложение 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();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...