关于flutter:Flutter插件开发指南01-通道Channel的编写与实现

32次阅读

共计 5698 个字符,预计需要花费 15 分钟才能阅读完成。

Flutter 插件开发指南 01: 通道 Channel 的编写与实现

视频
https://www.bilibili.com/video/BV1ih4y1E7E3/
前言
本文将会通过一个加法计算,来实现 Channel 的双向通信,让大家有个一个领会。

Flutter 插件
Flutter 插件是 Flutter 应用程序与原生平台之间的桥梁,使得 Flutter 应用程序能够与原生代码进行交互,从而扩大 Flutter 应用程序的性能和能力。Flutter 插件通常包含 Dart 和原生代码(例如 Java、Kotlin 或 Objective-C、Swift 等),并能够通过 Flutter 插件框架来注册、治理和调用。
在整个 Flutter 架构中,Flutter 插件具备十分重要的作用和重要性。以下是 Flutter 插件在 Flutter 架构中的一些重要作用:

扩大 Flutter 应用程序的性能:Flutter 插件能够提供许多原生平台的性能和能力,例如拜访原生设施 API、拜访原生 UI 组件等。通过应用 Flutter 插件,Flutter 应用程序能够取得更多的性能和能力,从而能够更好地满足用户需要。进步 Flutter 应用程序的性能:通过应用 Flutter 插件,Flutter 应用程序能够通过原生平台 API 来执行某些工作,从而能够进步应用程序的性能和响应速度。例如,应用原生平台的图像处理库来解决大量图像数据。与原生代码进行交互:Flutter 插件能够使 Flutter 应用程序与原生代码之间进行双向通信,从而能够让 Flutter 应用程序与原生平台进行无缝集成。这对于须要与现有原生应用程序集成的 Flutter 应用程序来说尤为重要。促成 Flutter 生态系统的倒退:Flutter 插件能够提供许多不同类型的性能和能力,例如拜访原生设施传感器、拜访原生广告库等。通过将这些插件共享给其余 Flutter 开发者,Flutter 插件能够促成 Flutter 生态系统的倒退和壮大,使得更多的开发者可能应用 Flutter 来构建高质量的应用程序。
Channel 通道

Channel 是 Flutter 应用程序与原生平台之间进行通信的桥梁。Flutter 应用程序和原生平台能够通过 Channel 来替换音讯和数据,从而实现双向通信。Flutter 插件通常蕴含一个或多个 Channel,用于与原生代码交互。
Channel 在 Flutter 插件开发中的作用有以下几个方面:

提供双向通信:Channel 提供了 Flutter 应用程序与原生平台之间进行双向通信的能力。Flutter 应用程序能够向原生平台发送音讯和数据,原生平台也能够向 Flutter 应用程序发送音讯和数据。治理办法调用:Channel 能够用于治理 Flutter 应用程序和原生平台之间的办法调用。Flutter 应用程序能够通过 Channel 调用原生平台的办法,原生平台也能够通过 Channel 调用 Flutter 应用程序的办法。实现数据传输:Channel 能够用于在 Flutter 应用程序和原生平台之间传输数据。Flutter 应用程序能够通过 Channel 向原生平台发送数据,原生平台也能够通过 Channel 向 Flutter 应用程序发送数据。扩大 Flutter 应用程序的性能:通过应用 Channel,Flutter 应用程序能够拜访原生平台的性能和能力,例如拜访原生设施 API、拜访原生 UI 组件等。这能够扩大 Flutter 应用程序的性能和能力,从而能够更好地满足用户需要。

原文 https://ducafecat.com/blog/flutter-plugin-channel

参考
https://docs.flutter.dev/packages-and-plugins/developing-pack…
步骤
第一步:创立插件
应用 Android Studio 创立插件

我的项目类型 plugin
选的语言是 java object-c
平台选了所有 all

创立实现后

目录、文件名
阐明

ios
原生

android
原生

linux
原生

macos
原生

windows
原生

lib/flutter_plugin_add_platform_interface.dart
性能接口定义

lib/flutter_plugin_add_method_channel.dart
原生性能接口实现

lib/flutter_plugin_add_web.dart
Web 性能接口实现

lib/flutter_plugin_add.dart
flutter 接口调用类

第二步:编写 android 代码
首先咱们用模拟器把 android 我的项目运行下,让 android gradle 主动拉取依赖。
抉择 example 来运行。

关上我的项目的正确目录是 example/android,而不是根目录的 android,否则依赖包认不出。

关上后能失常认出

如果认不出能够清下缓存

选取革除历史和缓存文件

