| // Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'dart:io' as io; |
| |
| import 'package:cli_util/cli_components.dart'; |
| import 'package:cli_util/windows_compatibility.dart'; |
| |
| Future<void> main() async { |
| final stdin = io.Platform.isWindows ? Win32AnsiStdin() : io.stdin; |
| |
| // These streams are single subscription, but need to be listenable from |
| // multiple places, so we convert them to broadcast streams. |
| // |
| // In a real app, you would probably have your own stdin listener, which |
| // should ignore events while the dialogs are open. |
| final inputStream = stdin.asBroadcastStream( |
| // Cancel stdin subscription once we have no listeners. |
| onCancel: (subscription) => subscription.cancel(), |
| ); |
| |
| // Hacky way to keep open the stream until we reach the finally block. |
| final subscription = inputStream.listen((_) {}); |
| |
| try { |
| print('How many items do you want in the multiselect dialog?'); |
| final counts = List.generate(9, (i) => '${(i + 1) * 5}'); |
| final countResult = await showSingleSelectDialog(counts, inputStream); |
| if (countResult == null) { |
| print('No count selected, exiting.'); |
| io.exitCode = 1; |
| return; |
| } |
| final count = int.parse(counts[countResult]); |
| print('Got result $count'); |
| |
| final allOptions = List.generate(count, (i) => 'Item #$i'); |
| print('Select multiple items:'); |
| final selectedOptions = await showMultiSelectDialog( |
| allOptions, |
| inputStream, |
| initialSelected: {1, 2}, |
| ); |
| if (selectedOptions == null) { |
| print('Selection cancelled, exiting.'); |
| io.exitCode = 1; |
| return; |
| } |
| |
| print('Selection complete, selected ${selectedOptions.length} item(s):'); |
| for (final index in selectedOptions) { |
| print(' - ${allOptions[index]}'); |
| } |
| } finally { |
| await subscription.cancel(); |
| } |
| } |