使用 Flutter 构建的应用程序是否存在死代码?

Do apps built with Flutter suffer from dead code?

Flutter 在技术上可能允许您编写一次代码并为多个平台构建应用程序,但实际上您不希望在移动设备上拥有与在 Web 或桌面上相同的体验。很容易想到解决方案 - “如果在 iOS 上使用此小部件,否则使用此小部件”,或“如果在移动设备或桌面上使用移动视图”。

flutter 是否也会处理机器代码的 treeshaking,以便 web 应用程序的捆绑包不会比需要的大 5 倍?

treeshaker 仅删除已知在编译时不使用的代码。 您在编写代码时需要注意这一点,因为它并不神奇。

您可以对常量使用条件分支来实现此目的。

const isPlatform = true;

class SomeWidget extends StatelessWidget {
  @override
  Widget build(context) {
    if (isPlatform) {
      return PlatformWidget(); // will appear in build
    } else {
      return SomeOtherWidget(); // will be removed from build
    }
  }
}

对于网络,我们有 kIsWeb 但对于其他平台,遗憾的是没有编译时间常量。

但是您可以使用 dart-define 将常量传递给构建。

const isAndroid = bool.fromEnvironment('IS_ANDROID'); // defaults to false if not supplied

class SomeWidget extends StatelessWidget {
  @override
  Widget build(context) {
    if (isAndroid) {
      return AndroidWidget(); // will appear in build
    } else {
      return SomeOtherWidget(); // will be removed from build
    }
  }
}

flutter build apk --dart-define=IS_ANDROID=true

Treeshaking 仅在发布版本上执行。