FlutterWebviewPlugin的evalJavascript()一直阻塞

插件版本是:flutter_webview_plugin-0.3.11

FlutterWebviewPlugin类的evalJavascript()方法执行后一直没有返回,一直阻塞。

//base.dart

class FlutterWebviewPlugin {

	...
	
  /// Execute Javascript inside webview
  Future<String> evalJavascript(String code) async {
    final res = await _channel.invokeMethod('eval', {'code': code});
    return res;
  }
	
	...

}

FlutterWebviewPlugin的这个方法啥也没干,直接调用的是platform_channel.dart中的MethodChannel类的invokeMethod方法:

//platform_channel.dart



  @optionalTypeArgs
  Future<T?> invokeMethod<T>(String method, [ dynamic arguments ]) {
    return _invokeMethod<T>(method, missingOk: false, arguments: arguments);
  }

...

  Future<T?> _invokeMethod<T>(String method, { required bool missingOk, dynamic arguments }) async {
    assert(method != null);
    final ByteData? result = await binaryMessenger.send(
      name,
      codec.encodeMethodCall(MethodCall(method, arguments)),
    );
    if (result == null) {
      if (missingOk) {
        return null;
      }
      throw MissingPluginException('No implementation found for method $method on channel $name');
    }
    return codec.decodeEnvelope(result) as T?;
  }

...

而platform_channel.dart是flutter sdk里的代码了。

继续一路追踪代码,最终调用的是与原生通信的方法:

//platform_dispatcher.dart

  String? _sendPlatformMessage(String name, PlatformMessageResponseCallback? callback, ByteData? data)
      native 'PlatformConfiguration_sendPlatformMessage';

再看不到代码了。

即最终是通过android原生的webview来执行js代码。

代码只能追踪到这里,不能判断出是原生的webview没有执行js代码,还是flutter层没有执行,根据上述分析可以推断出应该不是阻塞在FlutterWebviewPlugin层的代码,而是阻塞在flutter sdk层的代码或者是android原生层的代码。

思考了好久,实在没有好的解决方法,因为最终调用的是flutter sdk层的代码的方法,于是想着更新下flutter版本是不是能解决问题,可能就是flutter的bug呢,于是去flutter官网查看最新的版本,已经更新到2.2.1,而当前使用的是2.0.4,果断先更新一波。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值