From d8a03a974babbb5decc67ec858359a1dd31ae526 Mon Sep 17 00:00:00 2001 From: Alexandru Mariuti Date: Tue, 24 Sep 2024 11:11:52 +0100 Subject: [PATCH 1/5] fix/context-menu-right-click --- lib/shadcn_ui.dart | 2 +- lib/src/app.dart | 12 -- lib/src/components/context_menu.dart | 63 +++++++-- lib/src/components/popover.dart | 50 ++++--- lib/src/utils/disable_context_menu/web.dart | 90 ------------ .../non_web.dart | 6 +- lib/src/utils/web_context_menu/web.dart | 130 ++++++++++++++++++ .../web_context_menu.dart} | 0 8 files changed, 214 insertions(+), 139 deletions(-) delete mode 100644 lib/src/utils/disable_context_menu/web.dart rename lib/src/utils/{disable_context_menu => web_context_menu}/non_web.dart (64%) create mode 100644 lib/src/utils/web_context_menu/web.dart rename lib/src/utils/{disable_context_menu/disable_context_menu.dart => web_context_menu/web_context_menu.dart} (100%) diff --git a/lib/shadcn_ui.dart b/lib/shadcn_ui.dart index f681d6a..9a29b23 100644 --- a/lib/shadcn_ui.dart +++ b/lib/shadcn_ui.dart @@ -97,7 +97,7 @@ export 'src/utils/provider.dart' hide ProviderReadExt, ProviderWatchExt; export 'src/utils/responsive.dart'; export 'src/utils/states_controller.dart'; export 'src/utils/mouse_area.dart'; -export 'src/utils/disable_context_menu/disable_context_menu.dart'; +export 'src/utils/web_context_menu/web_context_menu.dart'; // External libraries export 'package:flutter_animate/flutter_animate.dart' hide Effect; diff --git a/lib/src/app.dart b/lib/src/app.dart index aaf89a3..be8877e 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -1,10 +1,7 @@ // ignore_for_file: lines_longer_than_80_chars import 'package:flutter/cupertino.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/semantics.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart' show GlobalCupertinoLocalizations, @@ -557,15 +554,6 @@ class _ShadAppState extends State { yield GlobalWidgetsLocalizations.delegate; } - @override - void initState() { - super.initState(); - if (kIsWeb) { - // needed for disabling the native context menu on web - SemanticsBinding.instance.ensureSemantics(); - } - } - @override void dispose() { heroController.dispose(); diff --git a/lib/src/components/context_menu.dart b/lib/src/components/context_menu.dart index c042256..f619eab 100644 --- a/lib/src/components/context_menu.dart +++ b/lib/src/components/context_menu.dart @@ -1,11 +1,17 @@ +import 'dart:async'; import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_animate/flutter_animate.dart'; -import 'package:shadcn_ui/shadcn_ui.dart'; -import 'package:shadcn_ui/src/utils/disable_context_menu/disable_context_menu.dart'; +import 'package:shadcn_ui/src/components/button.dart'; +import 'package:shadcn_ui/src/components/popover.dart'; +import 'package:shadcn_ui/src/raw_components/portal.dart'; +import 'package:shadcn_ui/src/theme/components/decorator.dart'; +import 'package:shadcn_ui/src/theme/theme.dart'; +import 'package:shadcn_ui/src/utils/gesture_detector.dart'; +import 'package:shadcn_ui/src/utils/mouse_area.dart'; import 'package:shadcn_ui/src/utils/provider.dart'; const kContextMenuGroupId = ValueKey('context-menu'); @@ -91,6 +97,14 @@ class _ShadContextMenuRegionState extends State { ShadContextMenuController(isOpen: widget.visible ?? false)); Offset? offset; + @override + void initState() { + super.initState(); + print('test7'); + print('init state context menu region'); + print('created identifier ${identifier.toString()}'); + } + @override void didUpdateWidget(covariant ShadContextMenuRegion oldWidget) { super.didUpdateWidget(oldWidget); @@ -106,6 +120,7 @@ class _ShadContextMenuRegionState extends State { } void showAtOffset(Offset offset) { + if (!mounted) return; setState(() => this.offset = offset); controller.show(); } @@ -114,8 +129,8 @@ class _ShadContextMenuRegionState extends State { controller.hide(); } - void show(TapDownDetails details) { - showAtOffset(details.globalPosition); + void show(Offset offset) { + showAtOffset(offset); } void onLongPress() { @@ -125,11 +140,14 @@ class _ShadContextMenuRegionState extends State { @override Widget build(BuildContext context) { + final platform = Theme.of(context).platform; final effectiveLongPressEnabled = widget.longPressEnabled ?? - (defaultTargetPlatform == TargetPlatform.android || - defaultTargetPlatform == TargetPlatform.iOS); + (platform == TargetPlatform.android || platform == TargetPlatform.iOS); + + final isWindows = platform == TargetPlatform.windows; return ShadContextMenu( + identifier: identifier.toString(), anchor: offset == null ? null : ShadGlobalAnchor(offset!), controller: controller, children: widget.children, @@ -143,7 +161,17 @@ class _ShadContextMenuRegionState extends State { filter: widget.filter, child: ShadGestureDetector( onTapDown: (_) => hide(), - onSecondaryTapDown: show, + onSecondaryTapDown: (d) async { + if (kIsWeb) await BrowserContextMenu.disableContextMenu(); + if (!isWindows) show(d.globalPosition); + }, + onSecondaryTapUp: (d) async { + if (isWindows) { + show(d.globalPosition); + await Future.delayed(Duration.zero); + } + if (kIsWeb) await BrowserContextMenu.enableContextMenu(); + }, onLongPressStart: effectiveLongPressEnabled ? (d) { offset = d.globalPosition; @@ -174,6 +202,7 @@ class ShadContextMenu extends StatefulWidget { this.decoration, this.filter, this.controller, + this.identifier, }); /// {@template ShadContextMenu.child} @@ -233,6 +262,11 @@ class ShadContextMenu extends StatefulWidget { /// {@endtemplate} final ShadContextMenuController? controller; + /// {@template ShadContextMenu.identifier} + /// The identifier of the context menu, defaults to a random string. + /// {@endtemplate} + final String? identifier; + @override State createState() => ShadContextMenuState(); } @@ -297,6 +331,7 @@ class ShadContextMenuState extends State { effects: effectiveEffects, shadows: effectiveShadows, filter: effectiveFilter, + useSameGroupIdForChild: false, popover: (context) { return ShadMouseArea( groupId: widget.groupId, @@ -319,13 +354,11 @@ class ShadContextMenuState extends State { ), ); }, - child: DisableWebContextMenu( - child: ShadMouseArea( - groupId: widget.groupId, - onEnter: (_) => widget.onHoverArea?.call(true), - onExit: (_) => widget.onHoverArea?.call(false), - child: widget.child, - ), + child: ShadMouseArea( + groupId: widget.groupId, + onEnter: (_) => widget.onHoverArea?.call(true), + onExit: (_) => widget.onHoverArea?.call(false), + child: widget.child, ), ); diff --git a/lib/src/components/popover.dart b/lib/src/components/popover.dart index 468fda6..5795094 100644 --- a/lib/src/components/popover.dart +++ b/lib/src/components/popover.dart @@ -59,6 +59,7 @@ class ShadPopover extends StatefulWidget { this.filter, this.groupId, this.areaGroupId, + this.useSameGroupIdForChild = true, }) : assert( (controller != null) ^ (visible != null), 'Either controller or visible must be provided', @@ -132,6 +133,13 @@ class ShadPopover extends StatefulWidget { /// {@macro ShadMouseArea.groupId} final Object? areaGroupId; + /// {@template ShadPopover.useSameGroupIdForChild} + /// Whether the [groupId] should be used for the child widget, defaults to + /// `true`. This teams that taps on the child widget will be handled as inside + /// the popover. + /// {@endtemplate} + final bool useSameGroupIdForChild; + @override State createState() => _ShadPopoverState(); } @@ -239,26 +247,30 @@ class _ShadPopoverState extends State { ); } - return TapRegion( - groupId: groupId, - child: ListenableBuilder( - listenable: controller, - builder: (context, _) { - return CallbackShortcuts( - bindings: { - const SingleActivator(LogicalKeyboardKey.escape): () { - controller.hide(); - }, + Widget child = ListenableBuilder( + listenable: controller, + builder: (context, _) { + return CallbackShortcuts( + bindings: { + const SingleActivator(LogicalKeyboardKey.escape): () { + controller.hide(); }, - child: ShadPortal( - portalBuilder: (_) => popover, - visible: controller.isOpen, - anchor: effectiveAnchor, - child: widget.child, - ), - ); - }, - ), + }, + child: ShadPortal( + portalBuilder: (_) => popover, + visible: controller.isOpen, + anchor: effectiveAnchor, + child: widget.child, + ), + ); + }, ); + if (widget.useSameGroupIdForChild) { + child = TapRegion( + groupId: groupId, + child: child, + ); + } + return child; } } diff --git a/lib/src/utils/disable_context_menu/web.dart b/lib/src/utils/disable_context_menu/web.dart deleted file mode 100644 index 7c985c1..0000000 --- a/lib/src/utils/disable_context_menu/web.dart +++ /dev/null @@ -1,90 +0,0 @@ -// ignore_for_file: avoid_web_libraries_in_flutter - -import 'dart:html' as html; - -import 'package:flutter/widgets.dart'; - -class DisableWebContextMenu extends StatefulWidget { - const DisableWebContextMenu({ - super.key, - required this.child, - this.identifier, - }); - - final String? identifier; - final Widget child; - - @override - State createState() => _DisableWebContextMenuState(); -} - -class _DisableWebContextMenuState extends State { - html.MutationObserver? observer; - - final _identifier = UniqueKey(); - - String get identifier => widget.identifier ?? _identifier.toString(); - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - final element = findElement(); - if (element != null) { - element.setAttribute('oncontextmenu', 'return false;'); - } else { - addObserver(); - } - }); - } - - html.Element? findElement() => html.document - .querySelector('flt-semantics-host') - ?.querySelector('[flt-semantics-identifier="$identifier"]'); - - void addObserver() { - observer = html.MutationObserver((mutations, _) { - for (final mutation in mutations) { - if (mutation is! html.MutationRecord) continue; - if (mutation.addedNodes?.isNotEmpty ?? false) { - for (final node in mutation.addedNodes!) { - if (node is html.HtmlElement) { - final id = node.attributes['flt-semantics-identifier']; - if (id == identifier) { - node.setAttribute('oncontextmenu', 'return false;'); - removeObserver(); - break; - } - } - } - } - } - }); - - observer!.observe( - html.document, - childList: true, - subtree: true, - attributes: true, - attributeFilter: ['flt-semantics-identifier'], - ); - } - - void removeObserver() { - observer?.disconnect(); - } - - @override - void dispose() { - removeObserver(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Semantics( - identifier: identifier, - child: widget.child, - ); - } -} diff --git a/lib/src/utils/disable_context_menu/non_web.dart b/lib/src/utils/web_context_menu/non_web.dart similarity index 64% rename from lib/src/utils/disable_context_menu/non_web.dart rename to lib/src/utils/web_context_menu/non_web.dart index a54860c..fba9233 100644 --- a/lib/src/utils/disable_context_menu/non_web.dart +++ b/lib/src/utils/web_context_menu/non_web.dart @@ -1,14 +1,16 @@ import 'package:flutter/widgets.dart'; -class DisableWebContextMenu extends StatelessWidget { - const DisableWebContextMenu({ +class WebContextMenu extends StatelessWidget { + const WebContextMenu({ super.key, required this.child, this.identifier, + this.onContextMenu, }); final String? identifier; final Widget child; + final void Function(Offset offset)? onContextMenu; @override Widget build(BuildContext context) { diff --git a/lib/src/utils/web_context_menu/web.dart b/lib/src/utils/web_context_menu/web.dart new file mode 100644 index 0000000..9ae9d29 --- /dev/null +++ b/lib/src/utils/web_context_menu/web.dart @@ -0,0 +1,130 @@ +// ignore_for_file: avoid_web_libraries_in_flutter + +import 'dart:html' as html; + +import 'package:flutter/semantics.dart'; +import 'package:flutter/widgets.dart'; + +class WebContextMenu extends StatefulWidget { + const WebContextMenu({ + super.key, + required this.child, + this.identifier, + this.onContextMenu, + }); + + final String? identifier; + final Widget child; + final void Function(Offset offset)? onContextMenu; + + @override + State createState() => _WebContextMenuState(); +} + +class _WebContextMenuState extends State { + html.MutationObserver? observer; + late final SemanticsHandle semanticsHandle; + + final _identifier = UniqueKey(); + + String get identifier => widget.identifier ?? _identifier.toString(); + + @override + void initState() { + super.initState(); + print('provided identifier: ${widget.identifier}'); + print('identifier: $identifier'); + + semanticsHandle = SemanticsBinding.instance.ensureSemantics(); + searchForElementOrAddObserver(); + } + + @override + void didUpdateWidget(covariant WebContextMenu oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.identifier != oldWidget.identifier) { + print('identifier changed to ${widget.identifier}'); + searchForElementOrAddObserver(); + } + } + + void searchForElementOrAddObserver() { + WidgetsBinding.instance.addPostFrameCallback((_) { + final element = findElement(); + if (element != null) { + print('found element with id $identifier'); + disableContextMenuForElement(element); + } else { + addObserver(); + } + }); + } + + html.Element? findElement() => + html.document.querySelector('[flt-semantics-identifier="$identifier"]'); + + void addObserver() { + observer = html.MutationObserver((mutations, _) { + for (final mutation in mutations) { + if (mutation is! html.MutationRecord) continue; + if (mutation.addedNodes?.isNotEmpty ?? false) { + for (final node in mutation.addedNodes!) { + if (node is html.HtmlElement) { + final id = node.attributes['flt-semantics-identifier']; + if (id == identifier) { + print('found element with observer and id $identifier'); + disableContextMenuForElement(node); + // removeObserver(); + // break; + } + } + } + } + } + }); + + observer!.observe( + html.document, + childList: true, + subtree: true, + attributes: true, + attributeFilter: ['flt-semantics-identifier'], + ); + } + + void disableContextMenuForElement(html.Element element) { + element + ..setAttribute('oncontextmenu', 'return false;') + ..addEventListener( + 'contextmenu', + (event) { + event.preventDefault(); + if (event is html.PointerEvent) { + widget.onContextMenu?.call( + Offset(event.client.x.toDouble(), event.client.y.toDouble()), + ); + } + }, + false, + ); + } + + void removeObserver() { + observer?.disconnect(); + } + + @override + void dispose() { + removeObserver(); + semanticsHandle.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Semantics( + identifier: identifier, + child: widget.child, + ); + } +} diff --git a/lib/src/utils/disable_context_menu/disable_context_menu.dart b/lib/src/utils/web_context_menu/web_context_menu.dart similarity index 100% rename from lib/src/utils/disable_context_menu/disable_context_menu.dart rename to lib/src/utils/web_context_menu/web_context_menu.dart From 176cf825f4655475fd396c3d221f442687e3ed07 Mon Sep 17 00:00:00 2001 From: Alexandru Mariuti Date: Tue, 24 Sep 2024 14:25:04 +0100 Subject: [PATCH 2/5] fixes --- lib/shadcn_ui.dart | 1 - lib/src/components/context_menu.dart | 10 +- lib/src/utils/web_context_menu/non_web.dart | 20 --- lib/src/utils/web_context_menu/web.dart | 130 ------------------ .../web_context_menu/web_context_menu.dart | 1 - 5 files changed, 8 insertions(+), 154 deletions(-) delete mode 100644 lib/src/utils/web_context_menu/non_web.dart delete mode 100644 lib/src/utils/web_context_menu/web.dart delete mode 100644 lib/src/utils/web_context_menu/web_context_menu.dart diff --git a/lib/shadcn_ui.dart b/lib/shadcn_ui.dart index 9a29b23..a4c69fe 100644 --- a/lib/shadcn_ui.dart +++ b/lib/shadcn_ui.dart @@ -97,7 +97,6 @@ export 'src/utils/provider.dart' hide ProviderReadExt, ProviderWatchExt; export 'src/utils/responsive.dart'; export 'src/utils/states_controller.dart'; export 'src/utils/mouse_area.dart'; -export 'src/utils/web_context_menu/web_context_menu.dart'; // External libraries export 'package:flutter_animate/flutter_animate.dart' hide Effect; diff --git a/lib/src/components/context_menu.dart b/lib/src/components/context_menu.dart index f619eab..a0bc8dd 100644 --- a/lib/src/components/context_menu.dart +++ b/lib/src/components/context_menu.dart @@ -97,6 +97,8 @@ class _ShadContextMenuRegionState extends State { ShadContextMenuController(isOpen: widget.visible ?? false)); Offset? offset; + final isContextMenuAlreadyDisabled = kIsWeb && !BrowserContextMenu.enabled; + @override void initState() { super.initState(); @@ -162,7 +164,9 @@ class _ShadContextMenuRegionState extends State { child: ShadGestureDetector( onTapDown: (_) => hide(), onSecondaryTapDown: (d) async { - if (kIsWeb) await BrowserContextMenu.disableContextMenu(); + if (kIsWeb && !isContextMenuAlreadyDisabled) { + await BrowserContextMenu.disableContextMenu(); + } if (!isWindows) show(d.globalPosition); }, onSecondaryTapUp: (d) async { @@ -170,7 +174,9 @@ class _ShadContextMenuRegionState extends State { show(d.globalPosition); await Future.delayed(Duration.zero); } - if (kIsWeb) await BrowserContextMenu.enableContextMenu(); + if (kIsWeb && !isContextMenuAlreadyDisabled) { + await BrowserContextMenu.enableContextMenu(); + } }, onLongPressStart: effectiveLongPressEnabled ? (d) { diff --git a/lib/src/utils/web_context_menu/non_web.dart b/lib/src/utils/web_context_menu/non_web.dart deleted file mode 100644 index fba9233..0000000 --- a/lib/src/utils/web_context_menu/non_web.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:flutter/widgets.dart'; - -class WebContextMenu extends StatelessWidget { - const WebContextMenu({ - super.key, - required this.child, - this.identifier, - this.onContextMenu, - }); - - final String? identifier; - final Widget child; - final void Function(Offset offset)? onContextMenu; - - @override - Widget build(BuildContext context) { - // no-op on non-web platforms - return child; - } -} diff --git a/lib/src/utils/web_context_menu/web.dart b/lib/src/utils/web_context_menu/web.dart deleted file mode 100644 index 9ae9d29..0000000 --- a/lib/src/utils/web_context_menu/web.dart +++ /dev/null @@ -1,130 +0,0 @@ -// ignore_for_file: avoid_web_libraries_in_flutter - -import 'dart:html' as html; - -import 'package:flutter/semantics.dart'; -import 'package:flutter/widgets.dart'; - -class WebContextMenu extends StatefulWidget { - const WebContextMenu({ - super.key, - required this.child, - this.identifier, - this.onContextMenu, - }); - - final String? identifier; - final Widget child; - final void Function(Offset offset)? onContextMenu; - - @override - State createState() => _WebContextMenuState(); -} - -class _WebContextMenuState extends State { - html.MutationObserver? observer; - late final SemanticsHandle semanticsHandle; - - final _identifier = UniqueKey(); - - String get identifier => widget.identifier ?? _identifier.toString(); - - @override - void initState() { - super.initState(); - print('provided identifier: ${widget.identifier}'); - print('identifier: $identifier'); - - semanticsHandle = SemanticsBinding.instance.ensureSemantics(); - searchForElementOrAddObserver(); - } - - @override - void didUpdateWidget(covariant WebContextMenu oldWidget) { - super.didUpdateWidget(oldWidget); - if (widget.identifier != oldWidget.identifier) { - print('identifier changed to ${widget.identifier}'); - searchForElementOrAddObserver(); - } - } - - void searchForElementOrAddObserver() { - WidgetsBinding.instance.addPostFrameCallback((_) { - final element = findElement(); - if (element != null) { - print('found element with id $identifier'); - disableContextMenuForElement(element); - } else { - addObserver(); - } - }); - } - - html.Element? findElement() => - html.document.querySelector('[flt-semantics-identifier="$identifier"]'); - - void addObserver() { - observer = html.MutationObserver((mutations, _) { - for (final mutation in mutations) { - if (mutation is! html.MutationRecord) continue; - if (mutation.addedNodes?.isNotEmpty ?? false) { - for (final node in mutation.addedNodes!) { - if (node is html.HtmlElement) { - final id = node.attributes['flt-semantics-identifier']; - if (id == identifier) { - print('found element with observer and id $identifier'); - disableContextMenuForElement(node); - // removeObserver(); - // break; - } - } - } - } - } - }); - - observer!.observe( - html.document, - childList: true, - subtree: true, - attributes: true, - attributeFilter: ['flt-semantics-identifier'], - ); - } - - void disableContextMenuForElement(html.Element element) { - element - ..setAttribute('oncontextmenu', 'return false;') - ..addEventListener( - 'contextmenu', - (event) { - event.preventDefault(); - if (event is html.PointerEvent) { - widget.onContextMenu?.call( - Offset(event.client.x.toDouble(), event.client.y.toDouble()), - ); - } - }, - false, - ); - } - - void removeObserver() { - observer?.disconnect(); - } - - @override - void dispose() { - removeObserver(); - semanticsHandle.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Semantics( - identifier: identifier, - child: widget.child, - ); - } -} diff --git a/lib/src/utils/web_context_menu/web_context_menu.dart b/lib/src/utils/web_context_menu/web_context_menu.dart deleted file mode 100644 index 6d0fc6a..0000000 --- a/lib/src/utils/web_context_menu/web_context_menu.dart +++ /dev/null @@ -1 +0,0 @@ -export 'non_web.dart' if (dart.library.js_interop) 'web.dart'; From 3dc01c27789c0797e1fe0fa3c8fa214603384dfc Mon Sep 17 00:00:00 2001 From: Alexandru Mariuti Date: Tue, 24 Sep 2024 14:25:49 +0100 Subject: [PATCH 3/5] remove prints --- lib/src/components/context_menu.dart | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/src/components/context_menu.dart b/lib/src/components/context_menu.dart index a0bc8dd..b58bee0 100644 --- a/lib/src/components/context_menu.dart +++ b/lib/src/components/context_menu.dart @@ -99,14 +99,6 @@ class _ShadContextMenuRegionState extends State { final isContextMenuAlreadyDisabled = kIsWeb && !BrowserContextMenu.enabled; - @override - void initState() { - super.initState(); - print('test7'); - print('init state context menu region'); - print('created identifier ${identifier.toString()}'); - } - @override void didUpdateWidget(covariant ShadContextMenuRegion oldWidget) { super.didUpdateWidget(oldWidget); From b8133ab83c8d00e99225aaecd7b52fd923705dc6 Mon Sep 17 00:00:00 2001 From: Alexandru Mariuti Date: Tue, 24 Sep 2024 14:26:50 +0100 Subject: [PATCH 4/5] bump version --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a8c062..de32d3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.9.8 + +- Improve the `ShadContextMenu` right click behavior on Web. + ## 0.9.7 - Remove kind event from `ShadMouseArea` diff --git a/pubspec.yaml b/pubspec.yaml index beb37f3..4d54465 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: shadcn_ui description: shadcn-ui ported in Flutter. Awesome UI components for Flutter, fully customizable. -version: 0.9.7 +version: 0.9.8 homepage: https://mariuti.com/shadcn-ui repository: https://github.com/nank1ro/flutter-shadcn-ui documentation: https://mariuti.com/shadcn-ui From 32d1a2c976d15ff0f357474502158bd6884f991d Mon Sep 17 00:00:00 2001 From: Alexandru Mariuti Date: Tue, 24 Sep 2024 14:28:04 +0100 Subject: [PATCH 5/5] remove identifier --- lib/src/components/context_menu.dart | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/src/components/context_menu.dart b/lib/src/components/context_menu.dart index b58bee0..0a961fd 100644 --- a/lib/src/components/context_menu.dart +++ b/lib/src/components/context_menu.dart @@ -89,7 +89,6 @@ class ShadContextMenuRegion extends StatefulWidget { } class _ShadContextMenuRegionState extends State { - final identifier = UniqueKey(); ShadContextMenuController? _controller; ShadContextMenuController get controller => widget.controller ?? @@ -141,7 +140,6 @@ class _ShadContextMenuRegionState extends State { final isWindows = platform == TargetPlatform.windows; return ShadContextMenu( - identifier: identifier.toString(), anchor: offset == null ? null : ShadGlobalAnchor(offset!), controller: controller, children: widget.children, @@ -200,7 +198,6 @@ class ShadContextMenu extends StatefulWidget { this.decoration, this.filter, this.controller, - this.identifier, }); /// {@template ShadContextMenu.child} @@ -260,11 +257,6 @@ class ShadContextMenu extends StatefulWidget { /// {@endtemplate} final ShadContextMenuController? controller; - /// {@template ShadContextMenu.identifier} - /// The identifier of the context menu, defaults to a random string. - /// {@endtemplate} - final String? identifier; - @override State createState() => ShadContextMenuState(); }