如何通过Flutter Pigeon库实现Kotlin调用Dart的Spotify回调方法?
用Pigeon实现Kotlin调用Dart回调的正确配置方案
1. 修正Pigeon接口定义
不用手动传递回调实例,Pigeon对@FlutterApi有内置的实例管理支持。先把你的pigeon文件改成这样:
// pigeon.dart import 'package:pigeon/pigeon.dart'; @FlutterApi() abstract class SpotifyAPICallback { void onAuthCode(String authCode); void onAuthFailure(String errorMessage); } @HostApi() abstract class SpotifyAPI { void startSpotifyAuth(); // 定义让原生触发授权的方法 }
重新运行Pigeon生成代码:
flutter pub run pigeon --input lib/pigeon.dart
2. Dart侧注册回调实现
在Dart层实现SpotifyAPICallback,并通过Pigeon生成的方法注册实例,这一步必须在调用原生授权前完成:
// Dart侧实现回调 class SpotifyCallbackImpl implements SpotifyAPICallback { @override void onAuthCode(String authCode) { // 这里处理拿到授权码后的逻辑 print("Dart收到授权码: $authCode"); } @override void onAuthFailure(String errorMessage) { print("Dart收到授权失败信息: $errorMessage"); } } // 在APP初始化时注册(比如initState里) void setupSpotifyCallback() { SpotifyAPICallback.setup(SpotifyCallbackImpl()); }
3. Kotlin侧调用Dart回调
Pigeon生成的Kotlin代码会自动生成SpotifyAPICallback的单例访问入口,直接在授权成功的回调里调用即可:
// Kotlin侧Spotify授权成功后的处理逻辑 fun handleSpotifyAuthSuccess(authCode: String) { // 直接调用Pigeon生成的回调方法 SpotifyAPICallback.instance?.onAuthCode(authCode) } // 授权失败的处理 fun handleSpotifyAuthFailure(errorMsg: String) { SpotifyAPICallback.instance?.onAuthFailure(errorMsg) }
4. 常见问题排查
- 线程问题:原生调用Dart方法必须在主线程执行,如果Spotify的授权回调在子线程,要切换到主线程:
Handler(Looper.getMainLooper()).post { SpotifyAPICallback.instance?.onAuthCode(authCode) } - 注册时机:如果Dart还没注册回调,
SpotifyAPICallback.instance会返回null,所以一定要先调用setupSpotifyCallback()再触发原生授权。 - 版本兼容:确保使用最新稳定版的Pigeon,旧版本可能存在回调注册的bug。
内容的提问来源于stack exchange,提问作者bufferking
相关产品推荐
相关产品推荐

