Skip to content
Merged
Show file tree
Hide file tree
Changes from 87 commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
d1cd1e7
Initial commit
davidhicks980 Nov 4, 2024
05ff4bb
Renamed parameters
davidhicks980 Nov 6, 2024
e2a2ac2
Changed overlay positioning to root overlay
davidhicks980 Nov 10, 2024
968ca1b
Added tests from MenuAnchor, fixed documentation, and made anchor pos…
davidhicks980 Nov 11, 2024
9c58361
Add examples and tests
davidhicks980 Nov 11, 2024
c1e1882
Added documentation to examples.
davidhicks980 Nov 11, 2024
771225b
Commented out overlay semantics test
davidhicks980 Nov 11, 2024
ffe8119
Implement new MenuAnchor
davidhicks980 Nov 11, 2024
29ced3b
Apply suggestions from code review
davidhicks980 Nov 12, 2024
fec1a4c
Fixed missing newline at eof
davidhicks980 Nov 12, 2024
f07cb67
Whitespace and documentation fixes
davidhicks980 Nov 12, 2024
9b783ca
Skipped test and whitespace fixes
davidhicks980 Nov 12, 2024
e97d529
Whitespace fixes
davidhicks980 Nov 12, 2024
6ac3238
Fixed traversal shortcuts not bound to actions test
davidhicks980 Nov 12, 2024
df518fd
Apply suggestions from code review
davidhicks980 Nov 12, 2024
d04c420
Added reduced test set annotation
davidhicks980 Nov 12, 2024
fa11f8b
Fixed imports on RawMenuAnchor
davidhicks980 Nov 12, 2024
e557c60
Update packages/flutter/lib/src/widgets/raw_menu_anchor.dart
davidhicks980 Nov 12, 2024
ec0ecaf
Add empty line to SimpleMenuApp
davidhicks980 Nov 12, 2024
7c22c2b
platformBrightness -> platformBrightnessOf
davidhicks980 Nov 12, 2024
bb36c4f
Fix broken hover test
davidhicks980 Nov 13, 2024
4c291ef
change MenuItemButton closeChildren to close
davidhicks980 Nov 13, 2024
08586bb
Pass root overlay overlayBuilder
davidhicks980 Nov 14, 2024
be45d28
Accidentally switched around the layerlink
davidhicks980 Nov 14, 2024
9e511b4
Fixed layerlink!
davidhicks980 Nov 14, 2024
ecc6015
TapRegionGroupId wasn't passed to menu anchor tap region
davidhicks980 Nov 14, 2024
65a3b94
Changed offsetted to offset, since offsetted is rarely used (though t…
davidhicks980 Nov 14, 2024
a84c9ab
Fixed leaky and platform-dependent tests
davidhicks980 Nov 14, 2024
e6c8557
Removed redundant kIsWeb check
davidhicks980 Nov 14, 2024
569bc69
Move MediaQuery into a builder
davidhicks980 Nov 14, 2024
3ee30c2
Fix mediaquery
davidhicks980 Nov 14, 2024
d9e6904
Replaced _RawMenuAnchor._maybeOf with MenuController.maybeOf _anchor
davidhicks980 Nov 14, 2024
347f641
Fixed _internalMenuController initial assignment
davidhicks980 Nov 15, 2024
360744c
Apply whitespace fixes and remove golden.
davidhicks980 Nov 21, 2024
76bf3e9
Forgot one golden
davidhicks980 Nov 21, 2024
7c4d2cf
Very cosmetic changes in test comments
bleroux Nov 28, 2024
c3fdc65
Merge branch 'flutter:master' into raw_menu_anchor
davidhicks980 Dec 3, 2024
cd74b91
Fix anchorRect respects ancestor transformations
davidhicks980 Dec 3, 2024
1b4d05e
Apply suggestions from code review
davidhicks980 Dec 13, 2024
6816dcb
Merge branch 'master' into raw_menu_anchor
davidhicks980 Dec 13, 2024
3d9c2a1
Added useRootOverlay property and refined nomenclature.
davidhicks980 Dec 15, 2024
f0ee3c1
Remove duplicate OverlayPortal branch.
davidhicks980 Dec 15, 2024
4dbe849
Fix overlay branch removal
davidhicks980 Dec 15, 2024
59ddbe3
Merge remote-tracking branch 'origin/master' into raw_menu_anchor
davidhicks980 Dec 20, 2024
9a94a49
Format raw_menu_anchor_test
davidhicks980 Dec 20, 2024
314e9a9
Fix menu anchor test
davidhicks980 Dec 20, 2024
8d1deb1
Remove unnecessary null coalescing statement.
davidhicks980 Dec 20, 2024
0513904
Replace menuChildren with child, pass Widget to builders.
davidhicks980 Dec 22, 2024
db371b1
Fix testing errors and add assertions
davidhicks980 Dec 22, 2024
3486ed4
Fixed CI formatting.
davidhicks980 Dec 23, 2024
302d415
Merge branch 'master' into raw_menu_anchor
davidhicks980 Dec 23, 2024
dc5192c
Merge branch 'master' into raw_menu_anchor
davidhicks980 Dec 29, 2024
187a241
Fix snippet error
davidhicks980 Dec 29, 2024
9f89939
Move _RawMenuAnchor properties into constructor
davidhicks980 Dec 29, 2024
25483fc
Refactor _findClosestScreen for performance
davidhicks980 Dec 29, 2024
6aaf82e
Apply Nate's changes
davidhicks980 Dec 29, 2024
a7f026d
Add createDependency tests
davidhicks980 Dec 29, 2024
0ce1226
Add hover traversal tests for menubar example
davidhicks980 Dec 30, 2024
2c2a441
Run format
davidhicks980 Dec 30, 2024
953ae7b
Merge branch 'master' into raw_menu_anchor
davidhicks980 Jan 2, 2025
67f7665
Merge branch 'master' into raw_menu_anchor
davidhicks980 Jan 18, 2025
e469999
Add fixes from Tong review.
davidhicks980 Jan 18, 2025
2a84aea
Make private params required
davidhicks980 Jan 18, 2025
59915d8
Fix errors in example,
davidhicks980 Jan 18, 2025
192a8c1
Remove redundant padding
davidhicks980 Jan 18, 2025
4e475d4
Merge branch 'master' into raw_menu_anchor
davidhicks980 Jan 20, 2025
112c23f
Remove _RawMenuAnchorOverlay intermediary.
davidhicks980 Jan 23, 2025
5fa25ba
Merge branch 'master' into raw_menu_anchor
davidhicks980 Jan 23, 2025
cb8b972
Fixed broken examples
davidhicks980 Jan 23, 2025
83e15a5
Merge branch 'master' into raw_menu_anchor
davidhicks980 Jan 23, 2025
f635576
Merge branch 'master' into raw_menu_anchor
davidhicks980 Jan 23, 2025
e11b1f1
Rename withOverlayBuilder to fromOverlayBuilder
davidhicks980 Jan 23, 2025
4fe9843
Tong suggestions and example 2 test fix.
davidhicks980 Jan 24, 2025
158e92a
Fix example animation test
davidhicks980 Jan 24, 2025
fef8e05
Fix formatting
davidhicks980 Jan 24, 2025
b6d3da6
Indent 2_test
davidhicks980 Jan 24, 2025
8d183aa
Documentation fixes.
davidhicks980 Jan 24, 2025
13c1323
Remove default constructor
davidhicks980 Jan 27, 2025
e9e19bc
Fix Bruno comments
davidhicks980 Jan 28, 2025
2d01fea
Fix undefined snippet variable
davidhicks980 Jan 28, 2025
2d878a9
Fix shown imports
davidhicks980 Jan 28, 2025
8bca9cb
Convert _RawMenuAnchorState to _RawMenuAnchorBaseMixin
davidhicks980 Jan 28, 2025
c50c719
Merge branch 'main' of github.com:flutter/flutter into raw_menu_anchor
davidhicks980 Jan 28, 2025
4483696
Format menu anchor
davidhicks980 Jan 28, 2025
9c46904
Fix old docs
davidhicks980 Jan 28, 2025
4be73d8
Add additional documentation to _RawMenuAnchorBaseMixin
davidhicks980 Jan 28, 2025
1b27b55
Fix scopes route errors.
davidhicks980 Jan 29, 2025
6b3f351
Fix menu anchor style formatting
davidhicks980 Jan 29, 2025
6429823
Add maybeIsOpenOf and removed createDependency on maybeOf
davidhicks980 Jan 31, 2025
ace0e3e
Made MenuController required.
davidhicks980 Jan 31, 2025
b3d0979
Use getInheritedWidgetOfExactType for _MenuAnchorScope and detach Men…
davidhicks980 Jan 31, 2025
f3e24d2
Fix test errors.
davidhicks980 Jan 31, 2025
94ee602
Remove position reference.
davidhicks980 Jan 31, 2025
22695f1
Merge branch 'master' into raw_menu_anchor
davidhicks980 Jan 31, 2025
55cd12d
Fix semantics node
davidhicks980 Feb 1, 2025
4cd4009
Merge branch 'master' into raw_menu_anchor
davidhicks980 Feb 1, 2025
1daeeb8
Fix MenuController documentation.
davidhicks980 Feb 1, 2025
ea46e13
Fix MenuController documentation
davidhicks980 Feb 1, 2025
206e5e5
Merge branch 'master' into raw_menu_anchor
chunhtai Feb 3, 2025
e1f30ae
Merge branch 'master' into raw_menu_anchor
chunhtai Feb 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
184 changes: 184 additions & 0 deletions examples/api/lib/widgets/raw_menu_anchor/raw_menu_anchor.0.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
// 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.

import 'package:flutter/material.dart';
import 'package:flutter/semantics.dart';
import 'package:flutter/services.dart';

/// Flutter code sample for a [RawMenuAnchor] that demonstrates
/// how to create a simple menu.
void main() {
runApp(const RawMenuAnchorApp());
}

enum Animal {
cat('Cat', leading: Text('🦁')),
kitten('Kitten', leading: Text('🐱')),
felisCatus('Felis catus', leading: Text('🐈')),
dog('Dog', leading: Text('🐕'));

const Animal(this.label, {this.leading});
final String label;
final Widget? leading;
}

class RawMenuAnchorExample extends StatefulWidget {
const RawMenuAnchorExample({super.key});

@override
State<RawMenuAnchorExample> createState() => _RawMenuAnchorExampleState();
}

class _RawMenuAnchorExampleState extends State<RawMenuAnchorExample> {
final FocusNode focusNode = FocusNode();
final MenuController controller = MenuController();
Animal? _selectedAnimal;

@override
void dispose() {
focusNode.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
final ThemeData theme = Theme.of(context);
return UnconstrainedBox(
clipBehavior: Clip.hardEdge,
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text('Favorite Animal:', style: theme.textTheme.titleMedium),
const SizedBox(width: 8),
CustomMenu(
controller: controller,
focusNode: focusNode,
anchor: FilledButton(
focusNode: focusNode,
style: FilledButton.styleFrom(fixedSize: const Size(172, 36)),
onPressed: () {
if (controller.isOpen) {
controller.close();
} else {
controller.open();
}
},
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Expanded(flex: 3, child: Text(_selectedAnimal?.label ?? 'Select One')),
const Flexible(child: Icon(Icons.arrow_drop_down, size: 16)),
],
),
),
children: <Widget>[
for (final Animal animal in Animal.values)
MenuItemButton(
autofocus: _selectedAnimal == animal,
onPressed: () {
setState(() {
_selectedAnimal = animal;
});
controller.close();
},
leadingIcon: SizedBox(width: 24, child: Center(child: animal.leading)),
trailingIcon:
_selectedAnimal == animal ? const Icon(Icons.check, size: 20) : null,
child: Text(animal.label),
),
],
),
],
),
);
}
}

