Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/package_info_plus/lib/package_info_plus.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<PackageInfoData> 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<T> on List<T> {
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';
Original file line number Diff line number Diff line change
@@ -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<PackageInfoData> 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<T> on List<T> {
T getOrNull(int index) => _checkIndex(index) ? this[index] : null;
bool _checkIndex(int index) => index >= 0 && index < length;
}
Original file line number Diff line number Diff line change
@@ -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<PackageInfoData> getAll() => null;
}