#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. Приостановите камеру, как вы это делали, затем закройте поток