Flutter Packages & Plugins(三)

Flutter Packages & Plugins.

Posted by 杨小狼不吃羊 on 2020-10-29
Words 865 and Reading Time 3 Minutes
Viewed Times

Flutter Packages & Plugins(三)

在前两篇中我们分别学习了package的从创建到发布流程和Android平台的实现原理,这一篇我将结合实际工作实践插件开发。

在pub平台上,目前已经有大量可供Flutterk开发使用的库,例如可供网络请求的dio,用于json解析的json_annotation,json_serializable,xml解析的xml库,以及toastpath_provider等,能够满足我们的开发需求,但对于实现我们公司自己的相关业务,仍旧需要我们自己封装,gprs_convertxdja_bridge就是为了解决该问题而开发的。

1. gprs_convert

做过警务通的同学应该都知道jwt gprs server协议,在之前的项目中我们封装了java层对该协议的支持,如果使用Flutter开发警务通项目,就不可避免的需要使用到该协议,这时候如果继续使用java层的代码就不合适了,因此我做了dart层的实现,可以完成从dart对象到xml字符串的转换和从xml字符串到dart对象的解析。
下面是最常用的查询协议的实现
20201103000232-WX20201103-000211
具体使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Future<QueryResponse> queryTest() async {
QueryResponse queryResponse;
try {
QueryRequest queryRequest = QueryRequest();
queryRequest.appKey = '123';
queryRequest.reqDigest = '交通管理';
queryRequest.sessionID = Globals.loginResponse?.sessionID;
queryRequest.beginNo = '1';
// queryRequest.reqType = 'zhcx_czrk';
// queryRequest.addCondition('c_xm', '李刚',
// relation: RelationCharExpression.rightLike);
queryRequest.reqType = 'dxcx_czrk';
queryRequest.addCondition('c_sfzh', '410185198701281039');
// var request = queryRequest.buildXml();
var request = GprsConvert.convertToXml(queryRequest);
print('request:$request');
var response =
await Bridge.gprsServerRequest("192.168.20.152", "2003", request);
// var response = await rootBundle.loadString('data/query_response.xml');
print('response:$response');
// var queryRespon = QueryResponse.parseXml(response);
queryResponse = GprsConvert.parseXml(response, QueryResponse());
print(queryResponse.type);
} on PlatformException catch (e, s) {
print('Stack trace:\n ${e.message}');
}
return queryResponse;
}

2. xdja_bridge

xdja_bride是针对统一认证获取票据、获取安全卡id、执行socket请求的封装。

2.1 dart层

20201103000649-WX20201102-221601

2.2 android层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
private fun getSafeCardId(@NonNull result: Result) {
var cardId = VpnApi50Impl(context).cardID
if (!TextUtils.isEmpty(cardId)) {
result.success(cardId)
} else {
result.error("", "获取安全卡id失败", null)
}
}

private fun getUaacToken(@NonNull result: Result) {
UaacApi.getToken(context, object : TokenCallback {
override fun onSuccess(token: String?, isSafeClientConnected: Boolean) {
result.success(token)
}

override fun onError(errorMsg: String?) {
result.error("", errorMsg, null)
}
})
}

private fun uaacLogout(@NonNull result: Result) {
var flag = UaacApi.logoutUaac(context)
if (flag != 0) {
result.success(true)
} else {
result.error("", "统一认证失败,无删除token权限", null)
}
}

private fun getPlatformVersion(@NonNull result: Result) {
result.success("Android ${android.os.Build.VERSION.RELEASE}")
}

private fun gprsServerRequest(@NonNull call: MethodCall, @NonNull result: Result) {
var ip = call.argument<String>("ip")
var port = call.argument<String>("port")
var request = call.argument<String>("request")
var socketManager = SocketManager(ip, port)
AppExecutors.getInstance().networkIO.execute {
var response = socketManager.execute(request)
// 解析返回结果
CErrorInfo.paserErrorMsg(response)
AppExecutors.getInstance().mainThread.execute {
if (!CErrorInfo.isError) {
result.success(response)
} else {
result.error(CErrorInfo.code, CErrorInfo.message, null)
}
}
}

}

3. 问题和思考

在Android平台经过常年的积累,我们已经有大量的公共组件,一时想用flutter来进行实际项目的开发,仍会面临很多的问题,例如我demo中使用socket进行网络请求,而警务通也有更多的项目对接到服务总线,对警务通常用的UI组件仍旧缺失,仍需大量的工作。
从长远来看,flutter对跨平台的支持越来越完善,如果我们能充分利用现有的开发人员,完善相关平台插件的开发,例如统一认证桌面端和android端,安全卡操作相关的业务,未来我们完全可以实现一套代码各个平台运行,缩短项目的使用周期,实现更高的工作效率。


This is copyright.

...

...

00:00
00:00