about summary refs log tree commit diff
path: root/pkgs/development/compilers/flutter
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/compilers/flutter')
-rw-r--r--pkgs/development/compilers/flutter/default.nix26
-rw-r--r--pkgs/development/compilers/flutter/engine/constants.nix41
-rw-r--r--pkgs/development/compilers/flutter/engine/dart.nix13
-rw-r--r--pkgs/development/compilers/flutter/engine/default.nix77
-rw-r--r--pkgs/development/compilers/flutter/engine/package.nix328
-rw-r--r--pkgs/development/compilers/flutter/engine/pkg-config.py247
-rw-r--r--pkgs/development/compilers/flutter/engine/source.nix88
-rw-r--r--pkgs/development/compilers/flutter/engine/tools.nix62
-rw-r--r--pkgs/development/compilers/flutter/flutter-tools.nix18
-rw-r--r--pkgs/development/compilers/flutter/flutter.nix46
-rw-r--r--pkgs/development/compilers/flutter/update/get-dart-hashes.nix.in9
-rw-r--r--pkgs/development/compilers/flutter/update/get-engine-hashes.nix.in23
-rw-r--r--pkgs/development/compilers/flutter/update/get-engine-swiftshader.nix.in10
-rwxr-xr-xpkgs/development/compilers/flutter/update/update.py112
-rw-r--r--pkgs/development/compilers/flutter/versions/3_13/data.json39
-rw-r--r--pkgs/development/compilers/flutter/versions/3_16/data.json23
-rw-r--r--pkgs/development/compilers/flutter/versions/3_19/data.json7
-rw-r--r--pkgs/development/compilers/flutter/versions/3_19/engine/patches/flutter-140969.patch41
-rw-r--r--pkgs/development/compilers/flutter/versions/3_22/data.json75
-rw-r--r--pkgs/development/compilers/flutter/versions/3_23/data.json1030
-rw-r--r--pkgs/development/compilers/flutter/wrapper.nix7
21 files changed, 2232 insertions, 90 deletions
diff --git a/pkgs/development/compilers/flutter/default.nix b/pkgs/development/compilers/flutter/default.nix
index 6d2d904660338..c3ef3ab9db4a0 100644
--- a/pkgs/development/compilers/flutter/default.nix
+++ b/pkgs/development/compilers/flutter/default.nix
@@ -1,4 +1,4 @@
-{ callPackage, fetchzip, fetchFromGitHub, dart, lib, stdenv }:
+{ useNixpkgsEngine ? false, callPackage, fetchzip, fetchFromGitHub, dart, lib, stdenv }@args:
 let
   mkCustomFlutter = args: callPackage ./flutter.nix args;
   wrapFlutter = flutter: callPackage ./wrapper.nix { inherit flutter; };
