如何将飞镖函数名称转换为字符串?

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

作为 Functionget 扩展:

void main() {
  print(main.asString);
}

extension on Function {
  String get asString => this.toString().split('\'')[1].trim();
}

控制台:

main