flutter pigeon如何使用

在Flutter项目中使用Pigeon时遇到了一些问题:

  1. 如何配置Pigeon的基本环境?需要安装哪些依赖?
  2. Pigeon生成的代码应该放在什么目录下比较合适?
  3. 如何定义Pigeon的接口文件?有没有具体的示例可以参考?
  4. 在Android和iOS平台上,如何正确调用Pigeon生成的代码?
  5. 调试时遇到"Unhandled Exception"错误,该如何排查和解决?
    希望能得到详细的步骤说明或示例代码,谢谢!
2 回复

Flutter Pigeon 用于生成平台间通信代码。步骤:1. 编写 Pigeon 文件定义接口;2. 运行 flutter pub run pigeon 生成代码;3. 在 Flutter 和原生端实现接口。

更多关于flutter pigeon如何使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Flutter Pigeon 是用于在 Flutter 和原生平台(Android/iOS)之间生成类型安全通信代码的工具。以下是基本使用步骤:

1. 添加依赖

pubspec.yaml 中添加:

dev_dependencies:
  pigeon: ^10.0.0

2. 创建 Pigeon 定义文件

新建 pigeons/message.dart

import 'package:pigeon/pigeon.dart';

class SearchRequest {
  String? query;
}

class SearchReply {
  String? result;
}

@HostApi()
abstract class SearchApi {
  SearchReply search(SearchRequest request);
}

3. 生成代码

运行命令生成通信代码:

flutter pub run pigeon \
  --input pigeons/message.dart \
  --dart_out lib/pigeon_api.dart \
  --objc_header_out ios/Runner/pigeon.h \
  --objc_source_out ios/Runner/pigeon.m \
  --java_out android/app/src/main/java/com/example/app/Pigeon.java \
  --java_package "com.example.app"

4. 实现原生端

Android (在 MainActivity 中):

import com.example.app.Pigeon;

public class MainActivity extends FlutterActivity {
  private class SearchApiImpl implements Pigeon.SearchApi {
    @Override
    public Pigeon.SearchReply search(Pigeon.SearchRequest request) {
      Pigeon.SearchReply reply = new Pigeon.SearchReply();
      reply.setResult("Received: " + request.getQuery());
      return reply;
    }
  }

  @Override
  public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    Pigeon.SearchApi.setup(flutterEngine.getDartExecutor(), new SearchApiImpl());
  }
}

iOS (在 AppDelegate.swift 中):

import Flutter

class SearchApiImpl: NSObject, SearchApi {
  func search(_ request: SearchRequest) -> SearchReply {
    let reply = SearchReply()
    reply.result = "Received: \(request.query ?? "")"
    return reply
  }
}

@UIApplicationMain
class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    let controller = window?.rootViewController as! FlutterViewController
    SearchApiSetup.setUp(binaryMessenger: controller.binaryMessenger, api: SearchApiImpl())
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

5. Flutter 端调用

在 Flutter 中使用生成的接口:

import 'pigeon_api.dart';

final api = SearchApi();
final request = SearchRequest()..query = 'Hello';
final response = await api.search(request);
print(response.result); // 输出:Received: Hello

主要特点:

  • 类型安全,避免手动处理 JSON
  • 支持异步调用
  • 自动生成双向通信代码

确保在生成代码后重新编译项目。通过这种方式,可以高效地在 Flutter 和原生代码之间进行类型安全的通信。

回到顶部