import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; import 'constants.dart'; import 'platform_selector.dart'; class GlobalSelectionPage extends StatelessWidget { GlobalSelectionPage({ super.key, required this.onChangedPlatform, }); static const String route = 'global-selection'; static const String title = 'Global Selection Example'; static const String subtitle = 'Context menus in and out of global selection'; static const String url = '$kCodeUrl/global_selection_page.dart'; final PlatformCallback onChangedPlatform; final TextEditingController _controller = TextEditingController( text: 'TextFields still show their specific context menu.', ); @override Widget build(BuildContext context) { return SelectionArea( contextMenuBuilder: (context, selectableRegionState) { return AdaptiveTextSelectionToolbar.buttonItems( anchors: selectableRegionState.contextMenuAnchors, buttonItems: [ ...selectableRegionState.contextMenuButtonItems, ContextMenuButtonItem( onPressed: () { ContextMenuController.removeAny(); Navigator.of(context).pop(); }, label: 'Back', ), ], ); }, child: Scaffold( appBar: AppBar( title: const Text(GlobalSelectionPage.title), actions: [ PlatformSelector( onChangedPlatform: onChangedPlatform, ), IconButton( icon: const Icon(Icons.code), onPressed: () async { if (!await launchUrl(Uri.parse(url))) { throw 'Could not launch $url'; } }, ), ], ), body: Center( child: SizedBox( width: 400.0, child: ListView( children: [ const SizedBox(height: 20.0), const Text( 'This entire page is wrapped in a SelectionArea with a custom context menu. Clicking on any of the plain text, including the AppBar title, will show the custom menu.', ), const SizedBox(height: 40.0), TextField(controller: _controller), const SizedBox(height: 40.0), const SelectableText( 'SelectableText also shows its own separate context menu.'), ], ), ), ), ), ); } }