使用Square SDK在Android运行时出现cannot find symbol错误求助
错误根源
你使用的square_in_app_payments:1.7.10版本依赖Flutter旧版的PluginRegistry.Registrar API,但最新版Flutter已经移除了这个API,导致编译时找不到该类,触发报错。
翻译后的报错日志
/Users/samamamajeed/.pub-cache/hosted/pub.dev/square_in_app_payments-1.7.10/android/src/main/java/sqip/flutter/internal/CardEntryModule.java:73: 错误: 找不到符号
public CardEntryModule(PluginRegistry.Registrar registrar, final MethodChannel channel) {
^
符号: 类 Registrar
位置: 接口 PluginRegistry
/Users/samamamajeed/.pub-cache/hosted/pub.dev/square_in_app_payments-1.7.10/android/src/main/java/sqip/flutter/internal/GooglePayModule.java:59: 错误: 找不到符号
public GooglePayModule(PluginRegistry.Registrar registrar, final MethodChannel channel) {
^
符号: 类 Registrar
位置: 接口 PluginRegistry
/Users/samamamajeed/.pub-cache/hosted/pub.dev/square_in_app_payments-1.7.10/android/src/main/java/sqip/flutter/SquareInAppPaymentsFlutterPlugin.java:39: 错误: 找不到符号
public static void registerWith(io.flutter.plugin.common.PluginRegistry.Registrar registrar) {
^
符号: 类 Registrar
位置: 接口 PluginRegistry
/Users/samamamajeed/.pub-cache/hosted/pub.dev/square_in_app_payments-1.7.10/android/src/main/java/sqip/flutter/SquareInAppPaymentsFlutterPlugin.java:45: 错误: 找不到符号
private SquareInAppPaymentsFlutterPlugin(io.flutter.plugin.common.PluginRegistry.Registrar registrar) {
^
符号: 类 Registrar
位置: 接口 PluginRegistry
注意: /Users/samamamajeed/.pub-cache/hosted/pub.dev/square_in_app_payments-1.7.10/android/src/main/java/sqip/flutter/internal/GooglePayModule.java 使用或覆盖了已过时的API。
注意: 请使用 -Xlint:deprecation 重新编译以获取详细信息。
注意: /Users/samamamajeed/.pub-cache/hosted/pub.dev/square_in_app_payments-1.7.10/android/src/main/java/sqip/flutter/internal/CardEntryModule.java 使用了未经检查或不安全的操作。
注意: 请使用 -Xlint:unchecked 重新编译以获取详细信息。
4 个错误FAILURE: 构建因异常失败。
出错原因:任务':square_in_app_payments:compileDebugJavaWithJavac'执行失败。
可行解决方案
方案1:升级square_in_app_payments到兼容版本
去pub.dev查square_in_app_payments的最新版本,确认是否适配了Flutter新的插件注册API。如果有兼容版本,直接修改pubspec.yaml:
dependencies: square_in_app_payments: ^最新兼容版本号
然后执行flutter pub get更新依赖。
方案2:修改本地包代码适配新API
如果该包暂未更新,可手动修改本地缓存的包代码:
- 找到包路径:
/Users/samamamajeed/.pub-cache/hosted/pub.dev/square_in_app_payments-1.7.10/ - 修改
SquareInAppPaymentsFlutterPlugin.java:- 删除旧的
registerWith方法,替换为新的插件绑定方法:@Override public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "square_in_app_payments"); channel.setMethodCallHandler(this); cardEntryModule = new CardEntryModule(flutterPluginBinding, channel); googlePayModule = new GooglePayModule(flutterPluginBinding, channel); } - 同步修改
CardEntryModule.java和GooglePayModule.java的构造方法,把参数Registrar换成FlutterPluginBinding,并调整相关逻辑(比如通过flutterPluginBinding.getApplicationContext()获取上下文)。
- 删除旧的
方案3:降级Flutter版本
如果不想修改包代码,可以把Flutter降级到仍支持PluginRegistry.Registrar的版本(比如3.7.x系列),执行命令:
flutter downgrade 3.7.12
内容的提问来源于stack exchange,提问作者Samama

