前言
flutter开发中,不可避免要使用原生的东西,比如,我们要调用原生自定义的相机,就会涉及到和flutter和native的通信等问题
Flutter和native通信方式
1.不通过插件
直接在flutter目录中,分别在android和iOS目录,直接定义就可以了,然后通过MethodChannel来注册通信即可
这种方式缺点也比较明显,比如不利于解耦,导致这2个子目录臃肿,修改起来也很麻烦,
2.通过插件的形式
插件相当于第三方库文件,具体的创建的过程就不再赘述了,我相信大部分同学都可以完成这一步,可以看下图
这种方式的优点有很多,比如不会在冗杂在主目录下的android和iOS目录中,在主目录下,单独建立一个plugins目录,所有的插件都在这个目录下进行开发,也方便打成插件包给其他工程使用等等。
注意事项
我们在开发Android插件的时候,直接在插件中的Android目录下,走Android正常的开发流程即可,如图
但是,在iOS目录中,我们需要在.podspec文件中指定我们需要编译的文件,和相关资源配置等
下面来看看.podspec文件中的配置(podspec文件相当于Android中的gradle文件)
#
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
s.name = 'take_picture_plugin'
s.version = '0.0.1'
s.summary = 'take picture by camera plugin.'
s.description = <<-DESC
A new Flutter plugin.
DESC
s.homepage = 'http://example.com'
s.license = { :file => '../LICENSE' }
s.author = { 'Your Company' => 'email@example.com' }
s.source = { :path => '.' }
s.source_files = 'Classes/**/*'
s.public_header_files = 'Classes/**/*.h'
s.resources = ['Classes/*.png']
s.dependency 'Flutter'
s.ios.deployment_target = '8.0'
end
上面的配置名称顾名思义很简单,当我们需要其他配置的时候,可以去http://guides.cocoapods.org/syntax/podspec.html查看
比如,如果你要插件中使用本地图片,就需要引入图片资源到iOS插件后,你才能使用本地图片,可以通过spec.resources = ['Images/*.png']来配置,也可以通过bundle等,引入外部第三方库,可以通过s.dependency来配置。
当我们配置完iOS插件中的podspec后,发现配置并没有生效,无论我们如何在android studio进行操作,原因就是podspec文件的执行需要用到mac 中pod命令,所以,我们就必须通过pod install来让它生效,使用mac Terminal,cd进入到插件中example目录,再进入到iOS目录,使用pod install 即可让podspec配置生效。
总结
记住你一定要用pod install走一遍,这个问题困扰了我好几个小时