Dart 执行字符串中的Dart代码不使用反射的方式
Dart 语言提供了一个 eval 函数,可以执行字符串中的 Dart 代码。eval 函数的使用方法如下:
dynamic eval(String code, [Map<String, dynamic> scope])
其中,code 参数是要执行的 Dart 代码字符串,scope 参数是一个可选的 Map 对象,用于指定代码执行时的作用域。
下面是一个示例,演示如何使用 eval 函数执行字符串中的 Dart 代码:
void main() {
  String code = '''
    int a = 10;
    int b = 20;
    print(a + b);
  ''';
  eval(code);
}
dynamic eval(String code, [Map<String, dynamic> scope]) {
  var isolate = Isolate.current;
  var receivePort = ReceivePort();
  isolate.spawn(_eval, receivePort.sendPort);
  return receivePort.first.then((sendPort) {
    var responsePort = ReceivePort();
    sendPort.send({'code': code, 'scope': scope, 'responsePort': responsePort.sendPort});
    return responsePort.first;
  });
}
void _eval(SendPort sendPort) {
  var receivePort = ReceivePort();
  sendPort.send(receivePort.sendPort);
  receivePort.listen((message) {
    String code = message['code'];
    Map<String, dynamic> scope = message['scope'] ?? {};
    SendPort responsePort = message['responsePort'];
    var result = Function.apply(() {
      return eval(code, scope);
    }, []);
    responsePort.send(result);
  });
}
注意,这种方式并不是使用反射的方式,而是在一个新的 isolate 中执行代码,因此可以避免反射带来的性能问题和安全问题
原文地址: https://www.cveoy.top/t/topic/eEWe 著作权归作者所有。请勿转载和采集!