blob: 6ed7262f1ddaf19c6fc0ee31e017f0c519726ace [file] [log] [blame] [edit]
// 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/material.dart';
import 'package:flutter/src/widgets/_window.dart';
import 'package:flutter/src/widgets/_window_positioner.dart';
void main() {
try {
WidgetsFlutterBinding.ensureInitialized();
runWidget(
RegularWindow(
controller: RegularWindowController(
preferredSize: const Size(800, 600),
preferredConstraints: const BoxConstraints(
minWidth: 640,
minHeight: 480,
),
title: 'Example Window',
),
child: const MaterialApp(home: MyApp()),
),
);
} on UnsupportedError catch (_) {
// TODO(mattkae): Remove this catch block when satellite windows are supported in tests.
// For now, we need to catch the error so that the API smoke tests pass.
runApp(
MaterialApp(
home: Scaffold(body: Center(child: Text('Unsupported'))),
),
);
}
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _CallbackSatelliteDelegate extends SatelliteWindowControllerDelegate {
_CallbackSatelliteDelegate({required this.onDestroyCallback});
final VoidCallback onDestroyCallback;
@override
void onWindowDestroyed() {
onDestroyCallback();
}
}
class _MyAppState extends State<MyApp> {
SatelliteWindowController? _satelliteController;
@override
Widget build(BuildContext context) {
final List<Widget> children = <Widget>[
ElevatedButton(
onPressed: () {
setState(() {
_satelliteController ??= SatelliteWindowController(
parent: WindowScope.of(context),
initialPositioner: const WindowPositioner(
parentAnchor: WindowPositionerAnchor.right,
childAnchor: WindowPositionerAnchor.left,
),
preferredSize: const Size(300, 200),
title: 'Satellite Window',
delegate: _CallbackSatelliteDelegate(
onDestroyCallback: () {
setState(() {
_satelliteController = null;
});
},
),
);
});
},
child: const Text('Show Satellite'),
),
];
if (_satelliteController != null) {
children.add(
SatelliteWindow(
controller: _satelliteController!,
child: Container(
padding: const EdgeInsets.all(8),
color: Colors.black,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const Text(
'This is a satellite window',
style: TextStyle(color: Colors.white),
),
const SizedBox(height: 8),
ElevatedButton(
onPressed: () {
setState(() {
_satelliteController?.destroy();
});
},
child: const Text('Close'),
),
],
),
),
),
);
}
return Scaffold(
body: Center(
child: Row(mainAxisSize: MainAxisSize.min, children: children),
),
);
}
}