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

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 中不提供镜像,我建议您查看代码生成库,您可以在其中根据您的代码以编程方式生成代码。

【讨论】:

以上是关于如何将飞镖函数名称转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

R问题:使用map将函数列表转换为函数名称的字符串列表

如何将数组转换为飞镖对象

如何将python日志记录级别名称转换为整数代码

ActionScript 3 AS3将字符串转换为函数名称

在python中,如何将一个字符串中的小写字母全部转换为大写?

如何在飞镖中将 2 个字节转换为 Int16?