上篇怎么说了Flutter的数据通信简单流程,这次我们基于此写一个plugin实现省会选择器
下面我们我们梳理一下创建过程:
我们使用idea进行创建项目(想学习命令行的自行查阅),此处就略过啦,直接开始实践:此处我们略过iOS直接来Android
此处我们分成三部分:
1 dart文件实现调用和监听回调
2 配置Android原生依赖library
3 进行plugin桥接
好了我们开始
1 dart文件负责调用
对于flutter调用原生其实是内部的channel负责传递和回调的(底层C++实现不在我们讨论的范围之内)
由于flutter是通过channel进行调用和监听的,而内部是怎么区分不同的channel和进行调用呢?答案是channel的名称和方法名称字符串,因此只需要知道第三方库的通信标志和调用方法名即可实现调用。因此1是非必须的,但是为了方便用户调用此处又是必须的……
2 Android依赖
由于我们的用户大多是iOS开发者,此处我们也就不多说啦
3我们只需细说桥接部分,因为跨平台之所以为跨平台一个很好的原因就是流程和逻辑是共通的……对于我们程序员和工程师来说对于流程和整体的感知是必不可少的……
1 2 3我们就不细说啦,专注说一下其中的踩坑:
坑1:
关于回调:
对于对plugin有兴趣的都看过实例电量获取,感觉一招吃天下啦。刚开始我也是按照这个执行的,成功的出现了wheel选择功能,但是选择数据之后crash?
为甚呢?这是因为你不能长时间的持有Result,它们会的回调之后立即释放掉,你需要使用channel的invoke从原生回调flutter来进行通信
坑2:
发布:
为啥发布到平台需要Google,这对于天朝的我们是多么大的一个屏障啊!!!
因此只能选择不能使用或者使用git啦
好啦,现在就说一下怎么使用我们的选择器
province_provider:
git:
url: git@github.com:skeyboy/provinece_picker.git
tag: 0.0.1
Init
导包
import 'package:province_provider/province_provider.dart';
初始化
ProvinceProvider provinceProvider = new ProvinceProvider();
provinceProvider.provinceCallback(_handler);
Future<dynamic> _handler(MethodCall methodCall){
if(methodCall.method == "provinceResult"){
Map<dynamic, dynamic> result = methodCall.arguments;
var type = result["type"];
if(type == "province"){
setState(() {
Map<dynamic, dynamic> info = result["value"];
_platformVersion = "$info";
});
}
}
return Future.value(true);
}
Call
Future<void> show() async {
String platformVersion = "None";
final dynamic result = await provinceProvider.showProvinceProvider("选择籍贯");
setState(() {
_platformVersion = "$locationInfo";
});
到此就是一个完整的使用啦………