Flutter扫码报NoSuchMethodError,求仅传数字到服务器的解决方法
问题解决:扫码报错与数字内容提取
一、报错原因及修复
报错NoSuchMethodError: Class 'String' has no instance getter 'code'的核心原因是:你在处理扫码结果时,误将字符串类型的扫描结果当成了包含code属性的对象调用。在qr_code_scanner: ^1.0.1版本中,scannedDataStream返回的是Stream<String>,也就是直接返回扫码得到的URL字符串,不存在code属性。
修复示例
扫码Widget中的回调修改
原来的错误写法(假设):
void _onQRViewCreated(QRViewController controller) { controller.scannedDataStream.listen((data) { // 错误:将字符串data当成对象调用code cubit.sendScanData(data.code); }); }
修改为直接使用字符串结果:
void _onQRViewCreated(QRViewController controller) { controller.scannedDataStream.listen((scanResult) { // 直接传入扫描得到的字符串 cubit.sendScanData(scanResult); }); }
ScannerCubit中的参数适配
确保Cubit的方法接收String类型参数:
class ScannerCubit extends Cubit<ScannerState> { final ApiService apiService; ScannerCubit(this.apiService) : super(ScannerInitial()); void sendScanData(String scanContent) async { try { emit(ScannerLoading()); // 后续处理逻辑 } catch (e) { emit(ScannerError(e.toString())); } } }
二、仅发送数字内容的实现
通过正则表达式提取扫描字符串中的所有数字,拼接成纯数字字符串后再发送到服务器。
实现代码
在ScannerCubit中添加数字提取方法,并在发送前处理:
class ScannerCubit extends Cubit<ScannerState> { final ApiService apiService; ScannerCubit(this.apiService) : super(ScannerInitial()); void sendScanData(String scanContent) async { try { emit(ScannerLoading()); // 提取字符串中的所有数字 final numericContent = extractNumbers(scanContent); // 校验是否有数字 if (numericContent.isEmpty) { emit(ScannerError("扫码内容不含有效数字")); return; } // 发送到服务器 await apiService.postScannedData(numericContent); emit(ScannerSuccess()); } catch (e) { emit(ScannerError(e.toString())); } } // 提取所有数字字符 String extractNumbers(String input) { // 正则匹配所有连续数字,拼接成字符串 final numberRegex = RegExp(r'\d+'); final matches = numberRegex.allMatches(input); return matches.map((match) => match.group(0)).join(); } }
说明
- 正则
\d+会匹配所有连续的数字序列,如果你需要保留小数点(比如处理带小数的数字),可以修改为RegExp(r'[\d.]+')。 - 添加了空值校验,避免向服务器发送空的数字内容,提升健壮性。
内容的提问来源于stack exchange,提问作者Daniil
相关产品推荐
相关产品推荐