@@ -8,34 +8,39 @@ let
   mkFlutter =
     { version
     , engineVersion
+    , engineSwiftShaderHash
+    , engineSwiftShaderRev
+    , engineHashes
+    , enginePatches
     , dartVersion
     , flutterHash
     , dartHash
     , patches
     , pubspecLock
     , artifactHashes
-    }:
+    , channel
+    }@fargs:
     let
       args = {
-        inherit version engineVersion patches pubspecLock artifactHashes;
+        inherit version engineVersion engineSwiftShaderRev engineSwiftShaderHash engineHashes enginePatches patches pubspecLock artifactHashes useNixpkgsEngine channel;
 
         dart = dart.override {
           version = dartVersion;
           sources = {
             "${dartVersion}-x86_64-linux" = fetchzip {
-              url = "https://storage.googleapis.com/dart-archive/channels/stable/release/${dartVersion}/sdk/dartsdk-linux-x64-release.zip";
+              url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-linux-x64-release.zip";
               sha256 = dartHash.x86_64-linux;
             };
             "${dartVersion}-aarch64-linux" = fetchzip {
-              url = "https://storage.googleapis.com/dart-archive/channels/stable/release/${dartVersion}/sdk/dartsdk-linux-arm64-release.zip";
+              url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-linux-arm64-release.zip";
               sha256 = dartHash.aarch64-linux;
             };
             "${dartVersion}-x86_64-darwin" = fetchzip {
-              url = "https://storage.googleapis.com/dart-archive/channels/stable/release/${dartVersion}/sdk/dartsdk-macos-x64-release.zip";
+              url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-macos-x64-release.zip";
               sha256 = dartHash.x86_64-darwin;
             };
             "${dartVersion}-aarch64-darwin" = fetchzip {
-              url = "https://storage.googleapis.com/dart-archive/channels/stable/release/${dartVersion}/sdk/dartsdk-macos-arm64-release.zip";
+              url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-macos-arm64-release.zip";
               sha256 = dartHash.aarch64-darwin;
             };
           };
@@ -63,10 +68,15 @@ let
       in
       lib.nameValuePair "v${version}" (wrapFlutter (mkFlutter ({
         patches = (getPatches ./patches) ++ (getPatches (versionDir + "/patches"));
+        enginePatches = (getPatches ./engine/patches) ++ (getPatches (versionDir + "/engine/patches"));
       } // data))))
     (builtins.readDir ./versions);
+
+  stableFlutterVersions = lib.attrsets.filterAttrs (_: v: v.channel == "stable") flutterVersions;
+  betaFlutterVersions = lib.attrsets.filterAttrs (_: v: v.channel == "beta") flutterVersions;
 in
 flutterVersions // {
-  stable = flutterVersions.${lib.last (lib.naturalSort (builtins.attrNames flutterVersions))};
+  beta = flutterVersions.${lib.last (lib.naturalSort (builtins.attrNames betaFlutterVersions))};
+  stable = flutterVersions.${lib.last (lib.naturalSort (builtins.attrNames stableFlutterVersions))};
   inherit wrapFlutter mkFlutter;
 }
diff --git a/pkgs/development/compilers/flutter/engine/constants.nix b/pkgs/development/compilers/flutter/engine/constants.nix
new file mode 100644
index 0000000000000..9b7907fc337f7
--- /dev/null
+++ b/pkgs/development/compilers/flutter/engine/constants.nix
@@ -0,0 +1,41 @@
+{ lib, targetPlatform }:
+rec {
+  os =
+    if targetPlatform.isLinux then
+      "linux"
+    else if targetPlatform.isDarwin then
+      "macos"
+    else if targetPlatform.isWindows then
+      "windows"
+    else
+      throw "Unsupported OS \"${targetPlatform.parsed.kernel.name}\"";
+
+  arch =
+    if targetPlatform.isx86_64 then
+      "amd64"
+    else if targetPlatform.isx86 && targetPlatform.is32bit then
+      "386"
+    else if targetPlatform.isAarch64 then
+      "arm64"
+    else if targetPlatform.isMips && targetPlatform.parsed.cpu.significantByte == "littleEndian" then
+      "mipsle"
+    else if targetPlatform.isMips64 then
+      "mips64${lib.optionalString (targetPlatform.parsed.cpu.significantByte == "littleEndian") "le"}"
+    else if targetPlatform.isPower64 then
+      "ppc64${lib.optionalString (targetPlatform.parsed.cpu.significantByte == "littleEndian") "le"}"
+    else if targetPlatform.isS390x then
+      "s390x"
+    else
+      throw "Unsupported CPU \"${targetPlatform.parsed.cpu.name}\"";
+
+  alt-arch =
+    if targetPlatform.isx86_64 then
+      "x64"
+    else if targetPlatform.isAarch64 then
+      "arm64"
+    else
+      targetPlatform.parsed.cpu.name;
+
+  platform = "${os}-${arch}";
+  alt-platform = "${os}-${alt-arch}";
+}
diff --git a/pkgs/development/compilers/flutter/engine/dart.nix b/pkgs/development/compilers/flutter/engine/dart.nix
new file mode 100644
index 0000000000000..c872113f4a90e
--- /dev/null
+++ b/pkgs/development/compilers/flutter/engine/dart.nix
@@ -0,0 +1,13 @@
+{ engine, runCommand }:
+runCommand "flutter-engine-${engine.version}-dart" {
+  version = engine.dartSdkVersion;
+
+  inherit engine;
+  inherit (engine) outName;
+
+  meta = engine.meta // {
+    description = "Dart SDK compiled from the Flutter Engine";
+  };
+} ''
+  ln -s ${engine}/out/$outName/dart-sdk $out
+''
diff --git a/pkgs/development/compilers/flutter/engine/default.nix b/pkgs/development/compilers/flutter/engine/default.nix
new file mode 100644
index 0000000000000..7bf59dc857196
--- /dev/null
+++ b/pkgs/development/compilers/flutter/engine/default.nix
@@ -0,0 +1,77 @@
+{
+  callPackage,
+  dartSdkVersion,
+  flutterVersion,
+  swiftshaderHash,
+  swiftshaderRev,
+  version,
+  hashes,
+  url,
+  patches,
+  runtimeModes,
+  isOptimized ? true,
+  lib,
+  stdenv,
+  dart,
+  mainRuntimeMode ? null,
+  altRuntimeMode ? null,
+}@args:
+let
+  mainRuntimeMode = args.mainRuntimeMode or builtins.elemAt runtimeModes 0;
+  altRuntimeMode = args.altRuntimeMode or builtins.elemAt runtimeModes 1;
+
+  runtimeModesBuilds = lib.genAttrs runtimeModes (
+    runtimeMode:
+    callPackage ./package.nix {
+      inherit
+        dartSdkVersion
+        flutterVersion
+        swiftshaderHash
+        swiftshaderRev
+        version
+        hashes
+        url
+        patches
+        runtimeMode
+        isOptimized
+        ;
+    }
+  );
+in
+stdenv.mkDerivation (
+  {
+    pname = "flutter-engine";
+    inherit url runtimeModes;
+    inherit (runtimeModesBuilds.${mainRuntimeMode})
+      meta
+      src
+      version
+      dartSdkVersion
+      isOptimized
+      runtimeMode
+      outName
+      dart
+      swiftshader
+      ;
+    inherit altRuntimeMode;
+
+    dontUnpack = true;
+    dontBuild = true;
+
+    installPhase =
+      ''
+        mkdir -p $out/out
+      ''
+      + lib.concatMapStrings (
+        runtimeMode:
+        let
+          runtimeModeBuild = runtimeModesBuilds.${runtimeMode};
+          runtimeModeOut = runtimeModeBuild.outName;
+        in
+        ''
+          ln -sf ${runtimeModeBuild}/out/${runtimeModeOut} $out/out/${runtimeModeOut}
+        ''
+      ) runtimeModes;
+  }
+  // runtimeModesBuilds
+)
diff --git a/pkgs/development/compilers/flutter/engine/package.nix b/pkgs/development/compilers/flutter/engine/package.nix
new file mode 100644
index 0000000000000..a87088dc8131d
--- /dev/null
+++ b/pkgs/development/compilers/flutter/engine/package.nix
@@ -0,0 +1,328 @@
+{
+  lib,
+  callPackage,
+  writeText,
+  symlinkJoin,
+  targetPlatform,
+  hostPlatform,
+  darwin,
+  clang,
+  llvm,
+  tools ? callPackage ./tools.nix { inherit hostPlatform; },
+  stdenv,
+  stdenvNoCC,
+  dart,
+  fetchgit,
+  runCommand,
+  llvmPackages,
+  llvmPackages_15,
+  patchelf,
+  openbox,
+  xorg,
+  libglvnd,
+  libepoxy,
+  wayland,
+  freetype,
+  pango,
+  glib,
+  harfbuzz,
+  cairo,
+  gdk-pixbuf,
+  at-spi2-atk,
+  zlib,
+  gtk3,
+  pkg-config,
+  ninja,
+  python3,
+  git,
+  version,
+  flutterVersion,
+  dartSdkVersion,
+  swiftshaderHash,
+  swiftshaderRev,
+  hashes,
+  patches,
+  url,
+  runtimeMode ? "release",
+  isOptimized ? true,
+}:
+with lib;
+let
+  expandSingleDep =
+    dep: lib.optionals (lib.isDerivation dep) ([ dep ] ++ map (output: dep.${output}) dep.outputs);
+
+  expandDeps = deps: flatten (map expandSingleDep deps);
+
+  constants = callPackage ./constants.nix { inherit targetPlatform; };
+
+  src = callPackage ./source.nix {
+    inherit
+      tools
+      version
+      hashes
+      url
+      ;
+  };
+
+  swiftshader = fetchgit {
+    url = "https://swiftshader.googlesource.com/SwiftShader.git";
+    hash = swiftshaderHash;
+    rev = swiftshaderRev;
+
+    postFetch = ''
+      rm -rf $out/third_party/llvm-project
+    '';
+  };
+
+  llvm = symlinkJoin {
+    name = "llvm";
+    paths = with llvmPackages; [
+      clang
+      llvmPackages.llvm
+    ];
+  };
+
+  outName = "host_${runtimeMode}${lib.optionalString (!isOptimized) "_unopt --unoptimized"}";
+
+  dartPath = "${if (lib.versionAtLeast flutterVersion "3.23") then "flutter/third_party" else "third_party"}/dart";
+in
+stdenv.mkDerivation (finalAttrs: {
+  pname = "flutter-engine-${runtimeMode}${lib.optionalString (!isOptimized) "-unopt"}";
+  inherit
+    version
+    runtimeMode
+    patches
+    isOptimized
+    dartSdkVersion
+    src
+    outName
+    swiftshader;
+
+  toolchain = symlinkJoin {
+    name = "flutter-engine-toolchain-${version}";
+
+    paths =
+      expandDeps (
+        optionals (stdenv.isLinux) [
+          gtk3
+          wayland
+          libepoxy
+          libglvnd
+          freetype
+          at-spi2-atk
+          glib
+          gdk-pixbuf
+          harfbuzz
+          pango
+          cairo
+          xorg.libxcb
+          xorg.libX11
+          xorg.libXcursor
+          xorg.libXrandr
+          xorg.libXrender
+          xorg.libXinerama
+          xorg.libXi
+          xorg.libXext
+          xorg.libXfixes
+          xorg.libXxf86vm
+          xorg.xorgproto
+          zlib
+        ]
+        ++ optionals (stdenv.isDarwin) [
+          clang
+          llvm
+        ]
+      )
+      ++ [
+        stdenv.cc.libc_dev
+        stdenv.cc.libc_lib
+      ];
+
+    # Needed due to Flutter expecting everything to be relative to $out
+    # and not true absolute path (ie relative to "/").
+    postBuild = ''
+      mkdir -p $(dirname $(dirname "$out/$out"))
+      ln -s $(dirname "$out") $out/$(dirname "$out")
+    '';
+  };
+
+  NIX_CFLAGS_COMPILE = "-I${finalAttrs.toolchain}/include";
+
+  nativeCheckInputs = lib.optionals stdenv.isLinux [ xorg.xorgserver openbox ];
+
+  nativeBuildInputs =
+    [
+      python3
+      (tools.vpython python3)
+      git
+      pkg-config
+      ninja
+      dart
+    ]
+    ++ lib.optionals (stdenv.isLinux) [ patchelf ]
+    ++ optionals (stdenv.isDarwin) [
+      darwin.system_cmds
+      darwin.xcode
+      tools.xcode-select
+    ]
+    ++ lib.optionals (stdenv.cc.libc ? bin) [ stdenv.cc.libc.bin ];
+
+  buildInputs = [ gtk3 ];
+
+  patchtools = [
+    "${dartPath}/tools/sdks/dart-sdk/bin/dart"
+    "flutter/third_party/gn/gn"
+  ];
+
+  dontPatch = true;
+
+  patchgit = [
+    dartPath
+    "flutter"
+    "."
+  ] ++ lib.optional (lib.versionAtLeast flutterVersion "3.21") "flutter/third_party/skia";
+
+  postUnpack = ''
+    pushd ${src.name}
+
+    cp ${./pkg-config.py} src/build/config/linux/pkg-config.py
+
+    cp -pr --reflink=auto $swiftshader src/flutter/third_party/swiftshader
+    chmod -R u+w -- src/flutter/third_party/swiftshader
+
+    ln -s ${llvmPackages_15.llvm.monorepoSrc} src/flutter/third_party/swiftshader/third_party/llvm-project
+
+    mkdir -p src/flutter/buildtools/${constants.alt-platform}
+    ln -s ${llvm} src/flutter/buildtools/${constants.alt-platform}/clang
+
+    ln -s ${dart} src/${dartPath}/tools/sdks/dart-sdk
+
+    ${lib.optionalString (stdenv.isLinux) ''
+      for patchtool in ''${patchtools[@]}; do
+        patchelf src/$patchtool --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker)
+      done
+    ''}
+
+    for dir in ''${patchgit[@]}; do
+      pushd src/$dir
+      rev=$(cat .git/HEAD)
+      rm -rf .git
+      git init
+      git add .
+      git config user.name "nobody"
+      git config user.email "nobody@local.host"
+      git commit -a -m "$rev" --quiet
+      popd
+    done
+
+    dart src/${dartPath}/tools/generate_package_config.dart
+    echo "${dartSdkVersion}" >src/${dartPath}/sdk/version
+
+    rm -rf src/third_party/angle/.git
+    python3 src/flutter/tools/pub_get_offline.py
+
+    pushd src/flutter
+
+    for p in ''${patches[@]}; do
+      patch -p1 -i $p
+    done
+
+    popd
+    popd
+  '';
+
+  configureFlags =
+    [
+      "--no-prebuilt-dart-sdk"
+      "--embedder-for-target"
+      "--no-goma"
+    ]
+    ++ optionals (targetPlatform.isx86_64 == false) [
+      "--linux"
+      "--linux-cpu ${constants.alt-arch}"
+    ];
+
+  # NOTE: Once https://github.com/flutter/flutter/issues/127606 is fixed, use "--no-prebuilt-dart-sdk"
+  configurePhase =
+    ''
+      runHook preConfigure
+
+      export PYTHONPATH=$src/src/build
+    ''
+    + lib.optionalString stdenv.isDarwin ''
+      export PATH=${darwin.xcode}/Contents/Developer/usr/bin/:$PATH
+    ''
+    + ''
+      python3 ./src/flutter/tools/gn $configureFlags \
+        --runtime-mode $runtimeMode \
+        --out-dir $out \
+        --target-sysroot $toolchain \
+        --target-dir $outName \
+        --target-triple ${targetPlatform.config} \
+        --enable-fontconfig
+
+      runHook postConfigure
+    '';
+
+  buildPhase = ''
+    runHook preBuild
+
+    export TERM=dumb
+    for tool in flatc scenec gen_snapshot dart impellerc shader_archiver gen_snapshot_product; do
+      ninja -C $out/out/$outName -j$NIX_BUILD_CORES $tool
+      ${lib.optionalString (stdenv.isLinux) ''
+        patchelf $out/out/$outName/$tool --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker)
+      ''}
+    done
+
+    ninja -C $out/out/$outName -j$NIX_BUILD_CORES
+
+    ${lib.optionalString (stdenv.isLinux) ''
+      patchelf $out/out/$outName/dart-sdk/bin/dartaotruntime \
+        --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker)
+
+      find $out/out/$outName/exe.unstripped -executable -type f -exec patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) {} \;
+    ''}
+
+    runHook postBuild
+  '';
+
+  # Tests are broken
+  doCheck = false;
+  checkPhase = ''
+    ln -s $out/out src/out
+    touch src/out/run_tests.log
+    sh src/flutter/testing/run_tests.sh $outName
+    rm src/out/run_tests.log
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    rm -rf $out/out/$outName/{obj,gen,exe.unstripped,lib.unstripped,zip_archives}
+    rm $out/out/$outName/{args.gn,build.ninja,build.ninja.d,compile_commands.json,display_list_rendertests,flutter_tester,toolchain.ninja}
+    find $out/out/$outName -name '*_unittests' -delete
+    find $out/out/$outName -name '*_benchmarks' -delete
+
+    runHook postInstall
+  '';
+
+  passthru = {
+    dart = callPackage ./dart.nix { engine = finalAttrs.finalPackage; };
+  };
+
+  meta = {
+    # Very broken on Darwin
+    broken = stdenv.isDarwin;
+    description = "The Flutter engine";
+    homepage = "https://flutter.dev";
+    maintainers = with maintainers; [ RossComputerGuy ];
+    license = licenses.bsd3;
+    platforms = [
+      "x86_64-linux"
+      "aarch64-linux"
+      "x86_64-darwin"
+      "aarch64-darwin"
+    ];
+  };
+})
diff --git a/pkgs/development/compilers/flutter/engine/pkg-config.py b/pkgs/development/compilers/flutter/engine/pkg-config.py
new file mode 100644
index 0000000000000..1df08211e570d
--- /dev/null
+++ b/pkgs/development/compilers/flutter/engine/pkg-config.py
@@ -0,0 +1,247 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+
+import json
+import os
+import subprocess
+import sys
+import re
+from optparse import OptionParser
+
+# This script runs pkg-config, optionally filtering out some results, and
+# returns the result.
+#
+# The result will be [ <includes>, <cflags>, <libs>, <lib_dirs>, <ldflags> ]
+# where each member is itself a list of strings.
+#
+# You can filter out matches using "-v <regexp>" where all results from
+# pkgconfig matching the given regular expression will be ignored. You can
+# specify more than one regular expression my specifying "-v" more than once.
+#
+# You can specify a sysroot using "-s <sysroot>" where sysroot is the absolute
+# system path to the sysroot used for compiling. This script will attempt to
+# generate correct paths for the sysroot.
+#
+# When using a sysroot, you must also specify the architecture via
+# "-a <arch>" where arch is either "x86" or "x64".
+#
+# CrOS systemroots place pkgconfig files at <systemroot>/usr/share/pkgconfig
+# and one of <systemroot>/usr/lib/pkgconfig or <systemroot>/usr/lib64/pkgconfig
+# depending on whether the systemroot is for a 32 or 64 bit architecture. They
+# specify the 'lib' or 'lib64' of the pkgconfig path by defining the
+# 'system_libdir' variable in the args.gn file. pkg_config.gni communicates this
+# variable to this script with the "--system_libdir <system_libdir>" flag. If no
+# flag is provided, then pkgconfig files are assumed to come from
+# <systemroot>/usr/lib/pkgconfig.
+#
+# Additionally, you can specify the option --atleast-version. This will skip
+# the normal outputting of a dictionary and instead print true or false,
+# depending on the return value of pkg-config for the given package.
+
+
+def SetConfigPath(options):
+  """Set the PKG_CONFIG_LIBDIR environment variable.
+
+  This takes into account any sysroot and architecture specification from the
+  options on the given command line.
+  """
+
+  sysroot = options.sysroot
+  assert sysroot
+
+  # Compute the library path name based on the architecture.
+  arch = options.arch
+  if sysroot and not arch:
+    print("You must specify an architecture via -a if using a sysroot.")
+    sys.exit(1)
+
+  libdir = sysroot + '/' + options.system_libdir + '/pkgconfig'
+  libdir += ':' + sysroot + '/share/pkgconfig'
+  os.environ['PKG_CONFIG_LIBDIR'] = libdir
+  return libdir
+
+
+def GetPkgConfigPrefixToStrip(options, args):
+  """Returns the prefix from pkg-config where packages are installed.
+
+  This returned prefix is the one that should be stripped from the beginning of
+  directory names to take into account sysroots.
+  """
+  # Some sysroots, like the Chromium OS ones, may generate paths that are not
+  # relative to the sysroot. For example,
+  # /path/to/chroot/build/x86-generic/usr/lib/pkgconfig/pkg.pc may have all
+  # paths relative to /path/to/chroot (i.e. prefix=/build/x86-generic/usr)
+  # instead of relative to /path/to/chroot/build/x86-generic (i.e prefix=/usr).
+  # To support this correctly, it's necessary to extract the prefix to strip
+  # from pkg-config's |prefix| variable.
+  prefix = subprocess.check_output([options.pkg_config,
+      "--variable=prefix"] + args, env=os.environ).decode('utf-8')
+  return prefix
+
+
+def MatchesAnyRegexp(flag, list_of_regexps):
+  """Returns true if the first argument matches any regular expression in the
+  given list."""
+  for regexp in list_of_regexps:
+    if regexp.search(flag) != None:
+      return True
+  return False
+
+
+def RewritePath(path, strip_prefix, sysroot):
+  """Rewrites a path by stripping the prefix and prepending the sysroot."""
+  if os.path.isabs(path) and not path.startswith(sysroot):
+    if path.startswith(strip_prefix):
+      path = path[len(strip_prefix):]
+    path = path.lstrip('/')
+    return os.path.join(sysroot, path)
+  else:
+    return path
+
+
+def main():
+  # If this is run on non-Linux platforms, just return nothing and indicate
+  # success. This allows us to "kind of emulate" a Linux build from other
+  # platforms.
+  if "linux" not in sys.platform:
+    print("[[],[],[],[],[]]")
+    return 0
+
+  parser = OptionParser()
+  parser.add_option('-d', '--debug', action='store_true')
+  parser.add_option('-p', action='store', dest='pkg_config', type='string',
+                    default='pkg-config')
+  parser.add_option('-v', action='append', dest='strip_out', type='string')
+  parser.add_option('-s', action='store', dest='sysroot', type='string')
+  parser.add_option('-a', action='store', dest='arch', type='string')
+  parser.add_option('--system_libdir', action='store', dest='system_libdir',
+                    type='string', default='lib')
+  parser.add_option('--atleast-version', action='store',
+                    dest='atleast_version', type='string')
+  parser.add_option('--libdir', action='store_true', dest='libdir')
+  parser.add_option('--dridriverdir', action='store_true', dest='dridriverdir')
+  parser.add_option('--version-as-components', action='store_true',
+                    dest='version_as_components')
+  (options, args) = parser.parse_args()
+
+  # Make a list of regular expressions to strip out.
+  strip_out = []
+  if options.strip_out != None:
+    for regexp in options.strip_out:
+      strip_out.append(re.compile(regexp))
+
+  if options.sysroot:
+    libdir = SetConfigPath(options)
+    if options.debug:
+      sys.stderr.write('PKG_CONFIG_LIBDIR=%s\n' % libdir)
+    prefix = GetPkgConfigPrefixToStrip(options, args)
+  else:
+    prefix = ''
+
+  if options.atleast_version:
+    # When asking for the return value, just run pkg-config and print the return
+    # value, no need to do other work.
+    if not subprocess.call([options.pkg_config,
+                            "--atleast-version=" + options.atleast_version] +
+                            args):
+      print("true")
+    else:
+      print("false")
+    return 0
+
+  if options.version_as_components:
+    cmd = [options.pkg_config, "--modversion"] + args
+    try:
+      version_string = subprocess.check_output(cmd).decode('utf-8')
+    except:
+      sys.stderr.write('Error from pkg-config.\n')
+      return 1
+    print(json.dumps(list(map(int, version_string.strip().split(".")))))
+    return 0
+
+
+  if options.libdir:
+    cmd = [options.pkg_config, "--variable=libdir"] + args
+    if options.debug:
+      sys.stderr.write('Running: %s\n' % cmd)
+    try:
+      libdir = subprocess.check_output(cmd).decode('utf-8')
+    except:
+      print("Error from pkg-config.")
+      return 1
+    sys.stdout.write(libdir.strip())
+    return 0
+
+  if options.dridriverdir:
+    cmd = [options.pkg_config, "--variable=dridriverdir"] + args
+    if options.debug:
+      sys.stderr.write('Running: %s\n' % cmd)
+    try:
+      dridriverdir = subprocess.check_output(cmd).decode('utf-8')
+    except:
+      print("Error from pkg-config.")
+      return 1
+    sys.stdout.write(dridriverdir.strip())
+    return
+
+  cmd = [options.pkg_config, "--cflags", "--libs"] + args
+  if options.debug:
+    sys.stderr.write('Running: %s\n' % ' '.join(cmd))
+
+  try:
+    flag_string = subprocess.check_output(cmd).decode('utf-8')
+  except:
+    sys.stderr.write('Could not run pkg-config.\n')
+    return 1
+
+  # For now just split on spaces to get the args out. This will break if
+  # pkgconfig returns quoted things with spaces in them, but that doesn't seem
+  # to happen in practice.
+  all_flags = flag_string.strip().split(' ')
+
+
+  sysroot = options.sysroot
+  if not sysroot:
+    sysroot = ''
+
+  includes = []
+  cflags = []
+  libs = []
+  lib_dirs = []
+
+  for flag in all_flags[:]:
+    if len(flag) == 0 or MatchesAnyRegexp(flag, strip_out):
+      continue;
+
+    if flag[:2] == '-l':
+      libs.append(RewritePath(flag[2:], prefix, sysroot))
+    elif flag[:2] == '-L':
+      lib_dirs.append(RewritePath(flag[2:], prefix, sysroot))
+    elif flag[:2] == '-I':
+      includes.append(RewritePath(flag[2:], prefix, sysroot))
+    elif flag[:3] == '-Wl':
+      # Don't allow libraries to control ld flags.  These should be specified
+      # only in build files.
+      pass
+    elif flag == '-pthread':
+      # Many libs specify "-pthread" which we don't need since we always include
+      # this anyway. Removing it here prevents a bunch of duplicate inclusions
+      # on the command line.
+      pass
+    else:
+      cflags.append(flag)
+
+  # Output a GN array, the first one is the cflags, the second are the libs. The
+  # JSON formatter prints GN compatible lists when everything is a list of
+  # strings.
+  print(json.dumps([includes, cflags, libs, lib_dirs]))
+  return 0
+
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/pkgs/development/compilers/flutter/engine/source.nix b/pkgs/development/compilers/flutter/engine/source.nix
new file mode 100644
index 0000000000000..413b1874a9812
--- /dev/null
+++ b/pkgs/development/compilers/flutter/engine/source.nix
@@ -0,0 +1,88 @@
+{
+  callPackage,
+  hostPlatform,
+  targetPlatform,
+  fetchgit,
+  tools ? callPackage ./tools.nix { inherit hostPlatform; },
+  curl,
+  pkg-config,
+  git,
+  python3,
+  runCommand,
+  writeText,
+  cacert,
+  version,
+  hashes,
+  url,
+}:
+let
+  constants = callPackage ./constants.nix { inherit targetPlatform; };
+  boolOption = value: if value then "True" else "False";
+in
+runCommand "flutter-engine-source-${version}-${targetPlatform.system}"
+  {
+    pname = "flutter-engine-source";
+    inherit version;
+
+    inherit (tools) depot_tools;
+
+    nativeBuildInputs = [
+      curl
+      pkg-config
+      git
+      tools.cipd
+      (python3.withPackages (
+        ps: with ps; [
+          httplib2
+          six
+        ]
+      ))
+    ];
+
+    gclient = writeText "flutter-engine-${version}.gclient" ''
+      solutions = [{
+        "managed": False,
+        "name": "src/flutter",
+        "url": "${url}",
+        "custom_vars": {
+          "download_fuchsia_deps": False,
+          "download_android_deps": False,
+          "download_linux_deps": ${boolOption targetPlatform.isLinux},
+          "setup_githooks": False,
+          "download_esbuild": False,
+          "download_dart_sdk": False,
+        },
+      }]
+    '';
+
+    NIX_SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
+    GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt";
+    SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
+    DEPOT_TOOLS_UPDATE = "0";
+    DEPOT_TOOLS_COLLECT_METRICS = "0";
+    PYTHONDONTWRITEBYTECODE = "1";
+
+    outputHashAlgo = "sha256";
+    outputHashMode = "recursive";
+    outputHash = hashes.${targetPlatform.system} or (throw "Hash not set for ${targetPlatform.system}");
+  }
+  ''
+    source ${../../../../build-support/fetchgit/deterministic-git}
+    export -f clean_git
+    export -f make_deterministic_repo
+
+    mkdir -p $out
+    cp $gclient $out/.gclient
+    cd $out
+
+    export PATH=$PATH:$depot_tools
+    python3 $depot_tools/gclient.py sync --no-history --shallow --nohooks 2>&1 >/dev/null
+    find $out -name '.git' -exec dirname {} \; | xargs bash -c 'make_deterministic_repo $@' _
+    find $out -path '*/.git/*' ! -name 'HEAD' -prune -exec rm -rf {} \;
+    find $out -name '.git' -exec mkdir {}/logs \;
+    find $out -name '.git' -exec cp {}/HEAD {}/logs/HEAD \;
+
+    rm -rf $out/src/flutter/{buildtools,prebuilts,third_party/swiftshader}
+
+    rm -rf $out/.cipd $out/.gclient $out/.gclient_entries $out/.gclient_previous_custom_vars $out/.gclient_previous_sync_commits
+  ''
diff --git a/pkgs/development/compilers/flutter/engine/tools.nix b/pkgs/development/compilers/flutter/engine/tools.nix
new file mode 100644
index 0000000000000..a35398058181b
--- /dev/null
+++ b/pkgs/development/compilers/flutter/engine/tools.nix
@@ -0,0 +1,62 @@
+{
+  callPackage,
+  fetchgit,
+  fetchurl,
+  writeText,
+  runCommand,
+  hostPlatform,
+  darwin,
+  writeShellScriptBin,
+  depot_toolsCommit ? "7d95eb2eb054447592585c73a8ff7adad97ecba1",
+  depot_toolsHash ? "sha256-F7KDuVg11qLKkohIjuXpNdxpnSsT6Z3hE9+wFIG2sSk=",
+  cipdCommit ? "89ada246fcbf10f330011e4991d017332af2365b",
+  cipdHashes ? {
+    "linux-386" = "7f264198598af2ef9d8878349d33c1940f1f3739e46d986962c352ec4cce2690";
+    "linux-amd64" = "2ada6b46ad1cd1350522c5c05899d273f5c894c7665e30104e7f57084a5aeeb9";
+    "linux-arm64" = "96eca7e49f6732c50122b94b793c3a5e62ed77bce1686787a8334906791b4168";
+    "linux-armv6l" = "06394601130652c5e1b055a7e4605c21fc7c6643af0b3b3cac8d2691491afa81";
+    "linux-mips64" = "f3eda6542b381b7aa8f582698498b0e197972c894590ec35f18faa467c868f5c";
+    "linux-mips64le" = "74229ada8e2afd9c8e7c58991126869b2880547780d4a197a27c1dfa96851622";
+    "linux-mipsle" = "2f3c18ec0ad48cd44a9ff39bb60e9afded83ca43fb9c7a5ea9949f6fdd4e1394";
+    "linux-ppc64" = "79425c0795fb8ba12b39a8856bf7ccb853e85def4317aa6413222f307d4c2dbd";
+    "linux-ppc64le" = "f9b3d85dde70f1b78cd7a41d2477834c15ac713a59317490a4cdac9f8f092325";
+    "linux-riscv64" = "bd695164563a66e8d3799e8835f90a398fbae9a4eec24e876c92d5f213943482";
+    "linux-s390x" = "6f501af80541e733fda23b4208a21ea05919c95d236036a2121e6b6334a2792c";
+    "macos-amd64" = "41d05580c0014912d6c32619c720646fd136e4557c9c7d7571ecc8c0462733a1";
+    "macos-arm64" = "dc672bd16d9faf277dd562f1dc00644b10c03c5d838d3cc3d3ea29925d76d931";
+    "windows-386" = "fa6ed0022a38ffc51ff8a927e3947fe7e59a64b2019dcddca9d3afacf7630444";
+    "windows-amd64" = "b5423e4b4429837f7fe4d571ce99c068aa0ccb37ddbebc1978a423fd2b0086df";
+  },
+}:
+let
+  constants = callPackage ./constants.nix { targetPlatform = hostPlatform; };
+in
+{
+  depot_tools = fetchgit {
+    url = "https://chromium.googlesource.com/chromium/tools/depot_tools.git";
+    rev = depot_toolsCommit;
+    hash = depot_toolsHash;
+  };
+
+  cipd =
+    runCommand "cipd-${cipdCommit}"
+      {
+        unwrapped = fetchurl {
+          name = "cipd-${cipdCommit}-unwrapped";
+          url = "https://chrome-infra-packages.appspot.com/client?platform=${constants.platform}&version=git_revision:${cipdCommit}";
+          sha256 = cipdHashes.${constants.platform};
+        };
+      }
+      ''
+        mkdir -p $out/bin
+        install -m755 $unwrapped $out/bin/cipd
+      '';
+
+  vpython =
+    pythonPkg:
+    runCommand "vpython3" { } "mkdir -p $out/bin && ln -s ${pythonPkg}/bin/python $out/bin/vpython3";
+
+  xcode-select = writeShellScriptBin "xcode-select" ''
+    echo ${darwin.xcode}/Contents/Developer
+  '';
+}
diff --git a/pkgs/development/compilers/flutter/flutter-tools.nix b/pkgs/development/compilers/flutter/flutter-tools.nix
index cf35ed8cbc455..306765cd0a42a 100644
--- a/pkgs/development/compilers/flutter/flutter-tools.nix
+++ b/pkgs/development/compilers/flutter/flutter-tools.nix
@@ -2,6 +2,7 @@
 , stdenv
 , systemPlatform
 , buildDartApplication
