先看几个报错:
Failure
Tag:Subar.ifEqualBool
Failure
Tag: Text
![](https://img.haomeiwen.com/i45726/eb95eaee54d319d8.png)
![](https://img.haomeiwen.com/i45726/2d0375366a32c6cb.png)
![](https://img.haomeiwen.com/i45726/a17fc9f80f4dfd04.png)
看一下官方文档,Fair plugin使用简介 部分: https://fair.58.com/zh/f....
检查本地flutter版本和切换到对应的fair_version版本。
dependency_overrides:
# fair_version: ^3.0.0+2
fair_version:
git:
url: https://github.com/wuba/fair.git
ref: main
path: flutter_version/flutter_3_3_0
都一样报错。说明不是官方支持问题。
最后发现是不是 assets/plugin/xx.js文件写错 了
会影响到语法糖解析
plugin是为了扩展一些公共的功能,为了我们使用fair可以使用一些fair无法实现的功能,通过js层面去内置到app中去实现更多丰富的功能
1、plugin接入文件拷贝
1.添加fair_basic_config.json至assets目录下
fair_basic_config.json实现:
//添加需要交互的plugin js文件路径
{
"plugin": {
"fair_basic_plugin": "assets/plugin/fair_basic_plugins.js"
}
}
2.在assets目录下新建plugin文件夹,添加fair_basic_plugins.js文件(具体文件见fair example)
fair_basic_plugins.js文件实现:
//当前文件所在目录不能忘记在pubspec.yaml中声明
//用户自定义拓展,需要在fair_basic_config.json中注册
//fair_basic_config.json文件所在目录不能忘记在pubspec.yaml中声明
//会在基础js加载之后加载
let FairBasicPluginCallBack = {};
let FairBasicPluginCallBackId = 0;
//变量名需要与flutter中的plugin类名保持一致
let FairBasicPlugin = function() {
return {
mFairPluginId: 0,
call: function (params) {
console.log('----------------------------');
let respMap = {};
respMap = mapOrSetToObject(params);
var id = 'FairBasicPlugin$' + (++FairBasicPluginCallBackId);
let paramsMap = {};
FairBasicPluginCallBack[id] = respMap['args']['response'];
paramsMap['className'] = "FairBasicPlugin#call";
paramsMap['funcName'] = 'invokePlugin';
paramsMap['pageName'] = respMap['pageName'];
paramsMap['id'] = id;
paramsMap['args'] = respMap['args'];
let map = JSON.stringify(paramsMap);
console.log('FairBasicPlugin 请求参数:' + map);
invokeFlutterCommonChannel(map, (resultStr) => {
let responseMap = JSON.parse(resultStr);
let data = responseMap['response'];
let id = responseMap['id'];
//这两个函数用户拓展的
if (FairBasicPluginCallBack[id] === null) {
return;
}
FairBasicPluginCallBack[id](data);
});
}
};
}
3.在pubspec.yaml文件中声明需要使用的文件路径
assets:
- assets/
- assets/plugin/
2、注册plugin
FairApp.runApplication(
FairApp(
child: MyApp(),
),
///需要在此注册需要全局使用的plugin,key名可以随意不做要求
plugins: {
"FairBasicPlugin": FairBasicPlugin(),
},
);
3、plugin的使用
以下使用打电话举例,plugin的类名需要与js中的变量名保持一致, 重写getRegisterMethods注册需要使用到的方法
///此处类名需要与js中变量名保持一致
class FairBasicPlugin extends IFairPlugin {
static final FairBasicPlugin _fairXPlugin = FairBasicPlugin._internal();
FairBasicPlugin._internal();
factory FairBasicPlugin() {
return _fairXPlugin;
}
Future<bool> _makePhoneCall(String phoneNumber) async {
final Uri launchUri = Uri(
scheme: 'tel',
path: phoneNumber,
);
return await launchUrl(launchUri);
}
Future<dynamic> call(map) async {
print('FairXPlugin pluginRequest');
if (map == null) {
return;
}
var req;
bool isDart;
if (map is Map) {
isDart = true;
req = map;
} else {
isDart = false;
req = jsonDecode(map);
}
var args = req['args'];
var pageName = req['pageName'];
var id = req['id'];
var responseCallback = args['response'];
var type = args['type'];
switch(type) {
case 'Call':
var phoneNumber = args['phoneNumber'];
var result = await canLaunchUrl(Uri(scheme: 'tel', path: phoneNumber));
if (result) {
var value = await _makePhoneCall(phoneNumber);
if (isDart) {
responseCallback?.call(value);
} else {
var resp = {
'pageName': pageName,
'id': id,
'response': value,
};
return Future.value(jsonEncode(resp));
}
} else {
throw 'Could not call $phoneNumber';
}
break;
}
return Future.value();
}
///注册需要被识别的方法名
@override
Map<String, Function> getRegisterMethods() {
var functions = <String, Function>{};
functions.putIfAbsent('call', () => call);
return functions;
}
}
4、fairwidget中使用plugin
以下为固定写法,在fairwidget声明一个方法,在方法中调用plugin中注册的方法,运行时fair js会自动识别绑定, response为js中写死的回调方法,特殊实现可以修改plugin js文件,一般情况无需修改.
callPhone(){
FairBasicPlugin().call({
'pageName': '#FairKey#',
'args': {
'type': 'Call',
'phoneNumber': '15800342502',
'response': (data) {
print('response = $data');
}
}
});
}
那么通过修改fair_config.json
{
"plugin": {
}
}
就解决了报错问题:
![](https://img.haomeiwen.com/i45726/3bb41e0e6e0221c6.png)
![](https://img.haomeiwen.com/i45726/ae1c5449db2acf9e.png)
网友评论