Flutter/Dart ifdef删除功能

zf2sa74q  于 2023-11-14  发布在  Flutter
关注(0)|答案(2)|浏览(200)

我有一个dart库,它被导入到我的flutter应用程序。
dart库包含数据和一些调试函数/方法,我希望将其完全排除在我的应用程序之外,这样代码就不会被调用,也不会占用任何空间。
我知道我可以使用kReleaseMode和/或assert只在调试模式下调用函数,而不是在生产模式下。
然而,我想确保调试函数不占用我的应用程序中的任何空间,即调试函数甚至没有在生产模式下定义或声明,就像我从代码库中删除调试数据和方法一样。
在某些语言中,我会这样做:

  1. class MyClass
  2. {
  3. void prodFunction()
  4. {
  5. // do something ...
  6. }
  7. #ifdef DEBUG_MODE
  8. static const debugData = [];
  9. void debugFunction()
  10. {
  11. // this method and the above List is not defined in production mode ...
  12. }
  13. #endif
  14. }

字符串
在Dart/Flutter中可以做同样的事情吗?

wz8daaqr

wz8daaqr1#

不需要“手动”删除调试代码,因为dart优化(树抖动)会处理它:如果kReleasMode==true,则永远不会调用的函数以及仅由这些函数更改或访问的变量将不会出现在发布模式的可执行文件中。
当然,在导入库的应用程序中,如果你想从这种优化中获益,你不能调用debugFunction(或者只有在kReleaseMode==false的情况下)。但无论如何,如果可以使用类似#ifdef的东西删除debugFunction,你也不能调用该函数。

gev0vcfq

gev0vcfq2#

据我所知,目前Dart中还没有像#ifdef这样的语法,但是如果你的目标是从发布版本中删除一个函数,那么你可以使用assert块。
Dart编译器将从release/AOT快照中的代码中删除所有Assert块。

  1. void doSomething() {
  2. assert(() {
  3. // <- Your logic goes here ->
  4. return true;
  5. }());
  6. }

字符串
flutter框架在内部使用了相同的模式,即framework.dart文件中的方法,它检查initState方法是否返回了Future类型。

  1. assert(() {
  2. if (debugCheckForReturnedFuture is Future) {
  3. throw FlutterError.fromParts(<DiagnosticsNode>[
  4. ErrorSummary('${state.runtimeType}.initState() returned a Future.'),
  5. ErrorDescription('State.initState() must be a void method without an `async` keyword.'),
  6. ErrorHint(
  7. 'Rather than awaiting on asynchronous work directly inside of initState, '
  8. 'call a separate method to do this work without awaiting it.',
  9. ),
  10. ]);
  11. }
  12. return true;
  13. }());

展开查看全部

相关问题