// 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 createState() => MainWindowState(); } class MainWindowState extends State { 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); } }