编写加法计算
android/src/main/java/com/ducafecat/flutter_plugin_add/FlutterPluginAddPlugin.java
  @Override  public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {if (call.method.equals(“getPlatformVersion”)) {result.success(“Android ” + android.os.Build.VERSION.RELEASE);    }    // add    else if (call.method.equals(“add”)) {int a = call.argument(“a”);      int b = call.argument(“b”);      int sum = add(a, b);      result.success(sum);    }    else {result.notImplemented();    }  }

Flutter 应用程序通过 MethodChannel 向原生平台发送办法调用申请时。原生平台收到 Flutter 应用程序的办法调用申请后,依据申请的办法名执行相应的办法后,将执行后果返回给 Flutter 应用程序。

  private int add(int a, int b) {return a + b;}
第三步:编写 flutter 接口代码
接口配置
pubspec.yaml
  plugin:    platforms:      android:        package: com.ducafecat.flutter_plugin_add        pluginClass: FlutterPluginAddPlugin      ios:        pluginClass: FlutterPluginAddPlugin      linux:        pluginClass: FlutterPluginAddPlugin      macos:        pluginClass: FlutterPluginAddPlugin      windows:        pluginClass: FlutterPluginAddPluginCApi      web:        pluginClass: FlutterPluginAddWeb        fileName: flutter_plugin_add_web.dart

platforms 局部定义了 Flutter 插件在以下不同平台上的反对:

android:定义了 Flutter 插件在 Android 平台上的反对,包含插件的 Java 包名和插件的类名。ios:定义了 Flutter 插件在 iOS 平台上的反对,包含插件的类名。linux:定义了 Flutter 插件在 Linux 平台上的反对,包含插件的类名。macos:定义了 Flutter 插件在 macOS 平台上的反对,包含插件的类名。windows:定义了 Flutter 插件在 Windows 平台上的反对,包含插件的类名和插件的 C API 实现。web:定义了 Flutter 插件在 Web 平台上的反对,包含插件的类名和插件的文件名。

编写接口定义
lib/flutter_plugin_add_platform_interface.dart
  Future<int?> add(int a, int b) {throw UnimplementedError(‘add() has not been implemented.’);  }
原生端接口调用
lib/flutter_plugin_add_method_channel.dart
  @override  Future<int?> add(int a, int b) async {final val = await methodChannel.invokeMethod<int>(      ‘add’,      <String, int>{        ‘a’: a,        ‘b’: b,},    );    return val;  }
flutter 接口调用类
lib/flutter_plugin_add.dart
  Future<int?> add(int a, int b) {return FlutterPluginAddPlatform.instance.add(a, b);  }
第四步:编写测试例子
example/lib/main.dart
class _MyAppState extends State<MyApp> {int addResult = 0;
  @override  Widget build(BuildContext context) {return MaterialApp(      home: Scaffold(        appBar: AppBar(          title: const Text(‘Plugin example app’),        ),        body: Center(child: Column(            children: [              Text(‘Running on: $_platformVersion\n’),              // 加法              Text(‘add: $addResult’),              ElevatedButton(onPressed: () async {int? val = await _flutterPluginAddPlugin.add(addResult, 1);                  setState(() {                    addResult = val ?? -1;});                },                child: const Text(‘add’),              ),            ],          ),        ),      ),    );  }

_flutterPluginAddPlugin.add 的形式调用咱们写的接口

第五步:编写 ios 代码
运行下 ios 主动拉取包,或者手动 pod 拉包
$ cd ios$ pod install
应用 xcode 关上 example / ios 目录

关上插件代码

写入加法代码
ios/Classes/FlutterPluginAddPlugin.m
– (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {if ([@”getPlatformVersion” isEqualToString:call.method]) {result([@”iOS ” stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);  }    else if ([@”add” isEqualToString:call.method]) {int a = [call.arguments[@”a”] intValue];      int b = [call.arguments[@”b”] intValue];      result(@(a + b));  }  else {result(FlutterMethodNotImplemented);  }}
运行测试

代码
https://github.com/ducafecat/flutter_develop_tips/tree/main/flutter_plugin_add
小结
Flutter 插件在 Flutter 利用程序开发中具备十分重要的作用和重要性,Flutter 开发者应该相熟和把握 Flutter 插件的开发和应用。
大家须要留神这几点:

插件 channel 执行过程如何正确的关上原生我的项目 android ios 源码地位哪些重要的函数 flutter 中如何配置接口 flutter 中编写接口定义代码
感激浏览本文
如果我有什么错?请在评论中让我晓得。我很乐意改良。

© 猫哥
ducafecat.com
end

正文完
 0