| // Copyright 2014 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // TODO(mattkae): remove invalid_use_of_internal_member ignore comment when this API is stable. | |
| // See: https://github.com/flutter/flutter/issues/177586 | |
| // ignore_for_file: invalid_use_of_internal_member | |
| // ignore_for_file: implementation_imports | |
| import 'package:flutter/widgets.dart'; | |
| import 'package:flutter/src/widgets/_window.dart'; | |
| void main() { | |
| try { | |
| WidgetsFlutterBinding.ensureInitialized(); | |
| final RegularWindowController controller = RegularWindowController( | |
| preferredSize: const Size(800, 600), | |
| ); | |
| runWidget( | |
| WindowManager( | |
| child: RegularWindow(controller: controller, child: const MainWindow()), | |
| ), | |
| ); | |
| } on UnsupportedError catch (e) { | |
| // TODO(mattkae): Remove this catch block when windowing is supported in tests. | |
| // For now, we need to catch the error so that the API smoke tests pass. | |
| runApp( | |
| WidgetsApp( | |
| color: const Color(0xFFFFFFFF), | |
| builder: (BuildContext context, Widget? child) { | |
| return Center( | |
| child: Text( | |
| e.message ?? 'Unsupported', | |
| textDirection: TextDirection.ltr, | |
| ), | |
| ); | |
| }, | |
| ), | |
| ); | |
| } | |
| } | |
| class MainWindow extends StatefulWidget { | |
| const MainWindow({super.key}); | |
| @override | |
| State<StatefulWidget> createState() => MainWindowState(); | |
| } | |
| class MainWindowState extends State<MainWindow> { | |
| WindowEntry? entry; | |
| void _openDialog(BuildContext context) { | |
| final WindowRegistry? registry = WindowRegistry.maybeOf(context); | |
| assert(registry != null); | |
| entry = WindowEntry( | |
| controller: DialogWindowController( | |
| parent: WindowScope.of(context), | |
| preferredSize: const Size(400, 300), | |
| delegate: _DialogWindowControllerDelegate( | |
| mainWindow: this, | |
| registry: registry!, | |
| ), | |
| ), | |
| builder: (BuildContext context) { | |
| return const SizedBox.shrink(); | |
| }, | |
| ); | |
| registry.register(entry!); | |
| } | |
| void closeDialog(WindowRegistry registry) { | |
| if (entry != null) { | |
| registry.unregister(entry!); | |
| entry = null; | |
| } | |
| } | |
| @override | |
| Widget build(BuildContext context) { | |
| return WidgetsApp( | |
| color: const Color(0xFFFFFFFF), | |
| builder: (BuildContext context, Widget? child) { | |
| return Center( | |
| child: GestureDetector( | |
| onTap: () => _openDialog(context), | |
| child: const Text( | |
| 'Open a dialog', | |
| textDirection: TextDirection.ltr, | |
| ), | |
| ), | |
| ); | |
| }, | |
| ); | |
| } | |
| } | |
| class _DialogWindowControllerDelegate extends DialogWindowControllerDelegate { | |
| _DialogWindowControllerDelegate({ | |
| required this.mainWindow, | |
| required this.registry, | |
| }); | |
| final MainWindowState mainWindow; | |
| final WindowRegistry registry; | |
| @override | |
| void onWindowDestroyed() { | |
| super.onWindowDestroyed(); | |
| mainWindow.closeDialog(registry); | |
| } | |
| } |