Skip to content

Commit 2f053f7

Browse files
authored
feat: support printing app version via -v/--version CLI flag (#3255)
1 parent 6e969f6 commit 2f053f7

3 files changed

Lines changed: 32 additions & 6 deletions

File tree

lib/main.dart

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
import 'dart:ffi' as ffi;
2+
import 'dart:io';
3+
14
import 'package:pslab/providers/sht21_provider.dart';
5+
import 'package:flutter/foundation.dart';
26
import 'package:flutter/material.dart';
37
import 'package:flutter_screenutil/flutter_screenutil.dart';
8+
import 'package:package_info_plus/package_info_plus.dart';
49
import 'package:provider/provider.dart';
510
import 'package:pslab/l10n/app_localizations.dart';
611
import 'package:pslab/providers/board_state_provider.dart';
@@ -30,9 +35,22 @@ import 'package:pslab/view/wave_generator_screen.dart';
3035
import 'package:pslab/view/experiments_screen.dart';
3136
import 'constants.dart';
3237

33-
void main() {
34-
setupLocator();
38+
void main(List<String> args) async {
3539
WidgetsFlutterBinding.ensureInitialized();
40+
41+
if (!kIsWeb &&
42+
(Platform.isWindows || Platform.isLinux || Platform.isMacOS) &&
43+
args.any((a) => a == '-v' || a == '--version')) {
44+
if (Platform.isWindows) {
45+
_attachParentConsole();
46+
}
47+
final info = await PackageInfo.fromPlatform();
48+
stdout.writeln('${info.appName} ${info.version}+${info.buildNumber}');
49+
await stdout.flush();
50+
exit(0);
51+
}
52+
53+
setupLocator();
3654
runApp(
3755
MultiProvider(
3856
providers: [
@@ -157,6 +175,14 @@ class _LocaleAware extends StatelessWidget {
157175
}
158176
}
159177

178+
void _attachParentConsole() {
179+
const attachParentProcess = 0xFFFFFFFF;
180+
final kernel32 = ffi.DynamicLibrary.open('kernel32.dll');
181+
final attachConsole = kernel32.lookupFunction<ffi.Int32 Function(ffi.Uint32),
182+
int Function(int)>('AttachConsole');
183+
attachConsole(attachParentProcess);
184+
}
185+
160186
void _preCacheImages(BuildContext context) {
161187
for (final path in instrumentIcons) {
162188
precacheImage(AssetImage(path), context);

pubspec.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ packages:
266266
source: hosted
267267
version: "1.3.3"
268268
ffi:
269-
dependency: "direct overridden"
269+
dependency: "direct main"
270270
description:
271271
name: ffi
272272
sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45"
@@ -1587,5 +1587,5 @@ packages:
15871587
source: hosted
15881588
version: "3.1.3"
15891589
sdks:
1590-
dart: ">=3.10.3 <4.0.0"
1591-
flutter: ">=3.41.5"
1590+
dart: ">=3.11.0 <4.0.0"
1591+
flutter: ">=3.41.9"

test_integration/screenshots.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ void main() async {
1919

2020
group('E2E Group', () {
2121
testWidgets('Take Screenshots', (tester) async {
22-
app.main();
22+
app.main([]);
2323
await tester.pumpAndSettle();
2424

2525
final instrumentsScreenTitle =

0 commit comments

Comments
 (0)