"#define"等价于飞镖/颤动?



我想知道Dart/Flutter中是否有#define short_expression long_expression的方法?

例如,不要键入

MediaQuery.of(context).size.width
// or 
Locale.of(context).translate("x")

在每个构建函数中,我们都可以

#define MQWidth MediaQuery.of(context).size.width
// or
#define Lt(x) Locale.of(context).translate("x")

然后在每个构建函数中使用它?

宏。生成编程(也称为元编程(在解释语言中通常不是一件事。dart中最接近生成编程概念的是静态元编程,它正在被追逐。目前,您可以通过build_runner在dart中实现源代码生成,我相信您已经在json_serializableretrofit等包中看到了这一点。但它离完美还有太远的路要走,需要做很多工作才能实现哪怕是微不足道的目标。它只适用于某些场景,不幸的是,你举的例子不是其中之一。

因此,答案是。你不能那样做,至少到目前为止。

但是,如果到处都被过度使用,为什么不把它分成函数呢。我知道你仍然需要在任何地方通过上下文,与你预期的相比,这有点混乱。但如果这是你的目标,它仍然会使代码变得更短。

希望这能回答你的问题。干杯

如何做到这一点的示例
顺便说一下,这是最简单的例子。不使用宏参数(AST节点(。

输入:bin/main.dart

@pragma('meta_expression:build')
library my_cool_library;
@pragma('meta_expression:import')
import 'package:test_meta_expression/my_cool_macros.dart';
void main(List<String> args) {
final a = mqWidth();
final b = lt('Hello!');
print(a);
print(b);
}

输出:bin/main.impl.dart

// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// MetaExpressionLibraryGenerator
// **************************************************************************
library my_cool_library;
void main(List<String> args) {
//
final a = MediaQuery.of(context).size.width;
final b = Locale.of(context).translate('Hello!');
print(a);
print(b);
}

宏:package:test_meta_expression/my_cool_macros.dart

import 'package:meta_expression_annotation/meta_expression_annotation.dart';
@MetaExpression(mqWidthImpl)
external int mqWidth();
String mqWidthImpl(MetaContext context) => '''
MediaQuery.of(context).size.width
''';
@MetaExpression(ltImpl)
external String lt(String x);
String ltImpl(MetaContext context) => '''
Locale.of(context).translate(x)
''';

文件:pubspec.yaml

dependencies:
meta_expression_annotation: 0.2.1
dev_dependencies:
build_runner: any
meta_expression: 0.2.1

构建命令:

dart run build_runner build

最新更新