gpt4 book ai didi

flutter - 在 Flutter 中收听 Stream 并只向 DB 写入一次

转载 作者:行者123 更新时间:2023-12-04 11:35:44 24 4
gpt4 key购买 nike

我正在开发一个二维码阅读器应用程序,我使用一个外部二维码阅读器包 ( https://pub.dev/packages/qr_code_scanner )。
它监听 Stream 并返回 QR 数据。但是当我将数据写入 sqlite 数据库时,它会多次写入相同的数据,因为它不会停止监听 Stream。我不认为取消订阅流是一个好主意,因为在从 url 启动或关闭对话框返回后,我仍然需要流来收听。如果我错了,请纠正我并提出解决方案,谢谢。

void _onQRViewCreated(QRViewController controller) {
this.controller = controller;
controller.scannedDataStream.listen((scanData) async {

setState(() {
qrData = scanData;
});

if (await canLaunch(qrData)) {
var status = await launch(qrData);

if(status){
final data = QrModel(
content: scanData,
date: DateFormat.yMMMd().add_jm().format(DateTime.now()),
);
await dbProvider.addData(data);
}

} else {

if (!alertBoxOpen) {

final data = QrModel(
content: scanData,
date: DateFormat.yMMMd().add_jm().format(DateTime.now()),
);
await dbProvider.addData(data);

setState(() => alertBoxOpen = true);

showDialog(
context: context,
builder: (context) {
return AlertDialog(
content: Text(qrData),
actions: [
MaterialButton(
child: Text('OK',
style: TextStyle(
fontSize: 18.0, fontWeight: FontWeight.bold)),
onPressed: () {
setState(() => alertBoxOpen = false);
Navigator.of(context).pop();
}),
],
);
});
}
}
});

}

最佳答案

您在流上有一个订阅还是流发出多个相同的值?如果是后者我建议你试试 rxdart包裹。它是 Dart 的 ReactiveX 实现。我在响应式(Reactive)编程方面没有那么多经验,但根据我使用 BehaviorSubject 的经验从 rxdart 中,当向其添加相同的值时,它不会通知订阅者。因此,您可以做的一件事是将 QR 流中的每个值添加到 BehaviorSubject ,而是订阅(收听)行为主题以查询数据库。

关于flutter - 在 Flutter 中收听 Stream 并只向 DB 写入一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65265147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com