Flutter iOS构建成功但Android release报flutter_paystack编译错误
问题现象
- 项目未升级至Flutter v3版本,构建时携带
--no-sound-null-safety参数,无明显业务代码改动的前提下iOS端可正常构建,Android端突发构建异常,仅移除flutter_paystack: ^1.0.5+1、qr_code_scanner: ^0.6.1两个依赖包后可恢复正常构建 - 执行
fvm flutter build apk --release --no-sound-null-safety命令构建release包时,Gradle任务assembleRelease执行阶段输出大量空安全相关警告:another_flushbar、pinput、qr_code_scanner、printing、syncfusion_flutter_datepicker、syncfusion_flutter_charts、searchfield等第三方依赖均提示空感知操作符(!、?.)被作用于非空的SchedulerBinding/WidgetsBinding类型 - 构建最终失败,核心报错为
flutter_paystack:compileReleaseKotlin任务执行异常,存在2处Kotlin类型不匹配错误:FlutterPaystackPlugin.kt第48行推断类型为Activity?,但上下文要求传入非空Activity类型MethodCallHandlerImpl.kt第19行推断类型为BinaryMessenger?,但上下文要求传入非空BinaryMessenger类型
- 已尝试
flutter clean、IDE缓存失效重建、删除Podfile等操作均无法解决问题,flutter doctor检测结果仅存在Android Studio无法找到内置Java版本的异常
根因
该问题由Flutter 2.10及后续小版本的引擎API空安全标记变更导致:原本标记为可空的SchedulerBinding.instance/WidgetsBinding.instance、插件注册时传入的Activity、BinaryMessenger等API被调整为非空类型。
- iOS端插件使用Objective-C/Swift编写,空安全校验为弱校验,未适配的老版本插件不会触发编译错误
- Android端Kotlin空安全为编译期强校验,未适配的老版本插件会直接触发类型不匹配报错
出现的大量空感知操作符警告、flutter_paystack的Kotlin编译报错,本质都是插件版本和当前Flutter版本API不匹配导致,和业务代码改动无关。flutter doctor提示的Android Studio找不到内置Java的问题,会导致Gradle的Kotlin编译器类型推断异常,进一步提升编译报错概率。
解决方案
按以下顺序操作即可修复:
先修复JDK配置问题
打开项目根目录下的android/gradle.properties文件,添加配置指定Gradle编译使用的JDK路径,必须使用JDK 11版本(不要用JDK17及以上版本):- Windows系统添加:
org.gradle.java.home=C:\\Program Files\\Java\\jdk-11(路径替换为你本机JDK11的实际安装路径) - Mac系统添加:
org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home(路径替换为你本机JDK11的实际安装路径)
配置完成后重新执行flutter doctor,确认Java相关报错消失。
- Windows系统添加:
修复flutter_paystack的Kotlin类型报错
进入本机Pub缓存目录找到对应插件包:- Windows默认路径:
C:\Users\你的用户名\AppData\Local\Pub\Cache\hosted\pub.dev\flutter_paystack-1.0.5+1 - Mac默认路径:
~/.pub-cache/hosted/pub.dev/flutter_paystack-1.0.5+1
修改两个文件的代码: - 打开
android/src/main/kotlin/co/paystack/flutterpaystack/FlutterPaystackPlugin.kt,定位到第48行,给传入的activity参数加非空强转,修改为this.activity = activity!! - 打开同目录下的
MethodCallHandlerImpl.kt,定位到第19行,给传入的binaryMessenger参数加非空强转,修改为private val messenger: BinaryMessenger = binaryMessenger!!
- Windows默认路径:
降级不兼容的依赖版本消除警告
这些空感知操作符警告不会直接阻断构建,但如果要彻底消除,直接将pubspec.yaml中对应依赖锁到适配当前Flutter版本的旧版本即可:qr_code_scanner: 0.5.2another_flushbar: 1.10.28pinput: 2.2.12syncfusion_flutter_datepicker: 20.1.47syncfusion_flutter_charts: 20.1.47printing: 5.9.3searchfield: 0.7.4
修改完成后执行flutter pub get重新拉取依赖。
清理缓存重新构建
依次执行以下命令完成清理和构建:
flutter clean cd android && ./gradlew clean && cd .. flutter build apk --release --no-sound-null-safety
后续如果升级到Flutter v3,直接将上述锁版本的依赖放开到适配Flutter3的版本,再把之前修改的Pub缓存中flutter_paystack的代码还原即可,也可以直接替换为维护更活跃的Paystack相关插件。
内容的提问来源于stack exchange,提问作者Lilvinco
相关产品推荐
相关产品推荐