+, runCommand
 , git
 , which
 , dart
@@ -54,5 +55,22 @@ buildDartApplication.override { inherit dart; } rec {
     popd
   '';
 
+  sdkSourceBuilders = {
+    # https://github.com/dart-lang/pub/blob/e1fbda73d1ac597474b82882ee0bf6ecea5df108/lib/src/sdk/dart.dart#L80
+    "dart" = name: runCommand "dart-sdk-${name}" { passthru.packageRoot = "."; } ''
+      for path in '${dart}/pkg/${name}'; do
+        if [ -d "$path" ]; then
+          ln -s "$path" "$out"
+          break
+        fi
+      done
+
+      if [ ! -e "$out" ]; then
+        echo 1>&2 'The Dart SDK does not contain the requested package: ${name}!'
+        exit 1
+      fi
+    '';
+  };
+
   inherit pubspecLock;
 }
diff --git a/pkgs/development/compilers/flutter/flutter.nix b/pkgs/development/compilers/flutter/flutter.nix
index aa73a62fab149..870c63afa8069 100644
--- a/pkgs/development/compilers/flutter/flutter.nix
+++ b/pkgs/development/compilers/flutter/flutter.nix
@@ -1,6 +1,14 @@
-{ version
+{ useNixpkgsEngine ? false
+, version
 , engineVersion
+, engineHashes ? {}
+, engineUrl ? "https://github.com/flutter/engine.git@${engineVersion}"
+, enginePatches ? []
+, engineRuntimeModes ? [ "release" "debug" ]
+, engineSwiftShaderHash
+, engineSwiftShaderRev
 , patches
+, channel
 , dart
 , src
 , pubspecLock
@@ -13,16 +21,35 @@
 , git
 , which
 , jq
-, flutterTools ? callPackage ./flutter-tools.nix {
+, flutterTools ? null
+}@args:
+
+let
+  engine = if args.useNixpkgsEngine or false then
+    callPackage ./engine/default.nix {
+      inherit (args) dart;
+      dartSdkVersion = args.dart.version;
+      flutterVersion = version;
+      swiftshaderRev = engineSwiftShaderRev;
+      swiftshaderHash = engineSwiftShaderHash;
+      version = engineVersion;
+      hashes = engineHashes;
+      url = engineUrl;
+      patches = enginePatches;
+      runtimeModes = engineRuntimeModes;
+    } else null;
+
+  dart = if args.useNixpkgsEngine or false then
+    engine.dart else args.dart;
+
+  flutterTools = args.flutterTools or (callPackage ./flutter-tools.nix {
     inherit dart version;
     flutterSrc = src;
     inherit patches;
     inherit pubspecLock;
     systemPlatform = stdenv.hostPlatform.system;
-  }
-}:
+  });
 
-let
   unwrapped =
     stdenv.mkDerivation {
       name = "flutter-${version}-unwrapped";
@@ -74,7 +101,7 @@ let
           "devToolsVersion": "$(cat "${dart}/bin/resources/devtools/version.json" | jq -r .version)",
           "flutterVersion": "${version}",
           "frameworkVersion": "${version}",
-          "channel": "stable",
+          "channel": "${channel}",
           "repositoryUrl": "https://github.com/flutter/flutter.git",
           "frameworkRevision": "nixpkgs000000000000000000000000000000000",
           "frameworkCommitDate": "1970-01-01 00:00:00",
@@ -124,12 +151,15 @@ let
       '';
 
       passthru = {
-        inherit dart engineVersion artifactHashes;
+        # TODO: rely on engine.version instead of engineVersion
+        inherit dart engineVersion artifactHashes channel;
         tools = flutterTools;
         # The derivation containing the original Flutter SDK files.
         # When other derivations wrap this one, any unmodified files
         # found here should be included as-is, for tooling compatibility.
         sdk = unwrapped;
+      } // lib.optionalAttrs (engine != null && engine.meta.available) {
+        inherit engine;
       };
 
       meta = with lib; {
@@ -142,7 +172,7 @@ let
         license = licenses.bsd3;
         platforms = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
         maintainers = teams.flutter.members ++ (with maintainers; [
-          babariviere ericdallo
+          ericdallo
         ]);
       };
     };
diff --git a/pkgs/development/compilers/flutter/update/get-dart-hashes.nix.in b/pkgs/development/compilers/flutter/update/get-dart-hashes.nix.in
index f900c863195ab..941a9769a9cb2 100644
--- a/pkgs/development/compilers/flutter/update/get-dart-hashes.nix.in
+++ b/pkgs/development/compilers/flutter/update/get-dart-hashes.nix.in
@@ -1,26 +1,27 @@
 let
   dartVersion = "@dart_version@";
   platform = "@platform@";
