Hybrid开发 Vue和Native交互

2019-06-19  本文已影响0人  妖苔

Native调用H5

其中javascript:scanResult('扫描结果')", s -> {Log.e("xxx", "返回了点啥啊")javascript为固定前缀,scanResult为Vue/Js提供的方法,第二个参数为lamd表达式完整写法如下

    webView.evaluateJavascript("javascript:scanResult('扫描结果')", new ValueCallback<String>() {
        @Override
        public void onReceiveValue(String s) {
            //处理逻辑
        }
    });

若要将Vue/Js中方法暴露给Native调用需要在Vue/Js中使用mounted组件注入方法具体使用方法如下

    <script type="text/javascript">
    var vm = new Vue({
        el: '#app',
        data: {
            counter: 1
        },
        //Native调用Vue:第二步:注入方法
        mounted() {
            window.scanResult = this.scanResult
        },
         //Native调用Vue:第一步:创建方法
        methods: {
            scanResult (str) {
                alert('zz')
                return "js调用成功"
            }
        }
    });
    vm.$watch('counter', function(nval, oval) {
        alert('计数器值的变化 :' + oval + ' 变为 ' + nval + '!');
    });
    setTimeout(
        function(){
            vm.counter += 20;
        },10000
    );
    </script>

至此Native则可以通过evaluateJavascript方法调用Vue/Js中方法

H5调用Native

Native再通过mWebView.addJavascriptInterface(new JSInterface(), "Android");注入,则该Native接口中方法均可在H5中调用。
以上所有内容成立的前提是WebView进行了JS支持等设置。
调用示例

    <div id="app" @click="window.Android.getCamera()" style="font-size:25px;">
      <p style="font-size:25px;">计数器: {{ counter }}</p>
      <button>点我</button>
    </div>

额 好像没法上传文件呢(⊙o⊙)?\

补充:若Native调用Js中某个方法,而该Js方法又调用了Native方法,那么Native调用Js成功而Js调用Native中方法将失败。
解决方法:将Js中调用Native的部分代码单独抽取成一个Js方法。
可能原因:类似Js调用Native,相当于将某个对象注入Window下,相同的Native调用Native可能也是将该方法当成整体对象拿了过来故无法找到Native中方法。
上一篇 下一篇

猜你喜欢

热点阅读