flutter pigeon自动生成代码工具使用

在看flutter boost源码过程中,看到一个messages.m的文件,在文件的开头有这么一行注释

arduino 复制代码
// Copyright (c) 2019 Alibaba Group. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.
// Autogenerated from Pigeon (v3.2.9), do not edit directly.
// See also: https://pub.dev/packages/pigeon

由此看看来这是一个通过pigeon工具自动生成的代码。 因此研究一下pigeon的简单使用过程。

Flutter Pigeon pub.dev/packages/pi... 是一个用于在Dart和原生代码(如Android和iOS)之间进行通信的库。它通常用于在Flutter应用程序和原生平台之间传递数据和调用方法。

以下是使用Flutter Pigeon的一般流程:

创建插件:

css 复制代码
flutter create --template=plugin  --platforms=ios,android  test_flutter_plugin -i objc -a java

添加pigeo开发包

yaml 复制代码
dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^2.0.0
  pigeon:

添加源码

跟lib目录同一个级,新建一个pigeo文件夹,这里面放接口文件,将来pigeo生成工具,就用这些接口文件来生成代码:

文件名为:message.dart

kotlin 复制代码
import 'package:pigeon/pigeon.dart';

@HostApi()
abstract class AppNativeApi {
  String? getHost();

  String? getBrokerId();
}

编写pigeo代码生成脚本

脚本文件名为run_pigeon.sh

css 复制代码
 flutter pub run pigeon \
  --input pigeon/message.dart \
  --dart_out lib/message.dart \
  --objc_header_out ios/Classes/message.h \
  --objc_source_out ios/Classes/message.m \
  --java_out android/src/main/java/com/example/test_flutter_plugin/Message.java \
  --java_package "io.flutter.plugins"
 

运行脚本

复制代码
sh  run_pigeon.sh

这样我们就通过一个接口文件,生成了代码:

初始化代码

这里我们在插件中初始化

objectivec 复制代码
#import "message.h"
 
@interface TestFlutterPlugin () <AppNativeApi>
@end

@implementation TestFlutterPlugin
 

+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
    FlutterMethodChannel *channel = [FlutterMethodChannel
                                     methodChannelWithName:@"test_flutter_plugin"
                                     binaryMessenger:[registrar messenger]];
    TestFlutterPlugin *instance = [[TestFlutterPlugin alloc] init];
    [registrar addMethodCallDelegate:instance channel:channel];
    
    AppNativeApiSetup([registrar messenger], instance);
   
}


- (nullable NSString *)getBrokerIdWithError:(FlutterError * _Nullable __autoreleasing * _Nonnull)error {
    return @"123";
}

- (nullable NSString *)getHostWithError:(FlutterError * _Nullable __autoreleasing * _Nonnull)error {
    return @"10.253.22.122";
}


@end

使用代码

scala 复制代码
import 'package:flutter/material.dart';
import 'package:test_flutter_plugin/message.dart';

class TestPigeon extends StatefulWidget {
  const TestPigeon({super.key});

  @override
  State<TestPigeon> createState() => _TestPigeonState();
}

class _TestPigeonState extends State<TestPigeon> {
  String? host;
  String? brokerId;

  @override
  void initState() {
    super.initState();
    loadData();
  }

  Future<void> loadData() async {
    brokerId = await AppNativeApi().getBrokerId();
    setState(() {});

    host = await AppNativeApi().getHost();
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView(
        children: [
          Text('$brokerId'),
          Text('$host'),
        ],
      ),
    );
  }
}

总结

本文通过使用 pigeon,编写一个简单的dart实现的接口文件,就可以自动生成native 和 flutter之间通信的一个通道。

通过在flutter端调用通道的api(pigeon自动生成的),就可以获取native端的数据。

相关推荐
好的佩奇1 小时前
蓝牙之通信架构
android·flutter·蓝牙
yujunlong391912 小时前
[特殊字符] Serverpod 4.1.0 全栈项目开发与 Docker 部署规范文档
flutter·docker·serverpod
FungLeo13 小时前
成为全栈·Go 后端篇·换后端不改前端:四个客户端如何做兼容回归
flutter·golang·go·成为全栈·兼容测试·taro 小程序
恋猫de小郭15 小时前
Flutter Android 性能修复:8 个大核的手机,Raster 居然只跑在 2 个核上?
android·flutter
恋猫de小郭2 天前
感人,Flutter 居然有了一个超实用提案,期待落地
android·前端·flutter
好的佩奇2 天前
Dart 之增强枚举
android·flutter·dart
好的佩奇2 天前
蓝牙之无线电与通信距离
android·flutter·蓝牙
程序员老刘·4 天前
从短剧App的bug看响应式编程在AI时代的优势
flutter·ai编程·跨平台开发
传奇开心果编程4 天前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
程序员老刘4 天前
从短剧App的bug看响应式编程在AI时代的优势
flutter·ai编程·客户端