+  channel = "@channel@";
 in
 {
   x86_64-linux = { fetchzip }:
     fetchzip {
-      url = "https://storage.googleapis.com/dart-archive/channels/stable/release/${dartVersion}/sdk/dartsdk-linux-x64-release.zip";
+      url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-linux-x64-release.zip";
       sha256 = "0000000000000000000000000000000000000000000000000000";
     };
   aarch64-linux = { fetchzip }:
     fetchzip {
-      url = "https://storage.googleapis.com/dart-archive/channels/stable/release/${dartVersion}/sdk/dartsdk-linux-arm64-release.zip";
+      url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-linux-arm64-release.zip";
       sha256 = "0000000000000000000000000000000000000000000000000000";
     };
   x86_64-darwin = { fetchzip }:
     fetchzip {
-      url = "https://storage.googleapis.com/dart-archive/channels/stable/release/${dartVersion}/sdk/dartsdk-macos-x64-release.zip";
+      url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-macos-x64-release.zip";
       sha256 = "0000000000000000000000000000000000000000000000000000";
     };
   aarch64-darwin = { fetchzip }:
     fetchzip {
-      url = "https://storage.googleapis.com/dart-archive/channels/stable/release/${dartVersion}/sdk/dartsdk-macos-arm64-release.zip";
+      url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-macos-arm64-release.zip";
       sha256 = "0000000000000000000000000000000000000000000000000000";
     };
 }.${platform}
diff --git a/pkgs/development/compilers/flutter/update/get-engine-hashes.nix.in b/pkgs/development/compilers/flutter/update/get-engine-hashes.nix.in
new file mode 100644
index 0000000000000..f61b9b14fd07a
--- /dev/null
+++ b/pkgs/development/compilers/flutter/update/get-engine-hashes.nix.in
@@ -0,0 +1,23 @@
+{ callPackage, symlinkJoin, lib }:
+let
+  nixpkgsRoot = "@nixpkgs_root@";
+  engineVersion = "@engine_version@";
+
+  systemPlatforms = [
+    "x86_64-linux"
+    "aarch64-linux"
+  ];
+
+  derivations = builtins.map
+    (systemPlatform: callPackage "${nixpkgsRoot}/pkgs/development/compilers/flutter/engine/source.nix" {
+      targetPlatform = lib.systems.elaborate systemPlatform;
+      version = engineVersion;
+      url = "https://github.com/flutter/engine.git@${engineVersion}";
+      hashes."${systemPlatform}" = lib.fakeSha256;
+    })
+    systemPlatforms;
+in
+symlinkJoin {
+  name = "evaluate-derivations";
+  paths = derivations;
+}
diff --git a/pkgs/development/compilers/flutter/update/get-engine-swiftshader.nix.in b/pkgs/development/compilers/flutter/update/get-engine-swiftshader.nix.in
new file mode 100644
index 0000000000000..aa71f8ae2ad36
--- /dev/null
+++ b/pkgs/development/compilers/flutter/update/get-engine-swiftshader.nix.in
@@ -0,0 +1,10 @@
+{ fetchgit }:
+fetchgit {
+  url = "https://swiftshader.googlesource.com/SwiftShader.git";
+  rev = "@engine_swiftshader_rev@";
+
+  # Keep with in sync of pkgs/development/compilers/flutter/engine/package.nix
+  postFetch = ''
+    rm -rf $out/third_party/llvm-project
+  '';
+}
diff --git a/pkgs/development/compilers/flutter/update/update.py b/pkgs/development/compilers/flutter/update/update.py
index 618fae5468e5b..cc6d114e694a7 100755
--- a/pkgs/development/compilers/flutter/update/update.py
+++ b/pkgs/development/compilers/flutter/update/update.py
@@ -14,6 +14,7 @@ import argparse
 import yaml
 import json
 
