Dart/Flutter中的“#define”等价物?

gtlvzcf8  于 12个月前  发布在  Flutter
关注(0)|答案(3)|浏览(153)

我想知道是否有一种方法可以在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")


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

58wvjzkj

58wvjzkj1#

宏。生成式编程(又称元编程)通常不属于解释型语言。dart中最接近生成式编程概念的是static metaprogramming,它正受到积极追捧。目前,您可以通过build_runner在dart中实现源代码生成,我相信您已经在json_serializable等软件包中看到过,和retrofit。但它仍然离完美还很远,需要做很多工作才能实现一些微不足道的东西。它只适合某些场景,而你给出的例子不幸不是其中之一。
所以,答案是"不“。你不能这么做,至少现在不能。
但是如果它们真的在所有地方被过度使用了,为什么不把它们分成函数呢?我知道你仍然需要在所有地方传递上下文,这与你预期的相比有点混乱。但是如果这是你的目标,它仍然会使代码更短。
希望这能回答你的问题。干杯!

rqcrx0a6

rqcrx0a62#

这是如何做到这一点的一个例子。
顺便说一下,这是最简单的例子。没有使用宏参数(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)
''';


File:pubspec.yaml

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


构建命令:
dart run build_runner build

wgx48brx

wgx48brx3#

更新给未来的读者:我无法在Dart 3中实现上述功能,但是有this document(和其他)显示了最终使用@annotation()风格语法内置宏支持的证据。非常整洁!希望它很快发布

相关问题