Flutter条码扫描检索图书无匹配结果,手动输入条码查询正常如何解决
问题根因
- 你当前的图书检索逻辑全部写在
TextFormField的onChanged回调中,但直接修改TextEditingController.text属性不会触发onChanged回调,扫码填充条码后没有执行过滤逻辑,因此无匹配结果。 - 额外潜在问题:
flutter_barcode_scanner返回的扫描结果可能携带首尾空白字符、换行符,用户取消扫码时会返回固定值-1,未做处理也会导致匹配失败。
修复方案
第一步:抽离公共检索逻辑
在_HomePageState类中新增独立的检索方法,避免逻辑耦合,同时优化空安全处理:
void _runSearch(String input) { String searchStr = input.trim().toLowerCase(); setState(() { if (searchStr.isEmpty) { _booksForDisplay = _books; return; } _booksForDisplay = _books.where((b) { var bName = b.name?.toLowerCase() ?? ""; var bBarcode = b.barcode?.toLowerCase() ?? ""; return bName.startsWith(searchStr) || bBarcode.startsWith(searchStr); }).toList(); }); }
第二步:修改onChanged回调,调用公共检索方法
替换原有onChanged内的冗余逻辑:
onChanged: (string){ _runSearch(string); },
第三步:修改_scan扫码方法,主动触发检索
对扫描结果做异常处理和清洗后主动调用检索:
Future _scan(BuildContext context) async { String barcode = await FlutterBarcodeScanner.scanBarcode( '#ff0000', 'İptal', true, ScanMode.BARCODE ); // 过滤用户主动取消扫码的场景 if (barcode == '-1') return; // 清洗扫码结果的多余空白字符 String cleanedBarcode = barcode.trim(); _controller.text = cleanedBarcode; // 主动触发检索逻辑 _runSearch(cleanedBarcode); }
修改完成后,手动输入和扫码填充两种场景都会正常执行检索匹配。
内容的提问来源于stack exchange,提问作者Mustafa Kemal Öz
相关产品推荐
相关产品推荐