+FAKE_HASH = 'sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='
 
 NIXPKGS_ROOT = subprocess.Popen(['git',
                                  'rev-parse',
@@ -85,6 +86,32 @@ def nix_build_to_fail(code):
     return stderr
 
 
+def get_engine_hashes(engine_version):
+    code = load_code("get-engine-hashes.nix",
+                     nixpkgs_root=NIXPKGS_ROOT,
+                     engine_version=engine_version)
+
+    stderr = nix_build_to_fail(code)
+
+    pattern = re.compile(
+        r"/nix/store/.*-flutter-engine-source-(.+?)-(.+?).drv':\n\s+specified: .*\n\s+got:\s+(.+?)\n")
+    matches = pattern.findall(stderr)
+    result_dict = {}
+
+    for match in matches:
+        _, system, got = match
+        result_dict[system] = got
+
+    def sort_dict_recursive(d):
+        return {
+            k: sort_dict_recursive(v) if isinstance(
+                v, dict) else v for k, v in sorted(
+                d.items())}
+    result_dict = sort_dict_recursive(result_dict)
+
+    return result_dict
+
+
 def get_artifact_hashes(flutter_compact_version):
     code = load_code("get-artifact-hashes.nix",
                      nixpkgs_root=NIXPKGS_ROOT,
@@ -111,7 +138,7 @@ def get_artifact_hashes(flutter_compact_version):
     return result_dict
 
 
-def get_dart_hashes(dart_version):
+def get_dart_hashes(dart_version, channel):
     platforms = [
         "x86_64-linux",
         "aarch64-linux",
@@ -122,6 +149,7 @@ def get_dart_hashes(dart_version):
         code = load_code(
             "get-dart-hashes.nix",
             dart_version=dart_version,
+            channel=channel,
             platform=platform)
         stderr = nix_build_to_fail(code)
 
@@ -173,11 +201,31 @@ def get_pubspec_lock(flutter_compact_version, flutter_src):
 
     return yaml.safe_load(pubspec_lock_yaml)
 
+def get_engine_swiftshader_rev(engine_version):
+    with urllib.request.urlopen(f"https://github.com/flutter/engine/raw/{engine_version}/DEPS") as f:
+        deps = f.read().decode('utf-8')
+        pattern = re.compile(r"Var\('swiftshader_git'\) \+ '\/SwiftShader\.git' \+ '@' \+ \'([0-9a-fA-F]{40})\'\,")
+        rev = pattern.findall(deps)[0]
+        return rev
+
+def get_engine_swiftshader_hash(engine_swiftshader_rev):
+    code = load_code(
+        "get-engine-swiftshader.nix",
+        engine_swiftshader_rev=engine_swiftshader_rev,
+        hash="")
+
+    stderr = nix_build_to_fail(code)
+    pattern = re.compile(r"got:\s+(.+?)\n")
+    return pattern.findall(stderr)[0]
 
 def write_data(
         nixpkgs_flutter_version_directory,
         flutter_version,
+        channel,
         engine_hash,
+        engine_hashes,
+        engine_swiftshader_hash,
+        engine_swiftshader_rev,
         dart_version,
         dart_hash,
         flutter_hash,
@@ -187,6 +235,10 @@ def write_data(
         f.write(json.dumps({
             "version": flutter_version,
             "engineVersion": engine_hash,
+            "engineSwiftShaderHash": engine_swiftshader_hash,
+            "engineSwiftShaderRev": engine_swiftshader_rev,
+            "channel": channel,
+            "engineHashes": engine_hashes,
             "dartVersion": dart_version,
             "dartHash": dart_hash,
             "flutterHash": flutter_hash,
@@ -202,7 +254,9 @@ def update_all_packages():
         int(x.split('_')[0]), int(x.split('_')[1])), reverse=True)
 
     new_content = [
-        "flutterPackages = recurseIntoAttrs (callPackage ../development/compilers/flutter { });",
+        "flutterPackages-bin = recurseIntoAttrs (callPackage ../development/compilers/flutter { });",
+        "flutterPackages-source = recurseIntoAttrs (callPackage ../development/compilers/flutter { useNixpkgsEngine = true; });",
+        "flutterPackages = flutterPackages-bin;"
         "flutter = flutterPackages.stable;",
     ] + [f"flutter{version.replace('_', '')} = flutterPackages.v{version};" for version in versions]
 
@@ -212,7 +266,7 @@ def update_all_packages():
     start = -1
     end = -1
     for i, line in enumerate(lines):
-        if "flutterPackages = recurseIntoAttrs (callPackage ../development/compilers/flutter { });" in line:
+        if "flutterPackages-bin = recurseIntoAttrs (callPackage ../development/compilers/flutter { });" in line:
             start = i
         if start != -1 and len(line.strip()) == 0:
             end = i
@@ -229,18 +283,21 @@ def update_all_packages():
 # Finds Flutter version, Dart version, and Engine hash.
 # If the Flutter version is given, it uses that. Otherwise finds the
 # latest stable Flutter version.
-def find_versions(flutter_version=None):
+def find_versions(flutter_version=None, channel=None):
     engine_hash = None
     dart_version = None
 
     releases = json.load(urllib.request.urlopen(
         "https://storage.googleapis.com/flutter_infra_release/releases/releases_linux.json"))
 
+    if not channel:
+        channel = 'stable'
+
     if not flutter_version:
-        stable_hash = releases['current_release']['stable']
+        hash = releases['current_release'][channel]
         release = next(
             filter(
-                lambda release: release['hash'] == stable_hash,
+                lambda release: release['hash'] == hash,
                 releases['releases']))
         flutter_version = release['version']
 
@@ -265,21 +322,25 @@ def find_versions(flutter_version=None):
             filter(
                 lambda release: release['version'] == flutter_version,
                 releases['releases']))['dart_sdk_version']
+
+        if " " in dart_version:
+            dart_version = dart_version.split(' ')[2][:-1]
     except StopIteration:
         exit(
             f"Couldn't find Dart version for Flutter version: {flutter_version}")
 
-    return (flutter_version, engine_hash, dart_version)
+    return (flutter_version, engine_hash, dart_version, channel)
 
 
 def main():
     parser = argparse.ArgumentParser(description='Update Flutter in Nixpkgs')
     parser.add_argument('--version', type=str, help='Specify Flutter version')
+    parser.add_argument('--channel', type=str, help='Specify Flutter release channel')
     parser.add_argument('--artifact-hashes', action='store_true',
                         help='Whether to get artifact hashes')
     args = parser.parse_args()
 
-    (flutter_version, engine_hash, dart_version) = find_versions(args.version)
+    (flutter_version, engine_hash, dart_version, channel) = find_versions(args.version, args.channel)
 
     flutter_compact_version = '_'.join(flutter_version.split('.')[:2])
 
@@ -291,11 +352,11 @@ def main():
             "\n")
         return
 
-    print(f"Flutter version: {flutter_version} ({flutter_compact_version})")
+    print(f"Flutter version: {flutter_version} ({flutter_compact_version}) on ({channel})")
     print(f"Engine hash: {engine_hash}")
     print(f"Dart version: {dart_version}")
 
-    dart_hash = get_dart_hashes(dart_version)
+    dart_hash = get_dart_hashes(dart_version, channel)
     (flutter_hash, flutter_src) = get_flutter_hash_and_src(flutter_version)
 
     nixpkgs_flutter_version_directory = f"{NIXPKGS_ROOT}/pkgs/development/compilers/flutter/versions/{flutter_compact_version}"
@@ -309,6 +370,7 @@ def main():
     common_data_args = {
         "nixpkgs_flutter_version_directory": nixpkgs_flutter_version_directory,
         "flutter_version": flutter_version,
+        "channel": channel,
         "dart_version": dart_version,
         "engine_hash": engine_hash,
         "flutter_hash": flutter_hash,
@@ -318,6 +380,9 @@ def main():
     write_data(
         pubspec_lock={},
         artifact_hashes={},
+        engine_hashes={},
+        engine_swiftshader_hash=FAKE_HASH,
+        engine_swiftshader_rev='0',
         **common_data_args)
 
     pubspec_lock = get_pubspec_lock(flutter_compact_version, flutter_src)
@@ -325,6 +390,9 @@ def main():
     write_data(
         pubspec_lock=pubspec_lock,
         artifact_hashes={},
+        engine_hashes={},
+        engine_swiftshader_hash=FAKE_HASH,
+        engine_swiftshader_rev='0',
         **common_data_args)
 
     artifact_hashes = get_artifact_hashes(flutter_compact_version)
@@ -332,6 +400,30 @@ def main():
     write_data(
         pubspec_lock=pubspec_lock,
         artifact_hashes=artifact_hashes,
+        engine_hashes={},
+        engine_swiftshader_hash=FAKE_HASH,
+        engine_swiftshader_rev='0',
+        **common_data_args)
+
+    engine_hashes = get_engine_hashes(engine_hash)
+
+    write_data(
+        pubspec_lock=pubspec_lock,
+        artifact_hashes=artifact_hashes,
+        engine_hashes=engine_hashes,
+        engine_swiftshader_hash=FAKE_HASH,
+        engine_swiftshader_rev='0',
+        **common_data_args)
+
+    engine_swiftshader_rev = get_engine_swiftshader_rev(engine_hash)
+    engine_swiftshader_hash = get_engine_swiftshader_hash(engine_swiftshader_rev)
+
+    write_data(
+        pubspec_lock=pubspec_lock,
+        artifact_hashes=artifact_hashes,
+        engine_hashes=engine_hashes,
+        engine_swiftshader_hash=engine_swiftshader_hash,
+        engine_swiftshader_rev=engine_swiftshader_rev,
         **common_data_args)
 
 
diff --git a/pkgs/development/compilers/flutter/versions/3_13/data.json b/pkgs/development/compilers/flutter/versions/3_13/data.json
index 7d8f285f0b211..1b61347b30f13 100644
--- a/pkgs/development/compilers/flutter/versions/3_13/data.json
+++ b/pkgs/development/compilers/flutter/versions/3_13/data.json
@@ -1,6 +1,13 @@
 {
   "version": "3.13.8",
   "engineVersion": "767d8c75e898091b925519803830fc2721658d07",
+  "engineSwiftShaderHash": "sha256-qKf5gXIpI4+05bs7d3W6JlMNTn3vHFQL+i3JpFdyPao=",
+  "engineSwiftShaderRev": "5f9ed9b16931c7155171d31f75004f73f0a3abc8",
+  "channel": "stable",
+  "engineHashes": {
+    "aarch64-linux": "sha256-+MIGPmKHkcn3TlFYu6jXv8KBRqdECgtGSqAKQE33iAM=",
+    "x86_64-linux": "sha256-+MIGPmKHkcn3TlFYu6jXv8KBRqdECgtGSqAKQE33iAM="
+  },
   "dartVersion": "3.1.4",
   "dartHash": {
     "x86_64-linux": "sha256-42wrqzjRcFDWw2aEY6+/faX+QE9PA8FmRWP4M/NkgBE=",
@@ -11,52 +18,52 @@
   "flutterHash": "sha256-00G030FvZZTsdf9ruFs9jdIHcC5h+xpp4NlmL64qVZA=",
   "artifactHashes": {
     "android": {
-      "x86_64-linux": "sha256-Uc36aBq8wQo2aEvjAPOoixZElWOE/GNRm2GUfhbwT3Y=",
+      "aarch64-darwin": "sha256-v/6/GTj7732fEOIgSaoM00yaw2qNwOMuvbuoCvii7vQ=",
       "aarch64-linux": "sha256-Uc36aBq8wQo2aEvjAPOoixZElWOE/GNRm2GUfhbwT3Y=",
       "x86_64-darwin": "sha256-v/6/GTj7732fEOIgSaoM00yaw2qNwOMuvbuoCvii7vQ=",
-      "aarch64-darwin": "sha256-v/6/GTj7732fEOIgSaoM00yaw2qNwOMuvbuoCvii7vQ="
+      "x86_64-linux": "sha256-Uc36aBq8wQo2aEvjAPOoixZElWOE/GNRm2GUfhbwT3Y="
     },
     "fuchsia": {
-      "x86_64-linux": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk=",
+      "aarch64-darwin": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk=",
       "aarch64-linux": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk=",
       "x86_64-darwin": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk=",
-      "aarch64-darwin": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk="
+      "x86_64-linux": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk="
     },
     "ios": {
-      "x86_64-linux": "sha256-QwkeGnutTVsm682CqxRtEd9rKUvN7zlAJcqkvAQYwao=",
+      "aarch64-darwin": "sha256-QwkeGnutTVsm682CqxRtEd9rKUvN7zlAJcqkvAQYwao=",
       "aarch64-linux": "sha256-QwkeGnutTVsm682CqxRtEd9rKUvN7zlAJcqkvAQYwao=",
       "x86_64-darwin": "sha256-QwkeGnutTVsm682CqxRtEd9rKUvN7zlAJcqkvAQYwao=",
-      "aarch64-darwin": "sha256-QwkeGnutTVsm682CqxRtEd9rKUvN7zlAJcqkvAQYwao="
+      "x86_64-linux": "sha256-QwkeGnutTVsm682CqxRtEd9rKUvN7zlAJcqkvAQYwao="
     },
     "linux": {
-      "x86_64-linux": "sha256-0gIOwux3YBdmcXgwICr8dpftj1CauaBUX8Rt5GG0WSs=",
+      "aarch64-darwin": "sha256-drGHsuJoOCLqrhVrXczqJRCOtpeWVlqdWW0OSMS/l5M=",
       "aarch64-linux": "sha256-drGHsuJoOCLqrhVrXczqJRCOtpeWVlqdWW0OSMS/l5M=",
       "x86_64-darwin": "sha256-0gIOwux3YBdmcXgwICr8dpftj1CauaBUX8Rt5GG0WSs=",
-      "aarch64-darwin": "sha256-drGHsuJoOCLqrhVrXczqJRCOtpeWVlqdWW0OSMS/l5M="
+      "x86_64-linux": "sha256-0gIOwux3YBdmcXgwICr8dpftj1CauaBUX8Rt5GG0WSs="
     },
     "macos": {
-      "x86_64-linux": "sha256-9WqCJQ37mcGc5tzfqQoY5CqHWHGTizjXf9p73bdnNWc=",
+      "aarch64-darwin": "sha256-9WqCJQ37mcGc5tzfqQoY5CqHWHGTizjXf9p73bdnNWc=",
       "aarch64-linux": "sha256-9WqCJQ37mcGc5tzfqQoY5CqHWHGTizjXf9p73bdnNWc=",
       "x86_64-darwin": "sha256-9WqCJQ37mcGc5tzfqQoY5CqHWHGTizjXf9p73bdnNWc=",
-      "aarch64-darwin": "sha256-9WqCJQ37mcGc5tzfqQoY5CqHWHGTizjXf9p73bdnNWc="
+      "x86_64-linux": "sha256-9WqCJQ37mcGc5tzfqQoY5CqHWHGTizjXf9p73bdnNWc="
     },
     "universal": {
-      "x86_64-linux": "sha256-wATt1UPjo/fh7RFO1vvcUAdo0dMAaaOUIuzYodsM0v0=",
+      "aarch64-darwin": "sha256-mSpAPKyP9v0dbkXqYkzGOnD5OEjRZigiRElXXcHZ5TE=",
       "aarch64-linux": "sha256-Z9bszNaIpCccG7OfvE5WFsw36dITiyCQAZ6p29+Yq68=",
       "x86_64-darwin": "sha256-qN5bAXRfQ78TWF3FLBIxWzUB5y5OrZVQTEilY5J/+2k=",
-      "aarch64-darwin": "sha256-mSpAPKyP9v0dbkXqYkzGOnD5OEjRZigiRElXXcHZ5TE="
+      "x86_64-linux": "sha256-wATt1UPjo/fh7RFO1vvcUAdo0dMAaaOUIuzYodsM0v0="
     },
     "web": {
-      "x86_64-linux": "sha256-DVXJOOFxv7tKt3d0NaYMexkphEcr7+gDFV67I6iAYa0=",
+      "aarch64-darwin": "sha256-DVXJOOFxv7tKt3d0NaYMexkphEcr7+gDFV67I6iAYa0=",
       "aarch64-linux": "sha256-DVXJOOFxv7tKt3d0NaYMexkphEcr7+gDFV67I6iAYa0=",
       "x86_64-darwin": "sha256-DVXJOOFxv7tKt3d0NaYMexkphEcr7+gDFV67I6iAYa0=",
-      "aarch64-darwin": "sha256-DVXJOOFxv7tKt3d0NaYMexkphEcr7+gDFV67I6iAYa0="
+      "x86_64-linux": "sha256-DVXJOOFxv7tKt3d0NaYMexkphEcr7+gDFV67I6iAYa0="
     },
     "windows": {
-      "x86_64-linux": "sha256-s8fJtwQkuZaGXr6vrPiKfpwP/NfewbETwyp9ERGqHYI=",
+      "aarch64-darwin": "sha256-s8fJtwQkuZaGXr6vrPiKfpwP/NfewbETwyp9ERGqHYI=",
       "aarch64-linux": "sha256-s8fJtwQkuZaGXr6vrPiKfpwP/NfewbETwyp9ERGqHYI=",
       "x86_64-darwin": "sha256-s8fJtwQkuZaGXr6vrPiKfpwP/NfewbETwyp9ERGqHYI=",
-      "aarch64-darwin": "sha256-s8fJtwQkuZaGXr6vrPiKfpwP/NfewbETwyp9ERGqHYI="
+      "x86_64-linux": "sha256-s8fJtwQkuZaGXr6vrPiKfpwP/NfewbETwyp9ERGqHYI="
     }
   },
   "pubspecLock": {
diff --git a/pkgs/development/compilers/flutter/versions/3_16/data.json b/pkgs/development/compilers/flutter/versions/3_16/data.json
index afc0225d49a7f..4c9142a149e97 100644
--- a/pkgs/development/compilers/flutter/versions/3_16/data.json
+++ b/pkgs/development/compilers/flutter/versions/3_16/data.json
@@ -1,6 +1,13 @@
 {
   "version": "3.16.7",
   "engineVersion": "4a585b79294e830fa89c24924d58a27cc8fbf406",
+  "engineSwiftShaderHash": "sha256-qKf5gXIpI4+05bs7d3W6JlMNTn3vHFQL+i3JpFdyPao=",
+  "engineSwiftShaderRev": "5f9ed9b16931c7155171d31f75004f73f0a3abc8",
+  "channel": "stable",
+  "engineHashes": {
+    "aarch64-linux": "sha256-irrfyKvTHqaBgcKg3jJzEDs1B4Q91u/e6Ui01MDI+oU=",
+    "x86_64-linux": "sha256-irrfyKvTHqaBgcKg3jJzEDs1B4Q91u/e6Ui01MDI+oU="
+  },
   "dartVersion": "3.2.4",
   "dartHash": {
     "x86_64-linux": "sha256-qslf+wgmNz9r+e45o3Bg9/vDj75GkM9gQE2tb5rbIvw=",
@@ -11,51 +18,51 @@
   "flutterHash": "sha256-j+tc8hMgZMBhju89n4e9tKRrq+CFBGOyeE0y+Z4FtHE=",
   "artifactHashes": {
     "android": {
+      "aarch64-darwin": "sha256-0FBI0CGMcxyttkzrdyjJlkGAjFd/yMuAQS3pDrNXZZw=",
       "aarch64-linux": "sha256-j8jstEE1RsTVHJbq6f6We0An+CyJz9JH/YClyNA4mwg=",
       "x86_64-darwin": "sha256-0FBI0CGMcxyttkzrdyjJlkGAjFd/yMuAQS3pDrNXZZw=",
-      "aarch64-darwin": "sha256-0FBI0CGMcxyttkzrdyjJlkGAjFd/yMuAQS3pDrNXZZw=",
       "x86_64-linux": "sha256-j8jstEE1RsTVHJbq6f6We0An+CyJz9JH/YClyNA4mwg="
     },
     "fuchsia": {
+      "aarch64-darwin": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk=",
       "aarch64-linux": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk=",
       "x86_64-darwin": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk=",
-      "aarch64-darwin": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk=",
       "x86_64-linux": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk="
     },
     "ios": {
+      "aarch64-darwin": "sha256-V3VXRX8hn45J+NhzKli+NAc3TGiSoeVQRlJte8DDbZw=",
       "aarch64-linux": "sha256-V3VXRX8hn45J+NhzKli+NAc3TGiSoeVQRlJte8DDbZw=",
       "x86_64-darwin": "sha256-V3VXRX8hn45J+NhzKli+NAc3TGiSoeVQRlJte8DDbZw=",
-      "aarch64-darwin": "sha256-V3VXRX8hn45J+NhzKli+NAc3TGiSoeVQRlJte8DDbZw=",
       "x86_64-linux": "sha256-V3VXRX8hn45J+NhzKli+NAc3TGiSoeVQRlJte8DDbZw="
     },
     "linux": {
+      "aarch64-darwin": "sha256-LWpou3L7bAWGn8i4nDT/BZez2Uhf/LbqC2C4Z98hCHQ=",
       "aarch64-linux": "sha256-LWpou3L7bAWGn8i4nDT/BZez2Uhf/LbqC2C4Z98hCHQ=",
       "x86_64-darwin": "sha256-BzjmO4F8B9GagYPbdvoT55r+YgZcP4BUaKgJPGZDXOU=",
-      "aarch64-darwin": "sha256-LWpou3L7bAWGn8i4nDT/BZez2Uhf/LbqC2C4Z98hCHQ=",
       "x86_64-linux": "sha256-BzjmO4F8B9GagYPbdvoT55r+YgZcP4BUaKgJPGZDXOU="
     },
     "macos": {
+      "aarch64-darwin": "sha256-BMFqhhy1O1hK33Pj2cxnCAzK9wwHkwT4gNbJ1GaLrnk=",
       "aarch64-linux": "sha256-BMFqhhy1O1hK33Pj2cxnCAzK9wwHkwT4gNbJ1GaLrnk=",
       "x86_64-darwin": "sha256-BMFqhhy1O1hK33Pj2cxnCAzK9wwHkwT4gNbJ1GaLrnk=",
-      "aarch64-darwin": "sha256-BMFqhhy1O1hK33Pj2cxnCAzK9wwHkwT4gNbJ1GaLrnk=",
       "x86_64-linux": "sha256-BMFqhhy1O1hK33Pj2cxnCAzK9wwHkwT4gNbJ1GaLrnk="
     },
     "universal": {
+      "aarch64-darwin": "sha256-Emus5J3mqPv47PD6xqNUD1KpXhVkX4JpURWuYG6KC14=",
       "aarch64-linux": "sha256-uB2YZRjioP/koMbPvaBHsezjPO0w5a+BpxZaDuiINIY=",
       "x86_64-darwin": "sha256-Qwf12gMqrW5nDC9Is08oxWTbKMptRQRAIb58JETq3xA=",
-      "aarch64-darwin": "sha256-Emus5J3mqPv47PD6xqNUD1KpXhVkX4JpURWuYG6KC14=",
       "x86_64-linux": "sha256-quSFKx7TZRJpK+4YDt5f9jwr7rZsSsaXMxhJ8vIcczQ="
     },
     "web": {
+      "aarch64-darwin": "sha256-rQphVm+T4k5B4OYYw0sJwYBOsNvUOC9fu8IuvXN7hVw=",
       "aarch64-linux": "sha256-rQphVm+T4k5B4OYYw0sJwYBOsNvUOC9fu8IuvXN7hVw=",
       "x86_64-darwin": "sha256-rQphVm+T4k5B4OYYw0sJwYBOsNvUOC9fu8IuvXN7hVw=",
-      "aarch64-darwin": "sha256-rQphVm+T4k5B4OYYw0sJwYBOsNvUOC9fu8IuvXN7hVw=",
       "x86_64-linux": "sha256-rQphVm+T4k5B4OYYw0sJwYBOsNvUOC9fu8IuvXN7hVw="
     },
     "windows": {
+      "aarch64-darwin": "sha256-HL3QLwzze9aO+T/2/xbHqhKV1/ba++MuRnk206hfJdU=",
       "aarch64-linux": "sha256-HL3QLwzze9aO+T/2/xbHqhKV1/ba++MuRnk206hfJdU=",
       "x86_64-darwin": "sha256-HL3QLwzze9aO+T/2/xbHqhKV1/ba++MuRnk206hfJdU=",
-      "aarch64-darwin": "sha256-HL3QLwzze9aO+T/2/xbHqhKV1/ba++MuRnk206hfJdU=",
       "x86_64-linux": "sha256-HL3QLwzze9aO+T/2/xbHqhKV1/ba++MuRnk206hfJdU="
     }
   },
diff --git a/pkgs/development/compilers/flutter/versions/3_19/data.json b/pkgs/development/compilers/flutter/versions/3_19/data.json
index 9eeddd3361ddf..a05e0172ca440 100644
--- a/pkgs/development/compilers/flutter/versions/3_19/data.json
+++ b/pkgs/development/compilers/flutter/versions/3_19/data.json
@@ -1,6 +1,13 @@
 {
   "version": "3.19.4",
   "engineVersion": "a5c24f538d05aaf66f7972fb23959d8cafb9f95a",
+  "engineSwiftShaderHash": "sha256-mRLCvhNkmHz7Rv6GzXkY7OB1opBSq+ATWZ466qZdgto=",
+  "engineSwiftShaderRev": "2fa7e9b99ae4e70ea5ae2cc9c8d3afb43391384f",
+  "channel": "stable",
+  "engineHashes": {
+    "aarch64-linux": "sha256-YTG46ZYCOu0OJGIILV6NGvIEhQU0yHNFSMR38Xvqa9E=",
+    "x86_64-linux": "sha256-YTG46ZYCOu0OJGIILV6NGvIEhQU0yHNFSMR38Xvqa9E="
+  },
   "dartVersion": "3.3.2",
   "dartHash": {
     "x86_64-linux": "sha256-eO8qcSQNWGEz/5oVaJ5tjRMnGy2aq3PbcF15z/Pi3xQ=",
diff --git a/pkgs/development/compilers/flutter/versions/3_19/engine/patches/flutter-140969.patch b/pkgs/development/compilers/flutter/versions/3_19/engine/patches/flutter-140969.patch
new file mode 100644
index 0000000000000..bf5d9320a0a39
--- /dev/null
+++ b/pkgs/development/compilers/flutter/versions/3_19/engine/patches/flutter-140969.patch
@@ -0,0 +1,41 @@
+From dd74740ddceac81e748a7e7834c28135abc59454 Mon Sep 17 00:00:00 2001
+From: Brandon DeRosier <bdero@google.com>
+Date: Tue, 16 Jan 2024 11:00:34 -0800
+Subject: [PATCH] [Flutter GPU] Fix playground shader paths. (#49790)
+
+Resolves https://github.com/flutter/flutter/issues/140969.
+
+Makes the shader paths absolute to prevent issues caused by the working
+directory differing across build environments.
+---
+ impeller/fixtures/BUILD.gn  | 3 ++-
+ impeller/tools/impeller.gni | 2 +-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/impeller/fixtures/BUILD.gn b/impeller/fixtures/BUILD.gn
+index 9165f06542a2a..5ea90ab3969f3 100644
+--- a/impeller/fixtures/BUILD.gn
++++ b/impeller/fixtures/BUILD.gn
+@@ -131,7 +131,8 @@
+     "flutter_gpu_texture.vert",
+   ]
+   shader_target_flags = [ "--runtime-stage-metal" ]
+-  shader_bundle = "{\"UnlitFragment\": {\"type\": \"fragment\", \"file\": \"../../flutter/impeller/fixtures/flutter_gpu_unlit.frag\"}, \"UnlitVertex\": {\"type\": \"vertex\", \"file\": \"../../flutter/impeller/fixtures/flutter_gpu_unlit.vert\"}, \"TextureFragment\": {\"type\": \"fragment\", \"file\": \"../../flutter/impeller/fixtures/flutter_gpu_texture.frag\"}, \"TextureVertex\": {\"type\": \"vertex\", \"file\": \"../../flutter/impeller/fixtures/flutter_gpu_texture.vert\"}}"
++  fixtures = rebase_path("//flutter/impeller/fixtures")
++  shader_bundle = "{\"UnlitFragment\": {\"type\": \"fragment\", \"file\": \"${fixtures}/flutter_gpu_unlit.frag\"}, \"UnlitVertex\": {\"type\": \"vertex\", \"file\": \"${fixtures}/flutter_gpu_unlit.vert\"}, \"TextureFragment\": {\"type\": \"fragment\", \"file\": \"${fixtures}/flutter_gpu_texture.frag\"}, \"TextureVertex\": {\"type\": \"vertex\", \"file\": \"${fixtures}/flutter_gpu_texture.vert\"}}"
+   shader_bundle_output = "playground.shaderbundle"
+ }
+
+diff --git a/impeller/tools/impeller.gni b/impeller/tools/impeller.gni
+index 6541c3b12173b..2ab7ec0f0b07a 100644
+--- a/impeller/tools/impeller.gni
++++ b/impeller/tools/impeller.gni
+@@ -313,7 +313,7 @@
+   if (defined(invoker.shader_bundle)) {
+     assert(
+         defined(invoker.shader_bundle_output),
+-        "When shader_bundle is specified, shader_output_bundle must also be specified.")
++        "When shader_bundle is specified, shader_bundle_output must also be specified.")
+   }
+ 
+   sksl = false
diff --git a/pkgs/development/compilers/flutter/versions/3_22/data.json b/pkgs/development/compilers/flutter/versions/3_22/data.json
index 66bc68aaff668..2abe37d9dac05 100644
--- a/pkgs/development/compilers/flutter/versions/3_22/data.json
+++ b/pkgs/development/compilers/flutter/versions/3_22/data.json
@@ -1,20 +1,27 @@
 {
-  "version": "3.22.0",
-  "engineVersion": "f6344b75dcf861d8bf1f1322780b8811f982e31a",
-  "dartVersion": "3.4.0",
+  "version": "3.22.2",
+  "engineVersion": "edd8546116457bdf1c5bdfb13ecb9463d2bb5ed4",
+  "engineSwiftShaderHash": "sha256-mRLCvhNkmHz7Rv6GzXkY7OB1opBSq+ATWZ466qZdgto=",
+  "engineSwiftShaderRev": "2fa7e9b99ae4e70ea5ae2cc9c8d3afb43391384f",
+  "channel": "stable",
+  "engineHashes": {
+    "aarch64-linux": "sha256-OPgevqdMwKhXml+PS5Z1DW0wg843NVN57CiLbXve8kE=",
+    "x86_64-linux": "sha256-OPgevqdMwKhXml+PS5Z1DW0wg843NVN57CiLbXve8kE="
+  },
+  "dartVersion": "3.4.3",
   "dartHash": {
-    "x86_64-linux": "sha256-oDqmWPHx7EwP4EOopZ4/pAG4kuW+CUCq1T/bHDrw2Z8=",
-    "aarch64-linux": "sha256-FRhGusQMp2noDnV4iE8t06sayGMInYCj7VxfrQxoV7U=",
-    "x86_64-darwin": "sha256-dJe18+sfgHsE2CQf05vBkynXp4Pf2otoVM/Kf5m11rU=",
-    "aarch64-darwin": "sha256-HC7/m3zYY98TnqIreOHixwJBxXCpFIof03TZ80xblfs="
+    "x86_64-linux": "sha256-wDIdoWoKlutP8kixd12Lppzv2aYeiTJ1A1Sy6lguXgg=",
+    "aarch64-linux": "sha256-sJBsZBA71Sht8wdUbPVzPv3Zf+vDJXY9w0a7ZC8/aF8=",
+    "x86_64-darwin": "sha256-XWDZae1bMeQsIOdv7BiMNneBKt6Xhras/QXtPukGyKA=",
+    "aarch64-darwin": "sha256-4D1e5EmBoA5eDw50EIVNsMjhCP33fNemmUD8/1WvxOM="
   },
-  "flutterHash": "sha256-UcpprC40itt3nbvENJVytD8M1EYSjKMlpAWJ+GmN7Pg=",
+  "flutterHash": "sha256-7ndnIw72YxNB+VeeejEeRD+xxuLXOcWo322s5CMWzBM=",
   "artifactHashes": {
     "android": {
-      "aarch64-darwin": "sha256-kpcfApS/KcyV1XMGw1YSHBSjJxNfl2WT5JVCe6eMcs8=",
-      "aarch64-linux": "sha256-FL7AYU/fULoX8lvllbUGiG5+RroOwf6bolzsvLmLePA=",
-      "x86_64-darwin": "sha256-kpcfApS/KcyV1XMGw1YSHBSjJxNfl2WT5JVCe6eMcs8=",
-      "x86_64-linux": "sha256-FL7AYU/fULoX8lvllbUGiG5+RroOwf6bolzsvLmLePA="
+      "aarch64-darwin": "sha256-loGG9c6F0cnc5ue7cD6Tk8b79LGijd9YSfKWjlXk+TI=",
+      "aarch64-linux": "sha256-lIxH729tt0p+5LkLguf1lBk7YdinXngKPL05W6XdVDg=",
+      "x86_64-darwin": "sha256-loGG9c6F0cnc5ue7cD6Tk8b79LGijd9YSfKWjlXk+TI=",
+      "x86_64-linux": "sha256-lIxH729tt0p+5LkLguf1lBk7YdinXngKPL05W6XdVDg="
     },
     "fuchsia": {
       "aarch64-darwin": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk=",
@@ -23,38 +30,38 @@
       "x86_64-linux": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk="
     },
     "ios": {
-      "aarch64-darwin": "sha256-tulW5ybnOCiIcUSLEXRlIgSmgZGA8NQHgFmLIpEvPUo=",
-      "aarch64-linux": "sha256-tulW5ybnOCiIcUSLEXRlIgSmgZGA8NQHgFmLIpEvPUo=",
-      "x86_64-darwin": "sha256-tulW5ybnOCiIcUSLEXRlIgSmgZGA8NQHgFmLIpEvPUo=",
-      "x86_64-linux": "sha256-tulW5ybnOCiIcUSLEXRlIgSmgZGA8NQHgFmLIpEvPUo="
+      "aarch64-darwin": "sha256-d/1d8/Md2tzf/Mu4d3RKHl5Jd8u5HzZSGfBKomt1mlo=",
+      "aarch64-linux": "sha256-d/1d8/Md2tzf/Mu4d3RKHl5Jd8u5HzZSGfBKomt1mlo=",
+      "x86_64-darwin": "sha256-d/1d8/Md2tzf/Mu4d3RKHl5Jd8u5HzZSGfBKomt1mlo=",
+      "x86_64-linux": "sha256-d/1d8/Md2tzf/Mu4d3RKHl5Jd8u5HzZSGfBKomt1mlo="
     },
     "linux": {
-      "aarch64-darwin": "sha256-eOBMqZkUTeFOfQHtrnx5KlERY2RLtqwDi9WOv0xcmVk=",
-      "aarch64-linux": "sha256-eOBMqZkUTeFOfQHtrnx5KlERY2RLtqwDi9WOv0xcmVk=",
-      "x86_64-darwin": "sha256-r6trOed2FniMMGLqoqiDKeaPUyAY9o2H63Oh4fPlW/c=",
-      "x86_64-linux": "sha256-r6trOed2FniMMGLqoqiDKeaPUyAY9o2H63Oh4fPlW/c="
+      "aarch64-darwin": "sha256-UYb2OOB0riL+Qrhpke0vYpo0U4buKYcbJRgYSpugJQc=",
+      "aarch64-linux": "sha256-UYb2OOB0riL+Qrhpke0vYpo0U4buKYcbJRgYSpugJQc=",
+      "x86_64-darwin": "sha256-ytfyeJeDnAGDsg98POe3fKAxpq8lNVYlV1wY6p2pkbU=",
+      "x86_64-linux": "sha256-ytfyeJeDnAGDsg98POe3fKAxpq8lNVYlV1wY6p2pkbU="
     },
     "macos": {
-      "aarch64-darwin": "sha256-TRwbutJABHyPUxNb2CBijc3sd3RTtnE/CgasVhKNj3g=",
-      "aarch64-linux": "sha256-TRwbutJABHyPUxNb2CBijc3sd3RTtnE/CgasVhKNj3g=",
-      "x86_64-darwin": "sha256-TRwbutJABHyPUxNb2CBijc3sd3RTtnE/CgasVhKNj3g=",
-      "x86_64-linux": "sha256-TRwbutJABHyPUxNb2CBijc3sd3RTtnE/CgasVhKNj3g="
+      "aarch64-darwin": "sha256-0XEdCeY1KTmtLz/cgZLSfDbjucXk0FpwVIDZuEPqngk=",
+      "aarch64-linux": "sha256-0XEdCeY1KTmtLz/cgZLSfDbjucXk0FpwVIDZuEPqngk=",
+      "x86_64-darwin": "sha256-0XEdCeY1KTmtLz/cgZLSfDbjucXk0FpwVIDZuEPqngk=",
+      "x86_64-linux": "sha256-0XEdCeY1KTmtLz/cgZLSfDbjucXk0FpwVIDZuEPqngk="
     },
     "universal": {
-      "aarch64-darwin": "sha256-05p8hCOMaZlrtsBp+t2Iw0DGLeGiD23NhB42LnoEFrs=",
-      "aarch64-linux": "sha256-y4NwCN+W0EjEpEwuU4u2Yg2hJB4GAdLv95nXUGZ1nWo=",
-      "x86_64-darwin": "sha256-l1M9+ODVGdBfJyt9Ew01vKRE/n2CjimwvcBohOAq/ns=",
-      "x86_64-linux": "sha256-SXCT9jDqFwES6wA8VyGzILbHFlDuslQ+ByOFZgRapVs="
+      "aarch64-darwin": "sha256-TLDwggTgVTe0+v5lCutysF4ygKPiA1b48ImyNDyl7oA=",
+      "aarch64-linux": "sha256-rTAX+i+OhyKIevwSFgoWRHw8bHuQCC0Lx/YVlbpwL6c=",
+      "x86_64-darwin": "sha256-1NztXAPG6HWjk7++TLkq791f5t3Va/wP0I2j3ddmURI=",
+      "x86_64-linux": "sha256-qWZQdDB+yd7i/Cx15K7KQmzbgzxWDeOwcsHkNeDwRqw="
     },
     "web": {
-      "aarch64-darwin": "sha256-urzQGJADfBUgYfo0i1WqMMsz75jZPrs1hn9ZMsEK9u0=",
-      "aarch64-linux": "sha256-urzQGJADfBUgYfo0i1WqMMsz75jZPrs1hn9ZMsEK9u0=",
-      "x86_64-darwin": "sha256-urzQGJADfBUgYfo0i1WqMMsz75jZPrs1hn9ZMsEK9u0=",
-      "x86_64-linux": "sha256-urzQGJADfBUgYfo0i1WqMMsz75jZPrs1hn9ZMsEK9u0="
+      "aarch64-darwin": "sha256-IFg4+IOJbb2Zi4axzL9FezCzp3kLr2gHmEWUupBmxlg=",
+      "aarch64-linux": "sha256-IFg4+IOJbb2Zi4axzL9FezCzp3kLr2gHmEWUupBmxlg=",
+      "x86_64-darwin": "sha256-IFg4+IOJbb2Zi4axzL9FezCzp3kLr2gHmEWUupBmxlg=",
+      "x86_64-linux": "sha256-IFg4+IOJbb2Zi4axzL9FezCzp3kLr2gHmEWUupBmxlg="
     },
     "windows": {
-      "x86_64-darwin": "sha256-vIFhEB7bMewDEu90rTVp/rrHtpijc5iKWCmnlKm52sA=",
-      "x86_64-linux": "sha256-vIFhEB7bMewDEu90rTVp/rrHtpijc5iKWCmnlKm52sA="
+      "x86_64-darwin": "sha256-gTnkbp6cJHiW9nFYIfnHYJ+vMG1nGV5nZLY0LgFQPtg=",
+      "x86_64-linux": "sha256-gTnkbp6cJHiW9nFYIfnHYJ+vMG1nGV5nZLY0LgFQPtg="
     }
   },
   "pubspecLock": {
diff --git a/pkgs/development/compilers/flutter/versions/3_23/data.json b/pkgs/development/compilers/flutter/versions/3_23/data.json
new file mode 100644
index 0000000000000..82233ea5112c2
--- /dev/null
+++ b/pkgs/development/compilers/flutter/versions/3_23/data.json
@@ -0,0 +1,1030 @@
+{
+  "version": "3.23.0-0.1.pre",
+  "engineVersion": "bb10c5466638e963479ba5e64e601e42d1a43447",
+  "engineSwiftShaderHash": "sha256-mRLCvhNkmHz7Rv6GzXkY7OB1opBSq+ATWZ466qZdgto=",
+  "engineSwiftShaderRev": "2fa7e9b99ae4e70ea5ae2cc9c8d3afb43391384f",
+  "channel": "beta",
+  "engineHashes": {
+    "aarch64-linux": "sha256-g169BDV6NtiyriMSgK3GOwhkVi9X23SqB9HOxxtGPK4=",
+    "x86_64-linux": "sha256-g169BDV6NtiyriMSgK3GOwhkVi9X23SqB9HOxxtGPK4="
+  },
+  "dartVersion": "3.5.0-180.3.beta",
+  "dartHash": {
+    "x86_64-linux": "sha256-DXGyUTu9I602lLnDz9BKLfHEAeaMKtbZjxgmPPSTEv0=",
+    "aarch64-linux": "sha256-WFTHw5V6zWrpF7bx5wOQNOMJe+yn1j4rnfRSkW7hN9c=",
+    "x86_64-darwin": "sha256-nUFd3jMj1Totc2WPSToLvtSVNjmhKKWEXwzSKo1yT1w=",
+    "aarch64-darwin": "sha256-O5HYmZVveYGktks7we4uht9ZyaWJli5dSC22lrVqi58="
+  },
+  "flutterHash": "sha256-OFDPPoLvKG+H4Jylc6/NvvEe5g5I/lo4ViYNIUrgQXw=",
+  "artifactHashes": {
+    "android": {
+      "aarch64-darwin": "sha256-UWZ6/XGOoTjfoENRs2f6ZbTcke76ieme4MnTqKVKYXo=",
+      "aarch64-linux": "sha256-orYFnnwdiN0jKTff34moVkBmAc2TWNz053mp0IVehmk=",
+      "x86_64-darwin": "sha256-UWZ6/XGOoTjfoENRs2f6ZbTcke76ieme4MnTqKVKYXo=",
+      "x86_64-linux": "sha256-orYFnnwdiN0jKTff34moVkBmAc2TWNz053mp0IVehmk="
+    },
+    "fuchsia": {
+      "aarch64-darwin": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk=",
+      "aarch64-linux": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk=",
+      "x86_64-darwin": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk=",
+      "x86_64-linux": "sha256-eu0BERdz53CkSexbpu3KA7O6Q4g0s9SGD3t1Snsk3Fk="
+    },
+    "ios": {
+      "aarch64-darwin": "sha256-lAo3yua8IbGiaVLt0JqDtehKROnibx60HtaBLupvILI=",
+      "aarch64-linux": "sha256-lAo3yua8IbGiaVLt0JqDtehKROnibx60HtaBLupvILI=",
+      "x86_64-darwin": "sha256-lAo3yua8IbGiaVLt0JqDtehKROnibx60HtaBLupvILI=",
+      "x86_64-linux": "sha256-lAo3yua8IbGiaVLt0JqDtehKROnibx60HtaBLupvILI="
+    },
+    "linux": {
+      "aarch64-darwin": "sha256-2d3gPOT2kBgHeTXOFOdEOAHkbv7ctXx51rtX497FEmU=",
+      "aarch64-linux": "sha256-2d3gPOT2kBgHeTXOFOdEOAHkbv7ctXx51rtX497FEmU=",
+      "x86_64-darwin": "sha256-LcEITSWg5VdUs9nXRu+mPGxxWqAuRRSbt9RCDeBa+74=",
+      "x86_64-linux": "sha256-LcEITSWg5VdUs9nXRu+mPGxxWqAuRRSbt9RCDeBa+74="
+    },
+    "macos": {
+      "aarch64-darwin": "sha256-b6ETaOTHSU58yLsMorKKhOOA7DkD+RtQ3DIqAJhSDjs=",
+      "aarch64-linux": "sha256-b6ETaOTHSU58yLsMorKKhOOA7DkD+RtQ3DIqAJhSDjs=",
+      "x86_64-darwin": "sha256-b6ETaOTHSU58yLsMorKKhOOA7DkD+RtQ3DIqAJhSDjs=",
+      "x86_64-linux": "sha256-b6ETaOTHSU58yLsMorKKhOOA7DkD+RtQ3DIqAJhSDjs="
+    },
+    "universal": {
+      "aarch64-darwin": "sha256-umn+onoRSmfuoL+ls/68xhCo34mgD1xMdMjUstmMC74=",
+      "aarch64-linux": "sha256-IKGrSAweOTwgesVt2PjUvYeTkpeSDRqXTeZWwd6ikvk=",
+      "x86_64-darwin": "sha256-C7/NtLOpFwyvUMBk7imz0Ovj/AjJ7vf2v6Sd2PZujiA=",
+      "x86_64-linux": "sha256-3W/S7/K30xJC6mA9S2n1rgD7lhUvz2ZDSKq7k/uRi2A="
+    },
+    "web": {
+      "aarch64-darwin": "sha256-dyT9Cj33MmZdOhQwVuqkrxYjWeZxMXE35BKkRHjSKtQ=",
+      "aarch64-linux": "sha256-dyT9Cj33MmZdOhQwVuqkrxYjWeZxMXE35BKkRHjSKtQ=",
+      "x86_64-darwin": "sha256-dyT9Cj33MmZdOhQwVuqkrxYjWeZxMXE35BKkRHjSKtQ=",
+      "x86_64-linux": "sha256-dyT9Cj33MmZdOhQwVuqkrxYjWeZxMXE35BKkRHjSKtQ="
+    },
+    "windows": {
+      "x86_64-darwin": "sha256-0V63HjDy3mqNmGKM/5VVSibg8k7JtSaJ5RXXgk1XltQ=",
+      "x86_64-linux": "sha256-0V63HjDy3mqNmGKM/5VVSibg8k7JtSaJ5RXXgk1XltQ="
+    }
+  },
+  "pubspecLock": {
+    "packages": {
+      "_fe_analyzer_shared": {
+        "dependency": "direct main",
+        "description": {
+          "name": "_fe_analyzer_shared",
+          "sha256": "5aaf60d96c4cd00fe7f21594b5ad6a1b699c80a27420f8a837f4d68473ef09e3",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "68.0.0"
+      },
+      "_macros": {
+        "dependency": "transitive",
+        "description": "dart",
+        "source": "sdk",
+        "version": "0.1.5"
+      },
+      "analyzer": {
+        "dependency": "direct main",
+        "description": {
+          "name": "analyzer",
+          "sha256": "21f1d3720fd1c70316399d5e2bccaebb415c434592d778cce8acb967b8578808",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "6.5.0"
+      },
+      "archive": {
+        "dependency": "direct main",
+        "description": {
+          "name": "archive",
+          "sha256": "80e5141fafcb3361653ce308776cfd7d45e6e9fbb429e14eec571382c0c5fecb",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "3.3.2"
+      },
+      "args": {
+        "dependency": "direct main",
+        "description": {
+          "name": "args",
+          "sha256": "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.5.0"
+      },
+      "async": {
+        "dependency": "direct main",
+        "description": {
+          "name": "async",
+          "sha256": "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.11.0"
+      },
+      "boolean_selector": {
+        "dependency": "direct main",
+        "description": {
+          "name": "boolean_selector",
+          "sha256": "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.1.1"
+      },
+      "browser_launcher": {
+        "dependency": "direct main",
+        "description": {
+          "name": "browser_launcher",
+          "sha256": "6ee4c6b1f68a42e769ef6e663c4f56708522f7bce9d2ab6e308a37b612ffa4ec",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.1.1"
+      },
+      "built_collection": {
+        "dependency": "direct main",
+        "description": {
+          "name": "built_collection",
+          "sha256": "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "5.1.1"
+      },
+      "built_value": {
+        "dependency": "direct main",
+        "description": {
+          "name": "built_value",
+          "sha256": "c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "8.9.2"
+      },
+      "checked_yaml": {
+        "dependency": "direct dev",
+        "description": {
+          "name": "checked_yaml",
+          "sha256": "feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.0.3"
+      },
+      "cli_config": {
+        "dependency": "direct main",
+        "description": {
+          "name": "cli_config",
+          "sha256": "ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.2.0"
+      },
+      "clock": {
+        "dependency": "direct main",
+        "description": {
+          "name": "clock",
+          "sha256": "cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.1.1"
+      },
+      "collection": {
+        "dependency": "direct dev",
+        "description": {
+          "name": "collection",
+          "sha256": "ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.18.0"
+      },
+      "completion": {
+        "dependency": "direct main",
+        "description": {
+          "name": "completion",
+          "sha256": "f11b7a628e6c42b9edc9b0bc3aa490e2d930397546d2f794e8e1325909d11c60",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.0.1"
+      },
+      "convert": {
+        "dependency": "direct main",
+        "description": {
+          "name": "convert",
+          "sha256": "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "3.1.1"
+      },
+      "coverage": {
+        "dependency": "direct main",
+        "description": {
+          "name": "coverage",
+          "sha256": "3945034e86ea203af7a056d98e98e42a5518fff200d6e8e6647e1886b07e936e",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.8.0"
+      },
+      "crypto": {
+        "dependency": "direct main",
+        "description": {
+          "name": "crypto",
+          "sha256": "ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "3.0.3"
+      },
+      "csslib": {
+        "dependency": "direct main",
+        "description": {
+          "name": "csslib",
+          "sha256": "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.0.0"
+      },
+      "dap": {
+        "dependency": "direct main",
+        "description": {
+          "name": "dap",
+          "sha256": "fb7c8a64857d90bedf5c51954b83bee9304b607bcb8a03a89ec37afbf2d683a7",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.2.0"
+      },
+      "dds": {
+        "dependency": "direct main",
+        "description": {
+          "name": "dds",
+          "sha256": "cf3868c2223864529d6e5aa0c07ce9ba0016b9d0e8cb67480c0eb810a42f56bd",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "4.2.1"
+      },
+      "dds_service_extensions": {
+        "dependency": "direct main",
+        "description": {
+          "name": "dds_service_extensions",
+          "sha256": "390ae1d0128bb43ffe11f8e3c6cd3a481c1920492d1026883d379cee50bdf1a2",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.0.0"
+      },
+      "devtools_shared": {
+        "dependency": "direct main",
+        "description": {
+          "name": "devtools_shared",
+          "sha256": "fbe1657c88dd476a70116e33b0d19f8a23b35fd6db93eab9f01fa32cc21a0c49",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "10.0.0-dev.1"
+      },
+      "dtd": {
+        "dependency": "direct main",
+        "description": {
+          "name": "dtd",
+          "sha256": "58ac5c2d628e575dbcdfda44a698cd4c1212663e27fe5f8ced37aea85faa0d30",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.2.0"
+      },
+      "dwds": {
+        "dependency": "direct main",
+        "description": {
+          "name": "dwds",
+          "sha256": "61ebaabb04d779d040b47d3b4d0b3963449ced0920fb8efd81ca6d5e51ccfc1a",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "24.0.0"
+      },
+      "extension_discovery": {
+        "dependency": "direct main",
+        "description": {
+          "name": "extension_discovery",
+          "sha256": "20735622d0763865f9d94c3ecdce4441174530870760253e9d364fb4f3da8688",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.0.0"
+      },
+      "fake_async": {
+        "dependency": "direct main",
+        "description": {
+          "name": "fake_async",
+          "sha256": "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.3.1"
+      },
+      "ffi": {
+        "dependency": "direct main",
+        "description": {
+          "name": "ffi",
+          "sha256": "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.1.2"
+      },
+      "file": {
+        "dependency": "direct main",
+        "description": {
+          "name": "file",
+          "sha256": "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "7.0.0"
+      },
+      "file_testing": {
+        "dependency": "direct dev",
+        "description": {
+          "name": "file_testing",
+          "sha256": "0aaadb4025bd350403f4308ad6c4cea953278d9407814b8342558e4946840fb5",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "3.0.0"
+      },
+      "fixnum": {
+        "dependency": "direct main",
+        "description": {
+          "name": "fixnum",
+          "sha256": "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.1.0"
+      },
+      "flutter_template_images": {
+        "dependency": "direct main",
+        "description": {
+          "name": "flutter_template_images",
+          "sha256": "fd3e55af73c577b9e3f88d4080d3e366cb5c8ef3fbd50b94dfeca56bb0235df6",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "4.2.0"
+      },
+      "frontend_server_client": {
+        "dependency": "direct main",
+        "description": {
+          "name": "frontend_server_client",
+          "sha256": "f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "4.0.0"
+      },
+      "glob": {
+        "dependency": "direct main",
+        "description": {
+          "name": "glob",
+          "sha256": "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.1.2"
+      },
+      "graphs": {
+        "dependency": "direct main",
+        "description": {
+          "name": "graphs",
+          "sha256": "aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.3.1"
+      },
+      "html": {
+        "dependency": "direct main",
+        "description": {
+          "name": "html",
+          "sha256": "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.15.4"
+      },
+      "http": {
+        "dependency": "direct main",
+        "description": {
+          "name": "http",
+          "sha256": "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.13.6"
+      },
+      "http_multi_server": {
+        "dependency": "direct main",
+        "description": {
+          "name": "http_multi_server",
+          "sha256": "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "3.2.1"
+      },
+      "http_parser": {
+        "dependency": "direct main",
+        "description": {
+          "name": "http_parser",
+          "sha256": "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "4.0.2"
+      },
+      "intl": {
+        "dependency": "direct main",
+        "description": {
+          "name": "intl",
+          "sha256": "d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.19.0"
+      },
+      "io": {
+        "dependency": "direct main",
+        "description": {
+          "name": "io",
+          "sha256": "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.0.4"
+      },
+      "js": {
+        "dependency": "direct dev",
+        "description": {
+          "name": "js",
+          "sha256": "c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.7.1"
+      },
+      "json_annotation": {
+        "dependency": "direct dev",
+        "description": {
+          "name": "json_annotation",
+          "sha256": "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "4.9.0"
+      },
+      "json_rpc_2": {
+        "dependency": "direct main",
+        "description": {
+          "name": "json_rpc_2",
+          "sha256": "5e469bffa23899edacb7b22787780068d650b106a21c76db3c49218ab7ca447e",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "3.0.2"
+      },
+      "logging": {
+        "dependency": "direct main",
+        "description": {
+          "name": "logging",
+          "sha256": "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.2.0"
+      },
+      "macros": {
+        "dependency": "transitive",
+        "description": {
+          "name": "macros",
+          "sha256": "a8403c89b36483b4cbf9f1fcd24562f483cb34a5c9bf101cf2b0d8a083cf1239",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.1.0-main.5"
+      },
+      "matcher": {
+        "dependency": "direct main",
+        "description": {
+          "name": "matcher",
+          "sha256": "d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.12.16+1"
+      },
+      "meta": {
+        "dependency": "direct main",
+        "description": {
+          "name": "meta",
+          "sha256": "25dfcaf170a0190f47ca6355bdd4552cb8924b430512ff0cafb8db9bd41fe33b",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.14.0"
+      },
+      "mime": {
+        "dependency": "direct main",
+        "description": {
+          "name": "mime",
+          "sha256": "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.0.5"
+      },
+      "multicast_dns": {
+        "dependency": "direct main",
+        "description": {
+          "name": "multicast_dns",
+          "sha256": "316cc47a958d4bd3c67bd238fe8b44fdfb6133bad89cb191c0c3bd3edb14e296",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.3.2+6"
+      },
+      "mustache_template": {
+        "dependency": "direct main",
+        "description": {
+          "name": "mustache_template",
+          "sha256": "a46e26f91445bfb0b60519be280555b06792460b27b19e2b19ad5b9740df5d1c",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.0.0"
+      },
+      "native_assets_builder": {
+        "dependency": "direct main",
+        "description": {
+          "name": "native_assets_builder",
+          "sha256": "e6612ad01cbc3c4d1b00a1a42aa25aa567950ab10ae1f95721574923540f3bd8",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.7.0"
+      },
+      "native_assets_cli": {
+        "dependency": "direct main",
+        "description": {
+          "name": "native_assets_cli",
+          "sha256": "f54ddc4a3f8cff1d8d63723b4938902da7586a5a47fe3c1bfa226eb80223f32e",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.6.0"
+      },
+      "native_stack_traces": {
+        "dependency": "direct main",
+        "description": {
+          "name": "native_stack_traces",
+          "sha256": "64d2f4bcf3b69326fb9bc91b4dd3a06f94bb5bbc3a65e25ae6467ace0b34bfd3",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.5.7"
+      },
+      "node_preamble": {
+        "dependency": "direct dev",
+        "description": {
+          "name": "node_preamble",
+          "sha256": "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.0.2"
+      },
+      "package_config": {
+        "dependency": "direct main",
+        "description": {
+          "name": "package_config",
+          "sha256": "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.1.0"
+      },
+      "path": {
+        "dependency": "direct main",
+        "description": {
+          "name": "path",
+          "sha256": "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.9.0"
+      },
+      "petitparser": {
+        "dependency": "direct main",
+        "description": {
+          "name": "petitparser",
+          "sha256": "c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "6.0.2"
+      },
+      "platform": {
+        "dependency": "direct main",
+        "description": {
+          "name": "platform",
+          "sha256": "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "3.1.4"
+      },
+      "pool": {
+        "dependency": "direct main",
+        "description": {
+          "name": "pool",
+          "sha256": "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.5.1"
+      },
+      "process": {
+        "dependency": "direct main",
+        "description": {
+          "name": "process",
+          "sha256": "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "5.0.2"
+      },
+      "pub_semver": {
+        "dependency": "direct main",
+        "description": {
+          "name": "pub_semver",
+          "sha256": "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.1.4"
+      },
+      "pubspec_parse": {
+        "dependency": "direct dev",
+        "description": {
+          "name": "pubspec_parse",
+          "sha256": "c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.2.3"
+      },
+      "shelf": {
+        "dependency": "direct main",
+        "description": {
+          "name": "shelf",
+          "sha256": "ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.4.1"
+      },
+      "shelf_packages_handler": {
+        "dependency": "direct main",
+        "description": {
+          "name": "shelf_packages_handler",
+          "sha256": "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "3.0.2"
+      },
+      "shelf_proxy": {
+        "dependency": "direct main",
+        "description": {
+          "name": "shelf_proxy",
+          "sha256": "a71d2307f4393211930c590c3d2c00630f6c5a7a77edc1ef6436dfd85a6a7ee3",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.0.4"
+      },
+      "shelf_static": {
+        "dependency": "direct main",
+        "description": {
+          "name": "shelf_static",
+          "sha256": "a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.1.2"
+      },
+      "shelf_web_socket": {
+        "dependency": "direct main",
+        "description": {
+          "name": "shelf_web_socket",
+          "sha256": "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.0.4"
+      },
+      "source_map_stack_trace": {
+        "dependency": "direct main",
+        "description": {
+          "name": "source_map_stack_trace",
+          "sha256": "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.1.1"
+      },
+      "source_maps": {
+        "dependency": "direct main",
+        "description": {
+          "name": "source_maps",
+          "sha256": "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.10.12"
+      },
+      "source_span": {
+        "dependency": "direct main",
+        "description": {
+          "name": "source_span",
+          "sha256": "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.10.0"
+      },
+      "sse": {
+        "dependency": "direct main",
+        "description": {
+          "name": "sse",
+          "sha256": "fdce3a4ac3ae1c01083d05ded0bcdb7e02857ca2323823548e9e76d2f61638f0",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "4.1.5"
+      },
+      "stack_trace": {
+        "dependency": "direct main",
+        "description": {
+          "name": "stack_trace",
+          "sha256": "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.11.1"
+      },
+      "standard_message_codec": {
+        "dependency": "direct main",
+        "description": {
+          "name": "standard_message_codec",
+          "sha256": "fc7dd712d191b7e33196a0ecf354c4573492bb95995e7166cb6f73b047f9cae0",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.0.1+4"
+      },
+      "stream_channel": {
+        "dependency": "direct main",
+        "description": {
+          "name": "stream_channel",
+          "sha256": "ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.1.2"
+      },
+      "string_scanner": {
+        "dependency": "direct main",
+        "description": {
+          "name": "string_scanner",
+          "sha256": "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.2.0"
+      },
+      "sync_http": {
+        "dependency": "direct main",
+        "description": {
+          "name": "sync_http",
+          "sha256": "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.3.1"
+      },
+      "term_glyph": {
+        "dependency": "direct main",
+        "description": {
+          "name": "term_glyph",
+          "sha256": "a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.2.1"
+      },
+      "test": {
+        "dependency": "direct dev",
+        "description": {
+          "name": "test",
+          "sha256": "d11b55850c68c1f6c0cf00eabded4e66c4043feaf6c0d7ce4a36785137df6331",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.25.5"
+      },
+      "test_api": {
+        "dependency": "direct main",
+        "description": {
+          "name": "test_api",
+          "sha256": "2419f20b0c8677b2d67c8ac4d1ac7372d862dc6c460cdbb052b40155408cd794",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.7.1"
+      },
+      "test_core": {
+        "dependency": "direct main",
+        "description": {
+          "name": "test_core",
+          "sha256": "4d070a6bc36c1c4e89f20d353bfd71dc30cdf2bd0e14349090af360a029ab292",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.6.2"
+      },
+      "typed_data": {
+        "dependency": "direct main",
+        "description": {
+          "name": "typed_data",
+          "sha256": "facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.3.2"
+      },
+      "unified_analytics": {
+        "dependency": "direct main",
+        "description": {
+          "name": "unified_analytics",
+          "sha256": "0271998bc95be272accda218841af6dfc7bb4ef666f6c21dd73d6807c2dfff0e",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "6.1.0"
+      },
+      "usage": {
+        "dependency": "direct main",
+        "description": {
+          "name": "usage",
+          "sha256": "0bdbde65a6e710343d02a56552eeaefd20b735e04bfb6b3ee025b6b22e8d0e15",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "4.1.1"
+      },
+      "uuid": {
+        "dependency": "direct main",
+        "description": {
+          "name": "uuid",
+          "sha256": "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "3.0.7"
+      },
+      "vm_service": {
+        "dependency": "direct main",
+        "description": {
+          "name": "vm_service",
+          "sha256": "7475cb4dd713d57b6f7464c0e13f06da0d535d8b2067e188962a59bac2cf280b",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "14.2.2"
+      },
+      "vm_service_interface": {
+        "dependency": "direct main",
+        "description": {
+          "name": "vm_service_interface",
+          "sha256": "f827453d9a3f8ceae04e389810da26f9b67636bdd13aa2dd9405b110c4daf59c",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.1.0"
+      },
+      "vm_snapshot_analysis": {
+        "dependency": "direct main",
+        "description": {
+          "name": "vm_snapshot_analysis",
+          "sha256": "5a79b9fbb6be2555090f55b03b23907e75d44c3fd7bdd88da09848aa5a1914c8",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.7.6"
+      },
+      "watcher": {
+        "dependency": "direct main",
+        "description": {
+          "name": "watcher",
+          "sha256": "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.1.0"
+      },
+      "web": {
+        "dependency": "direct main",
+        "description": {
+          "name": "web",
+          "sha256": "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "0.5.1"
+      },
+      "web_socket_channel": {
+        "dependency": "direct main",
+        "description": {
+          "name": "web_socket_channel",
+          "sha256": "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.4.5"
+      },
+      "webdriver": {
+        "dependency": "direct main",
+        "description": {
+          "name": "webdriver",
+          "sha256": "003d7da9519e1e5f329422b36c4dcdf18d7d2978d1ba099ea4e45ba490ed845e",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "3.0.3"
+      },
+      "webkit_inspection_protocol": {
+        "dependency": "direct main",
+        "description": {
+          "name": "webkit_inspection_protocol",
+          "sha256": "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "1.2.1"
+      },
+      "xml": {
+        "dependency": "direct main",
+        "description": {
+          "name": "xml",
+          "sha256": "b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "6.5.0"
+      },
+      "yaml": {
+        "dependency": "direct main",
+        "description": {
+          "name": "yaml",
+          "sha256": "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "3.1.2"
+      },
+      "yaml_edit": {
+        "dependency": "direct main",
+        "description": {
+          "name": "yaml_edit",
+          "sha256": "e9c1a3543d2da0db3e90270dbb1e4eebc985ee5e3ffe468d83224472b2194a5f",
+          "url": "https://pub.dev"
+        },
+        "source": "hosted",
+        "version": "2.2.1"
+      }
+    },
+    "sdks": {
+      "dart": ">=3.4.0-282.1.beta <4.0.0"
+    }
+  }
+}
diff --git a/pkgs/development/compilers/flutter/wrapper.nix b/pkgs/development/compilers/flutter/wrapper.nix
index f5b8b2e2059da..c988eba2e5aeb 100644
--- a/pkgs/development/compilers/flutter/wrapper.nix
+++ b/pkgs/development/compilers/flutter/wrapper.nix
@@ -7,7 +7,7 @@
     "universal"
     "web"
   ]
-  ++ lib.optional stdenv.hostPlatform.isLinux "linux"
+  ++ lib.optional (stdenv.hostPlatform.isLinux && !(flutter ? engine)) "linux"
   ++ lib.optional (stdenv.hostPlatform.isx86_64 || stdenv.hostPlatform.isDarwin) "android"
   ++ lib.optionals stdenv.hostPlatform.isDarwin [ "macos" "ios" ]
 , artifactHashes ? flutter.artifactHashes
@@ -145,7 +145,10 @@ in
     mkdir -p $out/bin
     makeWrapper '${immutableFlutter}' $out/bin/flutter \
       --set-default ANDROID_EMULATOR_USE_SYSTEM_LIBS 1 \
-      --suffix PATH : '${lib.makeBinPath (tools ++ buildTools)}' \
+      '' + lib.optionalString (flutter ? engine && flutter.engine.meta.available) ''
+        --set-default FLUTTER_ENGINE "${flutter.engine}" \
+        --add-flags "--local-engine-host ${flutter.engine.outName}" \
+      '' + '' --suffix PATH : '${lib.makeBinPath (tools ++ buildTools)}' \
       --suffix PKG_CONFIG_PATH : "$FLUTTER_PKG_CONFIG_PATH" \
       --suffix LIBRARY_PATH : '${lib.makeLibraryPath appStaticBuildDeps}' \
       --prefix CXXFLAGS "''\t" '${builtins.concatStringsSep " " (includeFlags ++ extraCxxFlags)}' \