Flutter升级flutter_smartlook至4.1.7后运行报错求助
升级flutter_smartlook至4.1.7后与Flutter 3.13.0兼容问题排查
问题描述
我在应用中使用flutter_smartlook做监控,原本运行正常,但升级到最新版本4.1.7后出现编译错误,降级回4.1.5就恢复正常。因为必须使用最新的Flutter 3.13.0版本,所以不得不升级这个包,想知道问题出在哪?
错误信息
/Users/casperonflutter/.pub-cache/hosted/pub.dev/flutter_smartlook-4.1.7/lib/wireframe/element_descriptors/canvas_descriptor.dart:7:7: Error: The non-abstract class 'CustomCanvas' is missing implementations for these members: - Canvas.clipPath - Canvas.clipRRect - Canvas.clipRect - Canvas.drawAtlas - Canvas.drawColor - Canvas.drawDRRect - Canvas.drawImage - Canvas.drawImageNine - Canvas.drawImageRect - Canvas.drawOval - Canvas.drawPaint - Canvas.drawParagraph - Canvas.drawPicture - Canvas.drawPoints - Canvas.drawRRect - Canvas.drawRawAtlas - Canvas.drawRawPoints - Canvas.drawShadow - Canvas.drawVertices - Canvas.getDestinationClipBounds - Canvas.getLocalClipBounds - Canvas.getSaveCount - Canvas.getTransform - Canvas.restore - Canvas.restoreToCount - Canvas.rotate - Canvas.save - Canvas.saveLayer - Canvas.scale - Canvas.skew - Canvas.transform - Canvas.translate Try to either - provide an implementation, - inherit an implementation from a superclass or mixin, - mark the class as abstract, or - provide a 'noSuchMethod' implementation. class CustomCanvas extends Canvas { ^^^^^^^^^^^^ org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.clipPath' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.clipRRect' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.clipRect' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawAtlas' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawColor' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawDRRect' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawImage' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawImageNine' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawImageRect' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawOval' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawPaint' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawParagraph' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawPicture' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawPoints' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawRRect' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawRawAtlas' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawRawPoints' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawShadow' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.drawVertices' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.getDestinationClipBounds' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.getLocalClipBounds' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.getSaveCount' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.getTransform' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.restore' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.restoreToCount' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.rotate' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.save' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.saveLayer' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.scale' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.skew' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.transform' is defined here. org-dartlang-sdk:///lib/ui/canvas.dart: Context: 'Canvas.translate' is defined here. /Users/casperonflutter/.pub-cache/hosted/pub.dev/flutter_google_places_sdk-0.3.2+9/lib/flutter_google_places_sdk.dart:123:55: Error: Member not found: 'ALL'. PlaceTypeFilter placeTypeFilter = PlaceTypeFilter.ALL, ^^^ /Users/casperonflutter/.pub-cache/hosted/pub.dev/flutter_google_places_sdk-0.3.2+9/lib/flutter_google_places_sdk.dart:132:11: Error: No named parameter with the name 'placeTypeFilter'. placeTypeFilter: placeTypeFilter, ^^^^^^^^^^^^^^^ /Users/casperonflutter/.pub-cache/hosted/pub.dev/flutter_smartlook-4.1.7/lib/wireframe/element_descriptors/canvas_descriptor.dart:13:7: Error: Superclass has no constructor named 'Canvas'. ) : super(recorder); ^^^^^ /Users/casperonflutter/.pub-cache/hosted/pub.dev/flutter_smartlook-4.1.7/lib/wireframe/element_descriptors/canvas_descriptor.dart:17:11: Error: Superclass has no method named 'drawRect'. super.drawRect(rect, paint); ^^^^^^^^ /Users/casperonflutter/.pub-cache/hosted/pub.dev/flutter_smartlook-4.1.7/lib/wireframe/element_descriptors/canvas_descriptor.dart:27:11: Error: Superclass has no method named 'drawCircle'. super.drawCircle(c, radius, paint); ^^^^^^^^^^ /Users/casperonflutter/.pub-cache/hosted/pub.dev/flutter_smartlook-4.1.7/lib/wireframe/element_descriptors/canvas_descriptor.dart:39:11: Error: Superclass has no method named 'drawArc'. super.drawArc(rect, startAngle, sweepAngle, useCenter, paint); ^^^^^^^ /Users/casperonflutter/.pub-cache/hosted/pub.dev/flutter_smartlook-4.1.7/lib/wireframe/element_descriptors/canvas_descriptor.dart:45:11: Error: Superclass has no method named 'drawPath'. super.drawPath(path, paint); ^^^^^^^^ /Users/casperonflutter/.pub-cache/hosted/pub.dev/flutter_smartlook-4.1.7/lib/wireframe/element_descriptors/canvas_descriptor.dart:65:11: Error: Superclass has no method named 'drawLine'. super.drawLine(p1, p2, paint); ^^^^^^^^ Unhandled exception: Null check operator used on a null value #0 ProgramCompiler._emitSuperConstructorCallIfNeeded (package:dev_compiler/src/kernel/compiler.dart:1962:47) #1 ProgramCompiler._emitConstructorBody (package:dev_compiler/src/kernel/compiler.dart:1901:19) #2 ProgramCompiler._emitConstructor.<anonymous closure>.<anonymous closure> (package:dev_compiler/src/kernel/compiler.dart:1848:19) #3 ProgramCompiler._superDisallowed (package:dev_compiler/src/kernel/compiler.dart:4107:24) #4 ProgramCompiler._emitConstructor.<anonymous closure> (package:dev_compiler/src/kernel/compiler.dart:1847:15) #5 ProgramCompiler._withLetScope (package:dev_compiler/src/kernel/compiler.dart:2693:25) #6 ProgramCompiler._withCurrentFunction (package:dev_compiler/src/kernel/compiler.dart:4097:18) #7 ProgramCompiler._emitConstructor (package:dev_compiler/src/kernel/compiler.dart:1845:16) #8 ProgramCompiler._defineConstructors (package:dev_compiler/src/kernel/compiler.dart:1459:28) #9 ProgramCompiler._emitClassDeclaration (package:dev_compiler/src/kernel/compiler.dart:879:19) #10 ProgramCompiler._emitClass (package:dev_compiler/src/kernel/compiler.dart:802:25) #11 List.forEach (dart:core-patch/growable_array.dart:416:8) #12 ProgramCompiler._emitLibrary (package:dev_compiler/src/kernel/compiler.dart:740:23)
问题原因分析
- flutter_smartlook 4.1.7适配缺失:Flutter 3.13.0将
Canvas改为抽象类,要求子类必须实现所有抽象方法。但flutter_smartlook 4.1.7中的CustomCanvas类直接继承Canvas后,仅实现了drawRect、drawCircle等少量方法,未覆盖全部抽象方法,触发编译错误。同时代码中调用的Canvas构造器、父类方法在新版本Flutter中已不存在或变更,进一步引发报错。 - flutter_google_places_sdk版本过时:你使用的0.3.2+9版本依赖的Flutter API已被废弃,
PlaceTypeFilter.ALL被移除,相关方法参数也做了调整,导致参数不存在的错误。
解决方案
- 优先升级依赖包:
- 检查flutter_smartlook的最新版本,若有适配Flutter 3.13.0的版本,直接升级。
- 将flutter_google_places_sdk升级到最新版本,新版本会适配Flutter的API变更,解决
PlaceTypeFilter和参数问题。
- 官方未修复时的临时方案:
- 若flutter_smartlook暂无适配版本,可尝试使用其预览版或测试版(如有发布)。
- 自行fork flutter_smartlook仓库,修改
canvas_descriptor.dart中的CustomCanvas类:改为抽象类、添加noSuchMethod实现,或改为委托模式(持有Canvas实例而非直接继承),绕过抽象类的强制实现要求。
- 反馈问题:向flutter_smartlook官方提交issue,说明兼容Flutter 3.13.0的问题,推动官方修复。
内容的提问来源于stack exchange,提问作者Senthur Kumaran
相关产品推荐
相关产品推荐

