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

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

作者: 我是小胡胡分胡 | 来源:发表于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