mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-10-31 10:14:50 +00:00 
			
		
		
		
	Start to create custom appbar overlay
This commit is contained in:
		
							
								
								
									
										123
									
								
								lib/ui/widgets/tablet_mode/appbar_custom_dropdown_widget.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								lib/ui/widgets/tablet_mode/appbar_custom_dropdown_widget.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,123 @@ | |||||||
|  | import 'package:comunic/ui/widgets/icon_button_badge.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  |  | ||||||
|  | /// Custom dropdown built for Appbar | ||||||
|  | /// | ||||||
|  | /// @author Pierre Hubert | ||||||
|  |  | ||||||
|  | class AppBarCustomDropDownWidget extends StatefulWidget { | ||||||
|  |   final Widget icon; | ||||||
|  |   final int notificationsBadge; | ||||||
|  |   final Widget Function(BuildContext) onBuildOverlay; | ||||||
|  |  | ||||||
|  |   const AppBarCustomDropDownWidget({ | ||||||
|  |     Key key, | ||||||
|  |     @required this.icon, | ||||||
|  |     @required this.notificationsBadge, | ||||||
|  |     @required this.onBuildOverlay, | ||||||
|  |   })  : assert(icon != null), | ||||||
|  |         assert(notificationsBadge != null), | ||||||
|  |         assert(onBuildOverlay != null), | ||||||
|  |         super(key: key); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   _AppBarCustomDropDownWidgetState createState() => | ||||||
|  |       _AppBarCustomDropDownWidgetState(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class _AppBarCustomDropDownWidgetState | ||||||
|  |     extends State<AppBarCustomDropDownWidget> { | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return IconButtonWithBadge( | ||||||
|  |       icon: widget.icon, | ||||||
|  |       onPressed: toggleOverlay, | ||||||
|  |       number: widget.notificationsBadge, | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   void toggleOverlay() async { | ||||||
|  |     RenderBox renderBox = context.findRenderObject(); | ||||||
|  |     final size = renderBox.size; | ||||||
|  |     final offset = renderBox.localToGlobal(Offset(size.width, size.height)); | ||||||
|  |  | ||||||
|  |     Navigator.of(context).push(_AppBarCustomPopupRoute( | ||||||
|  |       onBuild: widget.onBuildOverlay, | ||||||
|  |       showContext: context, | ||||||
|  |       offset: offset, | ||||||
|  |     )); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class _AppBarCustomPopupRoute extends PopupRoute { | ||||||
|  |   final BuildContext showContext; | ||||||
|  |   final Widget Function(BuildContext) onBuild; | ||||||
|  |   final Offset offset; | ||||||
|  |  | ||||||
|  |   _AppBarCustomPopupRoute({ | ||||||
|  |     @required this.showContext, | ||||||
|  |     @required this.onBuild, | ||||||
|  |     @required this.offset, | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Color get barrierColor => null; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   bool get barrierDismissible => true; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   String get barrierLabel => | ||||||
|  |       MaterialLocalizations.of(showContext).modalBarrierDismissLabel; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Widget buildPage(BuildContext context, Animation<double> animation, | ||||||
|  |       Animation<double> secondaryAnimation) { | ||||||
|  |     return MediaQuery.removePadding( | ||||||
|  |       context: context, | ||||||
|  |       removeTop: true, | ||||||
|  |       removeBottom: true, | ||||||
|  |       removeLeft: true, | ||||||
|  |       removeRight: true, | ||||||
|  |       child: Builder( | ||||||
|  |         builder: (BuildContext context) { | ||||||
|  |           return _PopupContentBody( | ||||||
|  |             onBuild: onBuild, | ||||||
|  |             offset: offset, | ||||||
|  |           ); | ||||||
|  |         }, | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Duration get transitionDuration => Duration(milliseconds: 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class _PopupContentBody extends StatelessWidget { | ||||||
|  |   final Widget Function(BuildContext) onBuild; | ||||||
|  |   final Offset offset; | ||||||
|  |  | ||||||
|  |   const _PopupContentBody({Key key, this.onBuild, this.offset}) | ||||||
|  |       : super(key: key); | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return Stack( | ||||||
|  |       children: <Widget>[ | ||||||
|  |         GestureDetector( | ||||||
|  |           onTapDown: (d) => Navigator.of(context).pop(), | ||||||
|  |           onPanDown: (d) => Navigator.of(context).pop(), | ||||||
|  |           child: Container(color: Color(0x55000000)), | ||||||
|  |         ), | ||||||
|  |         Positioned( | ||||||
|  |           left: offset.dx - 300, | ||||||
|  |           top: offset.dy, | ||||||
|  |           width: 300, | ||||||
|  |           height: 400, | ||||||
|  |           child: Card(child: onBuild(context)), | ||||||
|  |         ) | ||||||
|  |       ], | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -1,8 +1,9 @@ | |||||||
| import 'package:comunic/helpers/events_helper.dart'; | import 'package:comunic/helpers/events_helper.dart'; | ||||||
| import 'package:comunic/helpers/notifications_helper.dart'; | import 'package:comunic/helpers/notifications_helper.dart'; | ||||||
| import 'package:comunic/models/count_unread_notifications.dart'; | import 'package:comunic/models/count_unread_notifications.dart'; | ||||||
| import 'package:comunic/ui/widgets/icon_button_badge.dart'; |  | ||||||
| import 'package:comunic/ui/widgets/safe_state.dart'; | import 'package:comunic/ui/widgets/safe_state.dart'; | ||||||
|  | import 'package:comunic/ui/widgets/tablet_mode/appbar_custom_dropdown_widget.dart'; | ||||||
|  | import 'package:comunic/utils/ui_utils.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
|  |  | ||||||
| /// Comunic tablet AppBar widget | /// Comunic tablet AppBar widget | ||||||
| @@ -54,15 +55,15 @@ class _ComunicTabletAppBarWidgetState | |||||||
|     return AppBar( |     return AppBar( | ||||||
|       title: Text("Comunic"), |       title: Text("Comunic"), | ||||||
|       actions: <Widget>[ |       actions: <Widget>[ | ||||||
|         IconButtonWithBadge( |         AppBarCustomDropDownWidget( | ||||||
|           icon: Icon(Icons.notifications), |           icon: Icon(Icons.notifications), | ||||||
|           onPressed: () {}, |           notificationsBadge: _unreadNotifications.notifications, | ||||||
|           number: _unreadNotifications.notifications, |           onBuildOverlay: (c) => buildCenteredProgressBar(), | ||||||
|         ), |         ), | ||||||
|         IconButtonWithBadge( |         AppBarCustomDropDownWidget( | ||||||
|           icon: Icon(Icons.message), |           icon: Icon(Icons.message), | ||||||
|           onPressed: () {}, |           notificationsBadge: _unreadNotifications.conversations, | ||||||
|           number: _unreadNotifications.conversations, |           onBuildOverlay: (c) => Text("hello world"), | ||||||
|         ), |         ), | ||||||
|         PopupMenuButton(itemBuilder: (c) => []), |         PopupMenuButton(itemBuilder: (c) => []), | ||||||
|       ], |       ], | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user