我想知道是否有一种方法可以在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")
型
然后在每个构建函数中使用它?
3条答案
按热度按时间58wvjzkj1#
宏。生成式编程(又称元编程)通常不属于解释型语言。dart中最接近生成式编程概念的是static metaprogramming,它正受到积极追捧。目前,您可以通过
build_runner
在dart中实现源代码生成,我相信您已经在json_serializable
等软件包中看到过,和retrofit
。但它仍然离完美还很远,需要做很多工作才能实现一些微不足道的东西。它只适合某些场景,而你给出的例子不幸不是其中之一。所以,答案是"不“。你不能这么做,至少现在不能。
但是如果它们真的在所有地方被过度使用了,为什么不把它们分成函数呢?我知道你仍然需要在所有地方传递上下文,这与你预期的相比有点混乱。但是如果这是你的目标,它仍然会使代码更短。
希望这能回答你的问题。干杯!
rqcrx0a62#
这是如何做到这一点的一个例子。
顺便说一下,这是最简单的例子。没有使用宏参数(AST节点)。
输入:
bin/main.dart
字符串
输出:
bin/main.impl.dart
型
宏:
package:test_meta_expression/my_cool_macros.dart
型
File:
pubspec.yaml
型
构建命令:
dart run build_runner build
wgx48brx3#
更新给未来的读者:我无法在Dart 3中实现上述功能,但是有this document(和其他)显示了最终使用
@annotation()
风格语法内置宏支持的证据。非常整洁!希望它很快发布