【问题标题】: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,
              ),
            ),
          ),
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: list flutter dart tostring


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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-03
            • 1970-01-01
            • 2021-09-29
            相关资源
            最近更新 更多