插件版本是: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,果断先更新一波。