美文网首页
2023-06-25 fair报错Tag:Subar.ifEqu

2023-06-25 fair报错Tag:Subar.ifEqu

作者: 我是小胡胡123 | 来源:发表于2023-06-24 17:22 被阅读0次

先看几个报错:
Failure
Tag:Subar.ifEqualBool
Failure
Tag: Text

Simulator Screen Shot - iPhone 14 Pro - 2023-06-25 at 17.16.40.png Simulator Screen Shot - iPhone 14 Pro - 2023-06-25 at 17.17.10.png Simulator Screen Shot - iPhone 14 Pro - 2023-06-25 at 17.18.04.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": {
}
}

就解决了报错问题:

Simulator Screen Shot - iPhone 14 Pro - 2023-06-25 at 17.20.58.png Simulator Screen Shot - iPhone 14 Pro - 2023-06-25 at 17.20.51.png

相关文章

网友评论

      本文标题:2023-06-25 fair报错Tag:Subar.ifEqu

      本文链接:https://www.haomeiwen.com/subject/tsubydtx.html