如何将飞镖函数名称转换为字符串?
Posted
技术标签:
【中文标题】如何将飞镖函数名称转换为字符串?【英文标题】:How to turn a dart function name into a string? 【发布时间】:2021-04-04 20:14:23 【问题描述】:出于测试目的,我希望能够将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,
),
),
),
),
),
);
【问题讨论】:
【参考方案1】:试试这个:
String magicalFunctionThatGetsAStringOutOfAFunctionName(Function function)
String functionNameAsAString = function.toString();
int s = functionNameAsAString.indexOf('\'');
int e = functionNameAsAString.lastIndexOf('\'');
return functionNameAsAString.substring(s + 1, e);
这个解决方案可能有点老套,但与其他选项相比相当便宜。
注意:这可以简化,我这样写是为了便于阅读:)
【讨论】:
【参考方案2】:作为单行函数:
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
【讨论】:
【参考方案3】:这在 Dart 中使用 mirrors 是可能的,但是镜像在 Flutter 或 Web 中不可用(并且可能会停止使用 - 请参阅 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);
【讨论】:
【参考方案4】:由于 Flutter 中不提供镜像,我建议您查看代码生成库,您可以在其中根据您的代码以编程方式生成代码。
【讨论】:
以上是关于如何将飞镖函数名称转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章