class CustomMenu extends StatelessWidget {
const CustomMenu({
super.key,
required this.children,
required this.anchor,
required this.controller,
required this.focusNode,
});

final List<Widget> children;
final Widget anchor;
final MenuController controller;
final FocusNode focusNode;

static const Map<ShortcutActivator, Intent> _shortcuts = <ShortcutActivator, Intent>{
SingleActivator(LogicalKeyboardKey.gameButtonA): ActivateIntent(),
SingleActivator(LogicalKeyboardKey.escape): DismissIntent(),
SingleActivator(LogicalKeyboardKey.arrowDown): DirectionalFocusIntent(TraversalDirection.down),
SingleActivator(LogicalKeyboardKey.arrowUp): DirectionalFocusIntent(TraversalDirection.up),
};

@override
Widget build(BuildContext context) {
return RawMenuAnchor(
controller: controller,
childFocusNode: focusNode,
overlayBuilder: (BuildContext context, RawMenuOverlayInfo info) {
return Positioned(
top: info.anchorRect.bottom + 4,
left: info.anchorRect.left,
// The overlay will be treated as a dialog. SemanticsProperties.label can
// be set to a localized string to describe the dialog.
child: Semantics.fromProperties(
explicitChildNodes: true,
properties: const SemanticsProperties(scopesRoute: true),
child: TapRegion(
groupId: info.tapRegionGroupId,
onTapOutside: (PointerDownEvent event) {
MenuController.maybeOf(context)?.close();
},
child: FocusScope(
child: IntrinsicWidth(
child: Container(
clipBehavior: Clip.antiAlias,
constraints: const BoxConstraints(minWidth: 168),
padding: const EdgeInsets.symmetric(vertical: 6),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: BorderRadius.circular(6),
boxShadow: kElevationToShadow[4],
),
child: Shortcuts(shortcuts: _shortcuts, child: Column(children: children)),
),
),
),
),
),
);
},
child: anchor,
);
}
}

class RawMenuAnchorApp extends StatelessWidget {
const RawMenuAnchorApp({super.key});

static const ButtonStyle menuButtonStyle = ButtonStyle(
overlayColor: WidgetStatePropertyAll<Color>(Color.fromARGB(55, 139, 195, 255)),
iconSize: WidgetStatePropertyAll<double>(17),
padding: WidgetStatePropertyAll<EdgeInsets>(EdgeInsets.symmetric(horizontal: 12)),
);

@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.from(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.blue,
dynamicSchemeVariant: DynamicSchemeVariant.vibrant,
),
).copyWith(menuButtonTheme: const MenuButtonThemeData(style: menuButtonStyle)),
home: const Scaffold(body: Center(child: RawMenuAnchorExample())),
);
}
}
Loading