ToB企服应用市场:ToB评测及商务社交产业平台

标题: 10天学会flutter DAY9 flutter自定义组件Plugin [打印本页]

作者: tsx81428    时间: 2022-6-24 17:59
标题: 10天学会flutter DAY9 flutter自定义组件Plugin
玩转 自定义组件Plugin



前言

在Flutter中,如果我们需要打印日志,如果不进行自定义,我们只能使用自带的print()或者debugPrint()方法进行打印,
但是这两种打印,日志都是默认Info层级的日志,很不友好,所以如果需要日志打印层级分明,我们就需要自定义一个
日志打印组件,但是我希望这个打日志的组件也可以以后在其他项目里直接拿来使用.这就需要我们来开发一个日志的插件了,
再比如我们想在Flutter里面获取Android设备的信息,或者就是想用Native实现一个功能,然后能在Flutter里面使用. 等等…
什么是插件

在flutter中,一个插件叫做一个package,使用packages的目的就是为了达到模块化,可以创建出可被复用和共享的代码,
这和大多数编程语言中的模块、包的概念相同。创建出来的package可以在pubspec.yaml中直接依赖。
一个最小化的package包含了两部分:

   注意:.dart这个文件必须存在,因为这是方便使用的人快速import这个package来使用它,可以把它理解成一种必须要遵守的规则。
  package的种类

package可以分为两种:纯dart代码的package和带有特定平台代码的package。

   上面应该很好理解,可以理解成java jar包和Android sdk的区别。而要开发的日志插件就是第二种。
  开发步骤

开发 Dart packages

要创建Dart包,请使用–template=package 来执行 flutter create
flutter create --template=package hello
这将在hello/文件夹下创建一个具有以下专用内容的package工程:

开发 plugin packages

Step 1: 创建 package


flutter create --org com.example --template=plugin hello

flutter create --template=plugin -i swift -a kotlin hello
Step 2: 实现包 package


在Android Studio中编辑Android平台代码之前,首先确保代码至少已经构建过一次(例如,从IntelliJ运行示例应用程序或在终端执行cd hello/example; flutter build apk)
您可以通过按下 ▶ 按钮从Android Studio运行示例应用程序.

添加文档

建议将以下文档添加到所有软件包:
发布 packages

一旦你实现了一个包,你可以在Pub上发布它 ,这样其他开发人员就可以轻松使用它
在发布之前,检查pubspec.yaml、README.md以及CHANGELOG.md文件,以确保其内容的完整性和正确性。
然后, 运行 dry-run 命令以查看是否都准备OK了:
flutter packages pub publish --dry-run
最后, 运行发布命令:
flutter packages pub publish
Plugin 通信原理




   实际上,Flutter的上层能力都是Engine提供的。Flutter正是通过Engine将各个Platform的差异化抹平。而我们今天要讲的Plugin,正是通过Engine提供的Platform Channel实现的通信。
  

通过上图,我们看到Flutter App是通过Plugin创建的Platform Channel调用的Native APIs。
Platform Channel:

   PS:消息编解码器,是JSON格式的二进制序列化,所以调用方法的参数类型必须是可JSON序列化的。
PS:方法调用,也可以反向发送调用消息。
  

三种Channel之间互相独立,各有用途,但它们在设计上却非常相近。每种Channel均有三个重要成员变量:

下表显示了如何在宿主上接收Dart值,反之亦然:
DartAndroidiOSnullnullnil (NSNull when nested)booljava.lang.BooleanNSNumber numberWithBool:intjava.lang.IntegerNSNumber numberWithInt:int, if 32 bits not enoughjava.lang.LongNSNumber numberWithLong:int, if 64 bits not enoughjava.math.BigIntegerFlutterStandardBigIntegerdoublejava.lang.DoubleNSNumber numberWithDouble:String java.lang.StringNSStringUint8Listbyte[]FlutterStandardTypedData typedDataWithBytes:Int32Listint[]FlutterStandardTypedData typedDataWithInt32:Int64Listlong[]FlutterStandardTypedData typedDataWithInt64:Float64Listdouble[]FlutterStandardTypedData typedDataWithFloat64:Listjava.util.ArrayListNSArrayMapjava.util.HashMapNSDictionary总结


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4