Контроллер дротика-флаттера останавливает поток прослушивания после переполнения стека данных

#flutter #dart

#флаттер #дротик

Вопрос:

У меня есть следующее в виджете сборки, и поскольку он находится в потоке, он всегда вызывает обратный вызов, как мне остановить поток при наличии данных, чтобы это произошло только один раз. Я попытался избавиться от него, но это не сработало. У меня также нет метода отмены.

 // Conroller and handles the listening
    void _onQRViewCreated(QRViewController controller) {
      setState(() {
        this.controller = controller;
      });
      // Might need to add onError
      controller.scannedDataStream.listen((scanData) {
        setState(() {
          result = scanData;
          widget.qrSuccess(result.code);
        });
      });
    }
 

Комментарии:

1. Stream.first ? в документах говорится: «Первый элемент этого потока. Прекращает прослушивание этого потока после получения первого элемента «.

2. итак, я получаю, что выражение не вычисляется для функции, поэтому его нельзя вызвать. это не сработало бы, так как мне нужно вызвать обратный вызов, также я не уверен, что поток сначала происходит при возврате данных или когда поток просто запускается

3. это не функция, это свойство

4. Я знаю, поэтому я не могу его использовать, если я что-то не вижу

5. Stream s; s.first(); если вы пытаетесь сделать что-то подобное, вы получаете сообщение об ошибке: "The expression doesn't evaluate to a function, so it can't be invoked" — в основном это Future так, что вам нужно использовать Future.тогда , например

Ответ №1:

Я решил это, остановив камеру, вот код

 controller.scannedDataStream.listen(
        (onData) {
          setState(() {
            controller.pauseCamera();
            result = onData;
            widget.qrSuccess(result.code);
            print(result.code);
          });
        },
        onError: (err) {
          print('Error!');
        },
        cancelOnError: false,
        onDone: () {
          print('Done!');
        },
      );
 

Ответ №2:

Просто используйте first свойство stream

     void _onQRViewCreated(QRViewController controller) async{
    setState(() {
      this.controller = controller;
    });

    final scanData = await controller.scannedDataStream.first;
    controller.scannedDataStream.close();
    setState(() {
      result = scanData;
      widget.qrSuccess(result.code);
    });
  }
 
 

Комментарии:

1. Это не останавливается, он продолжает вызывать его, не уверен, что вы пытаетесь сделать здесь

2. Приостановите камеру, как вы это делали, затем закройте поток