如何将飞镖函数名称转换为字符串?
How to turn a dart function name into a string?
出于测试目的,我希望能够动态地将函数名称 getUserLocationByUserID(String userID){}
转换为字符串 'getUserLocationByUserID'
以便我可以在其他地方使用它
所以当你有一个函数列表并且你想在它们中迭代时,我希望能够做这样的事情
import 'package:flutter/material.dart';
void function1() {}
void function2() {}
void function3() {}
List<Function> functionsList = [function1, function2, function3];
String magicalFunctionThatGetsAStringOutOfAFunctionName(Function function) {
String functionNameAsAString = ''; // magical code here <----------------------------------------------
return functionNameAsAString;
}
class FunctionTester extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: functionsList.length,
itemBuilder: (context, index) => GestureDetector(
onTap: functionsList[index],
child: Container(
width: 300,
height: 300,
child: Text(
magicalFunctionThatGetsAStringOutOfAFunctionName(functionsList[index]),
maxLines: 1,
style: TextStyle(
fontSize: 10,
),
),
),
),
),
);
}
}
这在 Dart 中是可能的,使用 mirrors, however mirrors are not available in Flutter or Web (and could be discontinued - see https://github.com/dart-lang/sdk/issues/44489)。
import 'dart:mirrors';
void function1() {}
void function2() {}
void function3() {}
List<Function> functionsList = [function1, function2, function3];
void main() {
for (final func in functionsList) {
ClosureMirror mirror = reflect(func);
final name = MirrorSystem.getName(mirror.function.simpleName);
print(name);
}
}
另一种方法是使用映射来存储函数名称和函数引用,例如:
void function1() {}
void function2() {}
void function3() {}
final functions = {
'function1': function1,
'function2': function2,
'function3': function3,
};
void main() {
for (final functionName in functions.keys) {
final function = functions[functionName];
print(functionName);
}
}
由于 Flutter 中没有镜像,我建议您查看代码生成库,您可以在其中根据您的代码以编程方式生成代码。
试一试:
String magicalFunctionThatGetsAStringOutOfAFunctionName(Function function) {
String functionNameAsAString = function.toString();
int s = functionNameAsAString.indexOf('\'');
int e = functionNameAsAString.lastIndexOf('\'');
return functionNameAsAString.substring(s + 1, e);
}
此解决方案可能有点老套,但与其他选项相比相当便宜。
注意:这个可以简化,我这样写是为了方便阅读:)
作为单行函数:
String functionToString(Function fn) => fn.toString().split('\'')[1].trim();
void main() {
print(functionToString(functionToString));
}
控制台结果:
functionToString
作为 Function
的 get
扩展:
void main() {
print(main.asString);
}
extension on Function {
String get asString => this.toString().split('\'')[1].trim();
}
控制台:
main
出于测试目的,我希望能够动态地将函数名称 getUserLocationByUserID(String userID){}
转换为字符串 'getUserLocationByUserID'
以便我可以在其他地方使用它
所以当你有一个函数列表并且你想在它们中迭代时,我希望能够做这样的事情
import 'package:flutter/material.dart';
void function1() {}
void function2() {}
void function3() {}
List<Function> functionsList = [function1, function2, function3];
String magicalFunctionThatGetsAStringOutOfAFunctionName(Function function) {
String functionNameAsAString = ''; // magical code here <----------------------------------------------
return functionNameAsAString;
}
class FunctionTester extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: functionsList.length,
itemBuilder: (context, index) => GestureDetector(
onTap: functionsList[index],
child: Container(
width: 300,
height: 300,
child: Text(
magicalFunctionThatGetsAStringOutOfAFunctionName(functionsList[index]),
maxLines: 1,
style: TextStyle(
fontSize: 10,
),
),
),
),
),
);
}
}
这在 Dart 中是可能的,使用 mirrors, however mirrors are not available in Flutter or Web (and could be discontinued - see https://github.com/dart-lang/sdk/issues/44489)。
import 'dart:mirrors';
void function1() {}
void function2() {}
void function3() {}
List<Function> functionsList = [function1, function2, function3];
void main() {
for (final func in functionsList) {
ClosureMirror mirror = reflect(func);
final name = MirrorSystem.getName(mirror.function.simpleName);
print(name);
}
}
另一种方法是使用映射来存储函数名称和函数引用,例如:
void function1() {}
void function2() {}
void function3() {}
final functions = {
'function1': function1,
'function2': function2,
'function3': function3,
};
void main() {
for (final functionName in functions.keys) {
final function = functions[functionName];
print(functionName);
}
}
由于 Flutter 中没有镜像,我建议您查看代码生成库,您可以在其中根据您的代码以编程方式生成代码。
试一试:
String magicalFunctionThatGetsAStringOutOfAFunctionName(Function function) {
String functionNameAsAString = function.toString();
int s = functionNameAsAString.indexOf('\'');
int e = functionNameAsAString.lastIndexOf('\'');
return functionNameAsAString.substring(s + 1, e);
}
此解决方案可能有点老套,但与其他选项相比相当便宜。
注意:这个可以简化,我这样写是为了方便阅读:)
作为单行函数:
String functionToString(Function fn) => fn.toString().split('\'')[1].trim();
void main() {
print(functionToString(functionToString));
}
控制台结果:
functionToString
作为 Function
的 get
扩展:
void main() {
print(main.asString);
}
extension on Function {
String get asString => this.toString().split('\'')[1].trim();
}
控制台:
main