diff --git a/packages/package_info_plus/lib/package_info_plus.dart b/packages/package_info_plus/lib/package_info_plus.dart index de45a20873..a51fdc8040 100644 --- a/packages/package_info_plus/lib/package_info_plus.dart +++ b/packages/package_info_plus/lib/package_info_plus.dart @@ -5,7 +5,7 @@ import 'dart:async'; import 'dart:io' show Platform; -import 'package:flutter/foundation.dart' show visibleForTesting; +import 'package:flutter/foundation.dart' show kIsWeb, visibleForTesting; import 'package:package_info_plus_platform_interface/package_info_platform_interface.dart'; import 'package:package_info_plus_windows/package_info_plus_windows.dart'; @@ -40,7 +40,7 @@ class PackageInfo { // of dart plugins is implemented. // See https://github.com/flutter/flutter/issues/52267 for more details. static PackageInfoPlatform get _platform { - __platform ??= Platform.isWindows && !_disablePlatformOverride + __platform ??= !kIsWeb && Platform.isWindows && !_disablePlatformOverride ? PackageInfoWindows() : PackageInfoPlatform.instance; return __platform; diff --git a/packages/package_info_plus_windows/lib/package_info_plus_windows.dart b/packages/package_info_plus_windows/lib/package_info_plus_windows.dart index 666f9cbc4b..e31a0ec651 100644 --- a/packages/package_info_plus_windows/lib/package_info_plus_windows.dart +++ b/packages/package_info_plus_windows/lib/package_info_plus_windows.dart @@ -1,36 +1,5 @@ -/// The Windows implementation of `package_info_plus`. -library package_info_plus_windows; - -import 'dart:io'; -import 'dart:ffi'; - -import 'package:ffi/ffi.dart'; -import 'package:package_info_plus_platform_interface/package_info_data.dart'; -import 'package:package_info_plus_platform_interface/package_info_platform_interface.dart'; -import 'package:win32/win32.dart'; - -part 'src/file_version_info.dart'; - -/// The Windows implementation of [PackageInfoPlatform]. -class PackageInfoWindows extends PackageInfoPlatform { - /// Returns a map with the following keys: - /// appName, packageName, version, buildNumber - @override - Future getAll() { - final info = _FileVersionInfo(Platform.resolvedExecutable); - final versions = info.productVersion.split('+'); - final data = PackageInfoData( - appName: info.productName, - packageName: info.internalName, - version: versions.getOrNull(0), - buildNumber: versions.getOrNull(1), - ); - info.dispose(); - return Future.value(data); - } -} - -extension _GetOrNull on List { - T getOrNull(int index) => _checkIndex(index) ? this[index] : null; - bool _checkIndex(int index) => index >= 0 && index < length; -} +// package_info_plus_windows is implemented using FFI; export a stub for +// platforms that don't support FFI (e.g., web) to avoid having transitive +// dependencies break web compilation. +export 'src/package_info_plus_windows_stub.dart' + if (dart.library.ffi) 'src/package_info_plus_windows_real.dart'; diff --git a/packages/package_info_plus_windows/lib/src/package_info_plus_windows_real.dart b/packages/package_info_plus_windows/lib/src/package_info_plus_windows_real.dart new file mode 100644 index 0000000000..67957762c3 --- /dev/null +++ b/packages/package_info_plus_windows/lib/src/package_info_plus_windows_real.dart @@ -0,0 +1,36 @@ +/// The Windows implementation of `package_info_plus`. +library package_info_plus_windows; + +import 'dart:io'; +import 'dart:ffi'; + +import 'package:ffi/ffi.dart'; +import 'package:package_info_plus_platform_interface/package_info_data.dart'; +import 'package:package_info_plus_platform_interface/package_info_platform_interface.dart'; +import 'package:win32/win32.dart'; + +part 'file_version_info.dart'; + +/// The Windows implementation of [PackageInfoPlatform]. +class PackageInfoWindows extends PackageInfoPlatform { + /// Returns a map with the following keys: + /// appName, packageName, version, buildNumber + @override + Future getAll() { + final info = _FileVersionInfo(Platform.resolvedExecutable); + final versions = info.productVersion.split('+'); + final data = PackageInfoData( + appName: info.productName, + packageName: info.internalName, + version: versions.getOrNull(0), + buildNumber: versions.getOrNull(1), + ); + info.dispose(); + return Future.value(data); + } +} + +extension _GetOrNull on List { + T getOrNull(int index) => _checkIndex(index) ? this[index] : null; + bool _checkIndex(int index) => index >= 0 && index < length; +} diff --git a/packages/package_info_plus_windows/lib/src/package_info_plus_windows_stub.dart b/packages/package_info_plus_windows/lib/src/package_info_plus_windows_stub.dart new file mode 100644 index 0000000000..349c386f50 --- /dev/null +++ b/packages/package_info_plus_windows/lib/src/package_info_plus_windows_stub.dart @@ -0,0 +1,21 @@ +import 'package:package_info_plus_platform_interface/package_info_data.dart'; +import 'package:package_info_plus_platform_interface/package_info_platform_interface.dart'; + +/// A stub implementation to satisfy compilation of multi-platform packages that +/// depend on package_info_plus_windows. This should never actually be created. +/// +/// Notably, because package_info_plus needs to manually register +/// package_info_plus_windows, anything with a transitive dependency on +/// package_info_plus will also depend on package_info_plus_windows, not just at +/// the pubspec level but the code level. +class PackageInfoWindows extends PackageInfoPlatform { + /// Errors on attempted instantiation of the stub. It exists only to satisfy + /// compile-time dependencies, and should never actually be created. + PackageInfoWindows() { + assert(false); + } + + /// Stub + @override + Future getAll() => null; +}