You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:40:59