├── .gitignore ├── .metadata ├── README.md ├── analysis_options.yaml ├── assets ├── icons │ └── logo.png └── images │ ├── error.png │ └── profile.jpg ├── lib ├── constants │ ├── controllers.dart │ └── style.dart ├── controllers │ ├── menu_controller.dart │ └── navigation_controller.dart ├── helpers │ ├── local_navigator.dart │ └── reponsiveness.dart ├── layout.dart ├── main.dart ├── pages │ ├── 404 │ │ └── error.dart │ ├── authentication │ │ └── authentication.dart │ ├── clients │ │ ├── clients.dart │ │ └── widgets │ │ │ └── clients_table.dart │ ├── drivers │ │ ├── drivers.dart │ │ └── widgets │ │ │ └── drivers_table.dart │ ├── notifications │ │ └── notifications.dart │ ├── overview │ │ ├── overview.dart │ │ └── widgets │ │ │ ├── available_drivers_table.dart │ │ │ ├── bar_chart.dart │ │ │ ├── info_card.dart │ │ │ ├── info_card_small.dart │ │ │ ├── overview_cards_large.dart │ │ │ ├── overview_cards_medium.dart │ │ │ ├── overview_cards_small.dart │ │ │ ├── revenue_info.dart │ │ │ ├── revenue_section_large.dart │ │ │ └── revenue_section_small.dart │ └── users │ │ └── users.dart ├── routing │ ├── router.dart │ └── routes.dart ├── vertical_menu_item.dart └── widgets │ ├── custom_text.dart │ ├── horizontal_menu_item.dart │ ├── large_screen.dart │ ├── side_menu.dart │ ├── side_menu_item.dart │ └── top_nav.dart ├── pubspec.lock ├── pubspec.yaml └── web ├── favicon.png ├── icons ├── Icon-192.png ├── Icon-512.png ├── Icon-maskable-192.png └── Icon-maskable-512.png ├── index.html └── manifest.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | **/doc/api/ 26 | **/ios/Flutter/.last_build_id 27 | .dart_tool/ 28 | .flutter-plugins 29 | .flutter-plugins-dependencies 30 | .packages 31 | .pub-cache/ 32 | .pub/ 33 | /build/ 34 | 35 | # Symbolication related 36 | app.*.symbols 37 | 38 | # Obfuscation related 39 | app.*.map.json 40 | 41 | # Android Studio will place build artifacts here 42 | /android/app/debug 43 | /android/app/profile 44 | /android/app/release 45 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: "efbf63d9c66b9f6ec30e9ad4611189aa80003d31" 8 | channel: "stable" 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 17 | base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 18 | - platform: android 19 | create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 20 | base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 21 | - platform: ios 22 | create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 23 | base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 24 | - platform: linux 25 | create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 26 | base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 27 | - platform: macos 28 | create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 29 | base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 30 | - platform: web 31 | create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 32 | base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 33 | - platform: windows 34 | create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 35 | base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31 36 | 37 | # User provided section 38 | 39 | # List of Local paths (relative to this file) that should be 40 | # ignored by the migrate tool. 41 | # 42 | # Files that are not part of the templates will be ignored by default. 43 | unmanaged_files: 44 | - 'lib/main.dart' 45 | - 'ios/Runner.xcodeproj/project.pbxproj' 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # flutter_web_dashboard 2 | 3 | A new Flutter project. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter application. 8 | 9 | A few resources to get you started if this is your first Flutter project: 10 | 11 | - [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) 12 | - [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) 13 | 14 | For help getting started with Flutter development, view the 15 | [online documentation](https://docs.flutter.dev/), which offers tutorials, 16 | samples, guidance on mobile development, and a full API reference. 17 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at https://dart.dev/lints. 17 | # 18 | # Instead of disabling a lint rule for the entire project in the 19 | # section below, it can also be suppressed for a single line of code 20 | # or a specific dart file by using the `// ignore: name_of_lint` and 21 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 22 | # producing the lint. 23 | rules: 24 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 25 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 26 | 27 | # Additional information about this file can be found at 28 | # https://dart.dev/guides/language/analysis-options 29 | -------------------------------------------------------------------------------- /assets/icons/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santos-Enoque/flutter-web-dashboard-template/32c3f21191212e6c164575898ba7ec88176d1365/assets/icons/logo.png -------------------------------------------------------------------------------- /assets/images/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santos-Enoque/flutter-web-dashboard-template/32c3f21191212e6c164575898ba7ec88176d1365/assets/images/error.png -------------------------------------------------------------------------------- /assets/images/profile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santos-Enoque/flutter-web-dashboard-template/32c3f21191212e6c164575898ba7ec88176d1365/assets/images/profile.jpg -------------------------------------------------------------------------------- /lib/constants/controllers.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_web_dashboard/controllers/menu_controller.dart'; 2 | import 'package:flutter_web_dashboard/controllers/navigation_controller.dart'; 3 | 4 | MenuController menuController = MenuController.instance; 5 | NavigationController navigationController = NavigationController.instance; -------------------------------------------------------------------------------- /lib/constants/style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | const light = Color(0xFFF7F8FC); 4 | const lightGrey = Color(0xFFA4A6B3); 5 | const dark = Color(0xFF363740); 6 | const active = Color(0xFF3C19C0); 7 | 8 | -------------------------------------------------------------------------------- /lib/controllers/menu_controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/style.dart'; 3 | import 'package:flutter_web_dashboard/routing/routes.dart'; 4 | import 'package:get/get.dart'; 5 | 6 | class MenuController extends GetxController { 7 | static MenuController instance = Get.find(); 8 | var activeItem = overviewPageDisplayName.obs; 9 | 10 | var hoverItem = "".obs; 11 | 12 | changeActiveItemTo(String itemName) { 13 | activeItem.value = itemName; 14 | } 15 | 16 | onHover(String itemName) { 17 | if (!isActive(itemName)) hoverItem.value = itemName; 18 | } 19 | 20 | isHovering(String itemName) => hoverItem.value == itemName; 21 | 22 | isActive(String itemName) => activeItem.value == itemName; 23 | 24 | Widget returnIconFor(String itemName) { 25 | switch (itemName) { 26 | case overviewPageDisplayName: 27 | return _customIcon(Icons.trending_up, itemName); 28 | case driversPageDisplayName: 29 | return _customIcon(Icons.drive_eta, itemName); 30 | case clientsPageDisplayName: 31 | return _customIcon(Icons.people_alt_outlined, itemName); 32 | case authenticationPageDisplayName: 33 | return _customIcon(Icons.exit_to_app, itemName); 34 | default: 35 | return _customIcon(Icons.exit_to_app, itemName); 36 | } 37 | } 38 | 39 | Widget _customIcon(IconData icon, String itemName) { 40 | if (isActive(itemName)) return Icon(icon, size: 22, color: dark); 41 | 42 | return Icon( 43 | icon, 44 | color: isHovering(itemName) ? dark : lightGrey, 45 | ); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /lib/controllers/navigation_controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | class NavigationController extends GetxController{ 5 | static NavigationController instance = Get.find(); 6 | final GlobalKey navigatorKey = GlobalKey(); 7 | 8 | Future navigateTo(String routeName){ 9 | return navigatorKey.currentState!.pushNamed(routeName); 10 | } 11 | 12 | goBack() => navigatorKey.currentState?.pop(); 13 | 14 | } -------------------------------------------------------------------------------- /lib/helpers/local_navigator.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter_web_dashboard/constants/controllers.dart'; 3 | import 'package:flutter_web_dashboard/routing/router.dart'; 4 | import 'package:flutter_web_dashboard/routing/routes.dart'; 5 | 6 | Navigator localNavigator() => Navigator( 7 | key: navigationController.navigatorKey, 8 | onGenerateRoute: generateRoute, 9 | initialRoute: overviewPageRoute, 10 | ); 11 | -------------------------------------------------------------------------------- /lib/helpers/reponsiveness.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | const int largeScreenSize = 1366; 4 | const int mediumScreenSize = 768; 5 | const int smallSceenSize = 360; 6 | const int customScreenSize = 1100; 7 | 8 | class ResponsiveWidget extends StatelessWidget { 9 | // the custom screen size is specific to this project 10 | final Widget largeScreen; 11 | final Widget? mediumScreen; 12 | final Widget? smallScreen; 13 | final Widget? customScreen; 14 | 15 | const ResponsiveWidget({ 16 | Key? key, 17 | required this.largeScreen, 18 | this.mediumScreen, 19 | this.smallScreen, 20 | this.customScreen, 21 | }) : super(key: key); 22 | 23 | static bool isSmallScreen(BuildContext context) { 24 | return MediaQuery.of(context).size.width < mediumScreenSize; 25 | } 26 | 27 | static bool isMediumScreen(BuildContext context) { 28 | return MediaQuery.of(context).size.width >= mediumScreenSize && MediaQuery.of(context).size.width < largeScreenSize; 29 | } 30 | 31 | static bool isLargeScreen(BuildContext context) { 32 | return MediaQuery.of(context).size.width > largeScreenSize; 33 | } 34 | 35 | static bool isCustomSize(BuildContext context) { 36 | return MediaQuery.of(context).size.width <= customScreenSize && MediaQuery.of(context).size.width >= mediumScreenSize; 37 | } 38 | 39 | @override 40 | Widget build(BuildContext context) { 41 | return LayoutBuilder( 42 | builder: (context, constraints) { 43 | if (constraints.maxWidth >= largeScreenSize) { 44 | return largeScreen; 45 | } else if (constraints.maxWidth < largeScreenSize && constraints.maxWidth >= mediumScreenSize) { 46 | return mediumScreen ?? largeScreen; 47 | } else { 48 | return smallScreen ?? largeScreen; 49 | } 50 | }, 51 | ); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /lib/layout.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/helpers/local_navigator.dart'; 3 | import 'package:flutter_web_dashboard/helpers/reponsiveness.dart'; 4 | import 'package:flutter_web_dashboard/widgets/large_screen.dart'; 5 | import 'package:flutter_web_dashboard/widgets/side_menu.dart'; 6 | 7 | import 'widgets/top_nav.dart'; 8 | 9 | 10 | class SiteLayout extends StatelessWidget { 11 | final GlobalKey scaffoldKey = GlobalKey(); 12 | 13 | SiteLayout({super.key}); 14 | @override 15 | Widget build(BuildContext context) { 16 | return Scaffold( 17 | key: scaffoldKey, 18 | extendBodyBehindAppBar: true, 19 | appBar: topNavigationBar(context, scaffoldKey), 20 | drawer: const Drawer( 21 | child: SideMenu(), 22 | ), 23 | body: ResponsiveWidget( 24 | largeScreen: const LargeScreen(), 25 | smallScreen: Padding( 26 | padding: const EdgeInsets.symmetric(horizontal: 16), 27 | child: localNavigator(), 28 | ) 29 | ), 30 | ); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/style.dart'; 3 | import 'package:flutter_web_dashboard/controllers/menu_controller.dart' as menu_controller; 4 | import 'package:flutter_web_dashboard/controllers/navigation_controller.dart'; 5 | import 'package:flutter_web_dashboard/layout.dart'; 6 | import 'package:flutter_web_dashboard/pages/404/error.dart'; 7 | import 'package:flutter_web_dashboard/pages/authentication/authentication.dart'; 8 | import 'package:get/get.dart'; 9 | import 'package:google_fonts/google_fonts.dart'; 10 | 11 | import 'routing/routes.dart'; 12 | 13 | void main() { 14 | Get.put(menu_controller.MenuController()); 15 | Get.put(NavigationController()); 16 | runApp(const MyApp()); 17 | } 18 | 19 | class MyApp extends StatelessWidget { 20 | const MyApp({super.key}); 21 | 22 | // This widget is the root of your application. 23 | @override 24 | Widget build(BuildContext context) { 25 | return GetMaterialApp( 26 | initialRoute: rootRoute, 27 | unknownRoute: GetPage(name: '/not-found', page: () => const PageNotFound(), transition: Transition.fadeIn), 28 | getPages: [ 29 | GetPage( 30 | name: rootRoute, 31 | page: () { 32 | return SiteLayout(); 33 | }), 34 | GetPage(name: authenticationPageRoute, page: () => const AuthenticationPage()), 35 | ], 36 | debugShowCheckedModeBanner: false, 37 | title: 'Dashboard', 38 | theme: ThemeData( 39 | scaffoldBackgroundColor: light, 40 | textTheme: GoogleFonts.mulishTextTheme(Theme.of(context).textTheme).apply(bodyColor: Colors.black), 41 | pageTransitionsTheme: const PageTransitionsTheme(builders: { 42 | TargetPlatform.iOS: FadeUpwardsPageTransitionsBuilder(), 43 | TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(), 44 | }), 45 | primarySwatch: Colors.blue, 46 | ), 47 | // home: AuthenticationPage(), 48 | ); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /lib/pages/404/error.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/widgets/custom_text.dart'; 3 | 4 | class PageNotFound extends StatelessWidget { 5 | const PageNotFound({super.key}); 6 | 7 | @override 8 | Widget build(BuildContext context) { 9 | return Scaffold( 10 | body: Column( 11 | mainAxisAlignment: MainAxisAlignment.center, 12 | children: [ 13 | Image.asset("assets/images/error.png", width: 350,), 14 | const SizedBox(height: 10,), 15 | const Row( 16 | mainAxisAlignment: MainAxisAlignment.center, 17 | children: [ 18 | CustomText(text: "Page not found", size: 24, weight: FontWeight.bold,), 19 | ], 20 | ) 21 | ], 22 | ), 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/pages/authentication/authentication.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/style.dart'; 3 | import 'package:flutter_web_dashboard/routing/routes.dart'; 4 | import 'package:flutter_web_dashboard/widgets/custom_text.dart'; 5 | import 'package:get/get.dart'; 6 | import 'package:google_fonts/google_fonts.dart'; 7 | 8 | class AuthenticationPage extends StatelessWidget { 9 | const AuthenticationPage({Key? key}) : super(key: key); 10 | @override 11 | Widget build(BuildContext context) { 12 | return Scaffold( 13 | body: Center( 14 | child: Container( 15 | constraints: const BoxConstraints(maxWidth: 400), 16 | padding: const EdgeInsets.all(24), 17 | child: Column( 18 | mainAxisAlignment: MainAxisAlignment.center, 19 | children: [ 20 | Row( 21 | children: [ 22 | Padding( 23 | padding: const EdgeInsets.only(right: 12), 24 | child: Image.asset("assets/icons/logo.png"), 25 | ), 26 | Expanded(child: Container()), 27 | ], 28 | ), 29 | const SizedBox( 30 | height: 30, 31 | ), 32 | Row( 33 | children: [ 34 | Text("Login", 35 | style: GoogleFonts.roboto( 36 | fontSize: 30, fontWeight: FontWeight.bold)), 37 | ], 38 | ), 39 | const SizedBox( 40 | height: 10, 41 | ), 42 | const Row( 43 | children: [ 44 | CustomText( 45 | text: "Welcome back to the admin panel.", 46 | color: lightGrey, 47 | ), 48 | ], 49 | ), 50 | const SizedBox( 51 | height: 15, 52 | ), 53 | TextField( 54 | decoration: InputDecoration( 55 | labelText: "Email", 56 | hintText: "abc@domain.com", 57 | border: OutlineInputBorder( 58 | borderRadius: BorderRadius.circular(20))), 59 | ), 60 | const SizedBox( 61 | height: 15, 62 | ), 63 | TextField( 64 | obscureText: true, 65 | decoration: InputDecoration( 66 | labelText: "Password", 67 | hintText: "123", 68 | border: OutlineInputBorder( 69 | borderRadius: BorderRadius.circular(20))), 70 | ), 71 | const SizedBox( 72 | height: 15, 73 | ), 74 | Row( 75 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 76 | children: [ 77 | Row( 78 | children: [ 79 | Checkbox(value: true, onChanged: (value){}), 80 | const CustomText(text: "Remeber Me",), 81 | ], 82 | ), 83 | 84 | const CustomText( 85 | text: "Forgot password?", 86 | color: active 87 | ) 88 | ], 89 | ), 90 | const SizedBox( 91 | height: 15, 92 | ), 93 | InkWell( 94 | onTap: (){ 95 | Get.offAllNamed(rootRoute); 96 | }, 97 | child: Container( 98 | decoration: BoxDecoration(color: active, 99 | borderRadius: BorderRadius.circular(20)), 100 | alignment: Alignment.center, 101 | width: double.maxFinite, 102 | padding: const EdgeInsets.symmetric(vertical: 16), 103 | child: const CustomText( 104 | text: "Login", 105 | color: Colors.white, 106 | ), 107 | ), 108 | ), 109 | 110 | const SizedBox( 111 | height: 15, 112 | ), 113 | 114 | RichText(text: const TextSpan( 115 | children: [ 116 | TextSpan(text: "Do not have admin credentials? "), 117 | TextSpan(text: "Request Credentials! ", style: TextStyle(color: active)) 118 | ] 119 | )) 120 | 121 | ], 122 | ), 123 | ), 124 | ), 125 | ); 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /lib/pages/clients/clients.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/controllers.dart'; 3 | import 'package:flutter_web_dashboard/helpers/reponsiveness.dart'; 4 | import 'package:flutter_web_dashboard/pages/clients/widgets/clients_table.dart'; 5 | import 'package:flutter_web_dashboard/widgets/custom_text.dart'; 6 | import 'package:get/get.dart'; 7 | 8 | class ClientsPage extends StatelessWidget { 9 | const ClientsPage({ Key? key }) : super(key: key); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Column( 14 | children: [ 15 | Obx(() => Row( 16 | children: [ 17 | Container( 18 | margin: EdgeInsets.only(top: 19 | ResponsiveWidget.isSmallScreen(context) ? 56 : 6), 20 | child: CustomText(text: menuController.activeItem.value, size: 24, weight: FontWeight.bold,)), 21 | ], 22 | ),), 23 | 24 | Expanded(child: ListView( 25 | children: const [ 26 | Clientstable(), 27 | ], 28 | )), 29 | 30 | ], 31 | ); 32 | } 33 | } -------------------------------------------------------------------------------- /lib/pages/clients/widgets/clients_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:data_table_2/data_table_2.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_web_dashboard/constants/style.dart'; 4 | import 'package:flutter_web_dashboard/widgets/custom_text.dart'; 5 | 6 | /// Example without datasource 7 | class Clientstable extends StatelessWidget { 8 | const Clientstable({super.key}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Container( 13 | decoration: BoxDecoration( 14 | color: Colors.white, 15 | border: Border.all(color: active.withOpacity(.4), width: .5), 16 | boxShadow: [BoxShadow(offset: const Offset(0, 6), color: lightGrey.withOpacity(.1), blurRadius: 12)], 17 | borderRadius: BorderRadius.circular(8), 18 | ), 19 | padding: const EdgeInsets.all(16), 20 | margin: const EdgeInsets.only(bottom: 30), 21 | child: SizedBox( 22 | height: (60 * 7) + 40, 23 | child: DataTable2( 24 | columnSpacing: 12, 25 | dataRowHeight: 60, 26 | headingRowHeight: 40, 27 | horizontalMargin: 12, 28 | minWidth: 600, 29 | columns: const [ 30 | DataColumn2( 31 | label: Text("Name"), 32 | size: ColumnSize.L, 33 | ), 34 | DataColumn( 35 | label: Text('Location'), 36 | ), 37 | DataColumn( 38 | label: Text('Rating'), 39 | ), 40 | DataColumn( 41 | label: Text('Action'), 42 | ), 43 | ], 44 | rows: List.generate( 45 | 15, 46 | (index) => DataRow(cells: [ 47 | const DataCell(CustomText(text: "Santos Enoque")), 48 | const DataCell(CustomText(text: "New yourk city")), 49 | const DataCell(Row( 50 | mainAxisSize: MainAxisSize.min, 51 | children: [ 52 | Icon( 53 | Icons.star, 54 | color: Colors.deepOrange, 55 | size: 18, 56 | ), 57 | SizedBox( 58 | width: 5, 59 | ), 60 | CustomText( 61 | text: "4.5", 62 | ) 63 | ], 64 | )), 65 | DataCell(Container( 66 | decoration: BoxDecoration( 67 | color: light, 68 | borderRadius: BorderRadius.circular(20), 69 | border: Border.all(color: active, width: .5), 70 | ), 71 | padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), 72 | child: CustomText( 73 | text: "Block", 74 | color: active.withOpacity(.7), 75 | weight: FontWeight.bold, 76 | ))), 77 | ]))), 78 | ), 79 | ); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /lib/pages/drivers/drivers.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/controllers.dart'; 3 | import 'package:flutter_web_dashboard/helpers/reponsiveness.dart'; 4 | import 'package:flutter_web_dashboard/pages/drivers/widgets/drivers_table.dart'; 5 | import 'package:flutter_web_dashboard/widgets/custom_text.dart'; 6 | import 'package:get/get.dart'; 7 | 8 | class DriversPage extends StatelessWidget { 9 | const DriversPage({Key? key}) : super(key: key); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Column( 14 | children: [ 15 | Obx( 16 | () => Row( 17 | children: [ 18 | Container( 19 | margin: EdgeInsets.only(top: ResponsiveWidget.isSmallScreen(context) ? 56 : 6), 20 | child: CustomText( 21 | text: menuController.activeItem.value, 22 | size: 24, 23 | weight: FontWeight.bold, 24 | )), 25 | ], 26 | ), 27 | ), 28 | Expanded( 29 | child: ListView( 30 | children: const [DriversTable()], 31 | )), 32 | ], 33 | ); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/pages/drivers/widgets/drivers_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:data_table_2/data_table_2.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_web_dashboard/constants/style.dart'; 4 | import 'package:flutter_web_dashboard/widgets/custom_text.dart'; 5 | 6 | /// Example without datasource 7 | class DriversTable extends StatelessWidget { 8 | const DriversTable({super.key}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Container( 13 | decoration: BoxDecoration( 14 | color: Colors.white, 15 | border: Border.all(color: active.withOpacity(.4), width: .5), 16 | boxShadow: [BoxShadow(offset: const Offset(0, 6), color: lightGrey.withOpacity(.1), blurRadius: 12)], 17 | borderRadius: BorderRadius.circular(8), 18 | ), 19 | padding: const EdgeInsets.all(16), 20 | margin: const EdgeInsets.only(bottom: 30), 21 | child: SizedBox( 22 | height: (60 * 7) + 40, 23 | child: DataTable2( 24 | columnSpacing: 12, 25 | dataRowHeight: 60, 26 | headingRowHeight: 40, 27 | horizontalMargin: 12, 28 | minWidth: 600, 29 | columns: const [ 30 | DataColumn2( 31 | label: Text("Name"), 32 | size: ColumnSize.L, 33 | ), 34 | DataColumn( 35 | label: Text('Location'), 36 | ), 37 | DataColumn( 38 | label: Text('Rating'), 39 | ), 40 | DataColumn( 41 | label: Text('Action'), 42 | ), 43 | ], 44 | rows: List.generate( 45 | 15, 46 | (index) => DataRow(cells: [ 47 | const DataCell(CustomText(text: "Santos Enoque")), 48 | const DataCell(CustomText(text: "New yourk city")), 49 | const DataCell(Row( 50 | mainAxisSize: MainAxisSize.min, 51 | children: [ 52 | Icon( 53 | Icons.star, 54 | color: Colors.deepOrange, 55 | size: 18, 56 | ), 57 | SizedBox( 58 | width: 5, 59 | ), 60 | CustomText( 61 | text: "4.5", 62 | ) 63 | ], 64 | )), 65 | DataCell(Container( 66 | decoration: BoxDecoration( 67 | color: light, 68 | borderRadius: BorderRadius.circular(20), 69 | border: Border.all(color: active, width: .5), 70 | ), 71 | padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), 72 | child: CustomText( 73 | text: "Block", 74 | color: active.withOpacity(.7), 75 | weight: FontWeight.bold, 76 | ))), 77 | ]))), 78 | ), 79 | ); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /lib/pages/notifications/notifications.dart: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santos-Enoque/flutter-web-dashboard-template/32c3f21191212e6c164575898ba7ec88176d1365/lib/pages/notifications/notifications.dart -------------------------------------------------------------------------------- /lib/pages/overview/overview.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/helpers/reponsiveness.dart'; 3 | import 'package:flutter_web_dashboard/constants/controllers.dart'; 4 | import 'package:flutter_web_dashboard/pages/overview/widgets/available_drivers_table.dart'; 5 | import 'package:flutter_web_dashboard/pages/overview/widgets/overview_cards_large.dart'; 6 | import 'package:flutter_web_dashboard/pages/overview/widgets/overview_cards_medium.dart'; 7 | import 'package:flutter_web_dashboard/pages/overview/widgets/overview_cards_small.dart'; 8 | import 'package:flutter_web_dashboard/pages/overview/widgets/revenue_section_large.dart'; 9 | import 'package:flutter_web_dashboard/widgets/custom_text.dart'; 10 | import 'package:get/get.dart'; 11 | 12 | import 'widgets/revenue_section_small.dart'; 13 | 14 | class OverviewPage extends StatelessWidget { 15 | const OverviewPage({super.key}); 16 | 17 | @override 18 | Widget build(BuildContext context) { 19 | return Column( 20 | children: [ 21 | Obx( 22 | () => Row( 23 | children: [ 24 | Container( 25 | margin: EdgeInsets.only(top: ResponsiveWidget.isSmallScreen(context) ? 56 : 6), 26 | child: CustomText( 27 | text: menuController.activeItem.value, 28 | size: 24, 29 | weight: FontWeight.bold, 30 | )), 31 | ], 32 | ), 33 | ), 34 | Expanded( 35 | child: ListView( 36 | children: [ 37 | if (ResponsiveWidget.isLargeScreen(context) || ResponsiveWidget.isMediumScreen(context)) 38 | if (ResponsiveWidget.isCustomSize(context)) const OverviewCardsMediumScreen() else const OverviewCardsLargeScreen() 39 | else 40 | const OverviewCardsSmallScreen(), 41 | if (!ResponsiveWidget.isSmallScreen(context)) const RevenueSectionLarge() else const RevenueSectionSmall(), 42 | const AvailableDriversTable(), 43 | ], 44 | ), 45 | ), 46 | ], 47 | ); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /lib/pages/overview/widgets/available_drivers_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:data_table_2/data_table_2.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_web_dashboard/constants/style.dart'; 4 | import 'package:flutter_web_dashboard/widgets/custom_text.dart'; 5 | 6 | /// Example without datasource 7 | class AvailableDriversTable extends StatelessWidget { 8 | const AvailableDriversTable({super.key}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Container( 13 | decoration: BoxDecoration( 14 | color: Colors.white, 15 | border: Border.all(color: active.withOpacity(.4), width: .5), 16 | boxShadow: [BoxShadow(offset: const Offset(0, 6), color: lightGrey.withOpacity(.1), blurRadius: 12)], 17 | borderRadius: BorderRadius.circular(8), 18 | ), 19 | padding: const EdgeInsets.all(16), 20 | margin: const EdgeInsets.only(bottom: 30), 21 | child: Column( 22 | mainAxisSize: MainAxisSize.min, 23 | children: [ 24 | const Row( 25 | children: [ 26 | SizedBox( 27 | width: 10, 28 | ), 29 | CustomText( 30 | text: "Available Drivers", 31 | color: lightGrey, 32 | weight: FontWeight.bold, 33 | ), 34 | ], 35 | ), 36 | SizedBox( 37 | height: (56 * 7) + 40, 38 | child: DataTable2( 39 | columnSpacing: 12, 40 | dataRowHeight: 56, 41 | headingRowHeight: 40, 42 | horizontalMargin: 12, 43 | minWidth: 600, 44 | columns: const [ 45 | DataColumn2( 46 | label: Text("Name"), 47 | size: ColumnSize.L, 48 | ), 49 | DataColumn( 50 | label: Text('Location'), 51 | ), 52 | DataColumn( 53 | label: Text('Rating'), 54 | ), 55 | DataColumn( 56 | label: Text('Action'), 57 | ), 58 | ], 59 | rows: List.generate( 60 | 7, 61 | (index) => DataRow( 62 | cells: [ 63 | const DataCell(CustomText(text: "Santos Enoque")), 64 | const DataCell(CustomText(text: "New yourk city")), 65 | const DataCell( 66 | Row( 67 | mainAxisSize: MainAxisSize.min, 68 | children: [ 69 | Icon(Icons.star, color: Colors.deepOrange, size: 18), 70 | SizedBox(width: 5), 71 | CustomText(text: "4.5"), 72 | ], 73 | ), 74 | ), 75 | DataCell( 76 | Container( 77 | decoration: BoxDecoration( 78 | color: light, 79 | borderRadius: BorderRadius.circular(20), 80 | border: Border.all(color: active, width: .5), 81 | ), 82 | padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), 83 | child: CustomText( 84 | text: "Assign Delivery", 85 | color: active.withOpacity(.7), 86 | weight: FontWeight.bold, 87 | ), 88 | ), 89 | ), 90 | ], 91 | ), 92 | ), 93 | ), 94 | ), 95 | ], 96 | ), 97 | ); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /lib/pages/overview/widgets/bar_chart.dart: -------------------------------------------------------------------------------- 1 | /// Bar chart example 2 | import 'package:charts_flutter_new/flutter.dart' as charts; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_web_dashboard/constants/style.dart'; 5 | 6 | class SimpleBarChart extends StatelessWidget { 7 | final List> seriesList; 8 | final bool? animate; 9 | 10 | const SimpleBarChart(this.seriesList, {super.key, this.animate}); 11 | 12 | /// Creates a [BarChart] with sample data and no transition. 13 | factory SimpleBarChart.withSampleData() { 14 | return SimpleBarChart( 15 | _createSampleData(), 16 | // Disable animations for image tests. 17 | animate: false, 18 | ); 19 | } 20 | 21 | @override 22 | Widget build(BuildContext context) { 23 | return charts.BarChart( 24 | seriesList, 25 | animate: animate, 26 | ); 27 | } 28 | 29 | /// Create one series with sample hard coded data. 30 | static List> _createSampleData() { 31 | final data = [ 32 | OrdinalSales('Today', 55), 33 | OrdinalSales('Yesterday', 25), 34 | OrdinalSales('2 days', 100), 35 | OrdinalSales('24 Jun', 75), 36 | OrdinalSales('23 Jun', 15), 37 | OrdinalSales('22 Jun', 85), 38 | OrdinalSales('21 Jun', 45), 39 | ]; 40 | 41 | return [ 42 | charts.Series( 43 | id: 'Sales', 44 | colorFn: (_, __) => charts.ColorUtil.fromDartColor(active), 45 | domainFn: (OrdinalSales sales, _) => sales.year, 46 | measureFn: (OrdinalSales sales, _) => sales.sales, 47 | data: data, 48 | ) 49 | ]; 50 | } 51 | } 52 | 53 | /// Sample ordinal data type. 54 | class OrdinalSales { 55 | final String year; 56 | final int sales; 57 | 58 | OrdinalSales(this.year, this.sales); 59 | } 60 | -------------------------------------------------------------------------------- /lib/pages/overview/widgets/info_card.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/style.dart'; 3 | 4 | class InfoCard extends StatelessWidget { 5 | final String title; 6 | final String value; 7 | final Color? topColor; 8 | final bool isActive; 9 | final Function() onTap; 10 | 11 | const InfoCard({Key? key, required this.title, required this.value, this.isActive = false, required this.onTap, this.topColor}) : super(key: key); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return Expanded( 16 | child: InkWell( 17 | onTap: onTap, 18 | child: Container( 19 | height: 136, 20 | alignment: Alignment.center, 21 | decoration: BoxDecoration( 22 | color: Colors.white, 23 | boxShadow: [ 24 | BoxShadow( 25 | offset: const Offset(0, 6), 26 | color: lightGrey.withOpacity(.1), 27 | blurRadius: 12, 28 | ), 29 | ], 30 | borderRadius: BorderRadius.circular(8), 31 | ), 32 | child: Column( 33 | children: [ 34 | Row( 35 | children: [ 36 | Expanded( 37 | child: Container( 38 | color: topColor ?? active, 39 | height: 5, 40 | )) 41 | ], 42 | ), 43 | Expanded(child: Container()), 44 | RichText( 45 | textAlign: TextAlign.center, 46 | text: TextSpan(children: [ 47 | TextSpan(text: "$title\n", style: TextStyle(fontSize: 16, color: isActive ? active : lightGrey)), 48 | TextSpan(text: value, style: TextStyle(fontSize: 40, color: isActive ? active : dark)), 49 | ])), 50 | Expanded(child: Container()), 51 | ], 52 | ), 53 | ), 54 | ), 55 | ); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /lib/pages/overview/widgets/info_card_small.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/style.dart'; 3 | import 'package:flutter_web_dashboard/widgets/custom_text.dart'; 4 | 5 | class InfoCardSmall extends StatelessWidget { 6 | final String title; 7 | final String value; 8 | final bool isActive; 9 | final Function() onTap; 10 | 11 | const InfoCardSmall({ 12 | Key? key, 13 | required this.title, 14 | required this.value, 15 | this.isActive = false, 16 | required this.onTap, 17 | }) : super(key: key); 18 | 19 | @override 20 | Widget build(BuildContext context) { 21 | return Expanded( 22 | child: InkWell( 23 | onTap: onTap, 24 | child: Container( 25 | padding: const EdgeInsets.all(24), 26 | decoration: BoxDecoration( 27 | color: Colors.white, 28 | borderRadius: BorderRadius.circular(8), 29 | border: Border.all(color: isActive ? active : lightGrey, width: .5), 30 | ), 31 | child: Row( 32 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 33 | children: [ 34 | CustomText( 35 | text: title, 36 | size: 24, 37 | weight: FontWeight.w300, 38 | color: isActive ? active : lightGrey, 39 | ), 40 | CustomText( 41 | text: value, 42 | size: 24, 43 | weight: FontWeight.bold, 44 | color: isActive ? active : dark, 45 | ) 46 | ], 47 | )), 48 | ), 49 | ); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /lib/pages/overview/widgets/overview_cards_large.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/pages/overview/widgets/info_card.dart'; 3 | 4 | 5 | class OverviewCardsLargeScreen extends StatelessWidget { 6 | const OverviewCardsLargeScreen({super.key}); 7 | 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | double width = MediaQuery.of(context).size.width; 12 | 13 | return Row( 14 | children: [ 15 | InfoCard( 16 | title: "Rides in progress", 17 | value: "7", 18 | onTap: () {}, 19 | topColor: Colors.orange, 20 | ), 21 | SizedBox( 22 | width: width / 64, 23 | ), 24 | InfoCard( 25 | title: "Packages delivered", 26 | value: "17", 27 | topColor: Colors.lightGreen, 28 | onTap: () {}, 29 | ), 30 | SizedBox( 31 | width: width / 64, 32 | ), 33 | InfoCard( 34 | title: "Cancelled delivery", 35 | value: "3", 36 | topColor: Colors.redAccent, 37 | onTap: () {}, 38 | ), 39 | SizedBox( 40 | width: width / 64, 41 | ), 42 | InfoCard( 43 | title: "Scheduled deliveries", 44 | value: "32", 45 | onTap: () {}, 46 | ), 47 | ], 48 | ); 49 | } 50 | } -------------------------------------------------------------------------------- /lib/pages/overview/widgets/overview_cards_medium.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/pages/overview/widgets/info_card.dart'; 3 | 4 | 5 | class OverviewCardsMediumScreen extends StatelessWidget { 6 | const OverviewCardsMediumScreen({super.key}); 7 | 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | double width = MediaQuery.of(context).size.width; 12 | 13 | return Column( 14 | mainAxisSize: MainAxisSize.min, 15 | children: [ 16 | Row( 17 | children: [ 18 | InfoCard( 19 | title: "Rides in progress", 20 | value: "7", 21 | onTap: () {}, 22 | topColor: Colors.orange, 23 | 24 | ), 25 | SizedBox( 26 | width: width / 64, 27 | ), 28 | InfoCard( 29 | title: "Packages delivered", 30 | value: "17", 31 | topColor: Colors.lightGreen, 32 | 33 | onTap: () {}, 34 | ), 35 | 36 | ], 37 | ), 38 | SizedBox( 39 | height: width / 64, 40 | ), 41 | Row( 42 | children: [ 43 | 44 | InfoCard( 45 | title: "Cancelled delivery", 46 | value: "3", 47 | topColor: Colors.redAccent, 48 | 49 | onTap: () {}, 50 | ), 51 | SizedBox( 52 | width: width / 64, 53 | ), 54 | InfoCard( 55 | title: "Scheduled deliveries", 56 | value: "32", 57 | onTap: () {}, 58 | ), 59 | 60 | ], 61 | ), 62 | ], 63 | ); 64 | } 65 | } -------------------------------------------------------------------------------- /lib/pages/overview/widgets/overview_cards_small.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'info_card_small.dart'; 3 | 4 | 5 | class OverviewCardsSmallScreen extends StatelessWidget { 6 | const OverviewCardsSmallScreen({super.key}); 7 | 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | double width = MediaQuery.of(context).size.width; 12 | 13 | return SizedBox( 14 | height: 400, 15 | child: Column( 16 | children: [ 17 | InfoCardSmall( 18 | title: "Rides in progress", 19 | value: "7", 20 | onTap: () {}, 21 | isActive: true, 22 | ), 23 | SizedBox( 24 | height: width / 64, 25 | ), 26 | InfoCardSmall( 27 | title: "Packages delivered", 28 | value: "17", 29 | onTap: () {}, 30 | ), 31 | SizedBox( 32 | height: width / 64, 33 | ), 34 | InfoCardSmall( 35 | title: "Cancelled delivery", 36 | value: "3", 37 | onTap: () {}, 38 | ), 39 | SizedBox( 40 | height: width / 64, 41 | ), 42 | InfoCardSmall( 43 | title: "Scheduled deliveries", 44 | value: "32", 45 | onTap: () {}, 46 | ), 47 | 48 | ], 49 | ), 50 | ); 51 | } 52 | } -------------------------------------------------------------------------------- /lib/pages/overview/widgets/revenue_info.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/style.dart'; 3 | 4 | class RevenueInfo extends StatelessWidget { 5 | final String? title; 6 | final String? amount; 7 | 8 | const RevenueInfo({Key? key, this.title, this.amount}) : super(key: key); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Expanded( 13 | child: RichText( 14 | textAlign: TextAlign.center, 15 | text: TextSpan(children: [ 16 | TextSpan( 17 | text: "$title \n\n", 18 | style: const TextStyle(color: lightGrey, fontSize: 16)), 19 | TextSpan( 20 | text: "\$ $amount", 21 | style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold)), 22 | ])), 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/pages/overview/widgets/revenue_section_large.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/style.dart'; 3 | import 'package:flutter_web_dashboard/pages/overview/widgets/bar_chart.dart'; 4 | import 'package:flutter_web_dashboard/pages/overview/widgets/revenue_info.dart'; 5 | import 'package:flutter_web_dashboard/widgets/custom_text.dart'; 6 | 7 | class RevenueSectionLarge extends StatelessWidget { 8 | const RevenueSectionLarge({super.key}); 9 | 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Container( 14 | padding: const EdgeInsets.all(24), 15 | margin: const EdgeInsets.symmetric(vertical: 30), 16 | decoration: BoxDecoration( 17 | color: Colors.white, 18 | borderRadius: BorderRadius.circular(8), 19 | boxShadow: [ 20 | BoxShadow( 21 | offset: const Offset(0, 6), 22 | color: lightGrey.withOpacity(.1), 23 | blurRadius: 12) 24 | ], 25 | border: Border.all(color: lightGrey, width: .5), 26 | ), 27 | child: Row( 28 | children: [ 29 | Expanded( 30 | child: Column( 31 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 32 | children: [ 33 | const CustomText( 34 | text: "Revenue Chart", 35 | size: 20, 36 | weight: FontWeight.bold, 37 | color: lightGrey, 38 | ), 39 | SizedBox( 40 | width: 600, 41 | height: 200, 42 | child: SimpleBarChart.withSampleData()), 43 | ], 44 | ), 45 | ), 46 | Container( 47 | width: 1, 48 | height: 120, 49 | color: lightGrey, 50 | ), 51 | const Expanded( 52 | child: Column( 53 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 54 | children: [ 55 | Row( 56 | children: [ 57 | RevenueInfo( 58 | title: "Toda's revenue", 59 | amount: "230", 60 | ), 61 | RevenueInfo( 62 | title: "Last 7 days", 63 | amount: "1,100", 64 | ), 65 | ], 66 | ), 67 | SizedBox(height: 30,), 68 | Row( 69 | children: [ 70 | RevenueInfo( 71 | title: "Last 30 days", 72 | amount: "3,230", 73 | ), 74 | RevenueInfo( 75 | title: "Last 12 months", 76 | amount: "11,300", 77 | ), 78 | ], 79 | ), 80 | ], 81 | ), 82 | ), 83 | ], 84 | ), 85 | ); 86 | } 87 | } -------------------------------------------------------------------------------- /lib/pages/overview/widgets/revenue_section_small.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/style.dart'; 3 | import 'package:flutter_web_dashboard/pages/overview/widgets/bar_chart.dart'; 4 | import 'package:flutter_web_dashboard/pages/overview/widgets/revenue_info.dart'; 5 | import 'package:flutter_web_dashboard/widgets/custom_text.dart'; 6 | 7 | class RevenueSectionSmall extends StatelessWidget { 8 | const RevenueSectionSmall({super.key}); 9 | 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Container( 14 | padding: const EdgeInsets.all(24), 15 | margin: const EdgeInsets.symmetric(vertical: 30), 16 | decoration: BoxDecoration( 17 | color: Colors.white, 18 | borderRadius: BorderRadius.circular(8), 19 | boxShadow: [ 20 | BoxShadow( 21 | offset: const Offset(0, 6), 22 | color: lightGrey.withOpacity(.1), 23 | blurRadius: 12) 24 | ], 25 | border: Border.all(color: lightGrey, width: .5), 26 | ), 27 | child: Column( 28 | children: [ 29 | SizedBox( 30 | height: 260, 31 | child: Column( 32 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 33 | children: [ 34 | const CustomText( 35 | text: "Revenue Chart", 36 | size: 20, 37 | weight: FontWeight.bold, 38 | color: lightGrey, 39 | ), 40 | SizedBox( 41 | width: 600, 42 | height: 200, 43 | child: SimpleBarChart.withSampleData()), 44 | ], 45 | ), 46 | ), 47 | Container( 48 | width: 120, 49 | height: 1, 50 | color: lightGrey, 51 | ), 52 | const SizedBox( 53 | height: 260, 54 | child: Column( 55 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 56 | children: [ 57 | Row( 58 | children: [ 59 | RevenueInfo( 60 | title: "Toda\'s revenue", 61 | amount: "230", 62 | ), 63 | RevenueInfo( 64 | title: "Last 7 days", 65 | amount: "1,100", 66 | ), 67 | ], 68 | ), 69 | Row( 70 | children: [ 71 | RevenueInfo( 72 | title: "Last 30 days", 73 | amount: "3,230", 74 | ), 75 | RevenueInfo( 76 | title: "Last 12 months", 77 | amount: "11,300", 78 | ), 79 | ], 80 | ), 81 | ], 82 | ), 83 | ), 84 | ], 85 | ), 86 | ); 87 | } 88 | } -------------------------------------------------------------------------------- /lib/pages/users/users.dart: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santos-Enoque/flutter-web-dashboard-template/32c3f21191212e6c164575898ba7ec88176d1365/lib/pages/users/users.dart -------------------------------------------------------------------------------- /lib/routing/router.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/pages/clients/clients.dart'; 3 | import 'package:flutter_web_dashboard/pages/drivers/drivers.dart'; 4 | import 'package:flutter_web_dashboard/pages/overview/overview.dart'; 5 | import 'package:flutter_web_dashboard/routing/routes.dart'; 6 | 7 | Route generateRoute(RouteSettings settings) { 8 | switch (settings.name) { 9 | case overviewPageRoute: 10 | return _getPageRoute(const OverviewPage()); 11 | case driversPageRoute: 12 | return _getPageRoute(const DriversPage()); 13 | case clientsPageRoute: 14 | return _getPageRoute(const ClientsPage()); 15 | default: 16 | return _getPageRoute(const OverviewPage()); 17 | } 18 | } 19 | 20 | PageRoute _getPageRoute(Widget child) { 21 | return MaterialPageRoute(builder: (context) => child); 22 | } 23 | -------------------------------------------------------------------------------- /lib/routing/routes.dart: -------------------------------------------------------------------------------- 1 | const rootRoute = "/"; 2 | 3 | const overviewPageDisplayName = "Overview"; 4 | const overviewPageRoute = "/overview"; 5 | 6 | const driversPageDisplayName = "Drivers"; 7 | const driversPageRoute = "/drivers"; 8 | 9 | const clientsPageDisplayName = "Clients"; 10 | const clientsPageRoute = "/clients"; 11 | 12 | const authenticationPageDisplayName = "Log out"; 13 | const authenticationPageRoute = "/auth"; 14 | 15 | class MenuItem { 16 | final String name; 17 | final String route; 18 | 19 | MenuItem(this.name, this.route); 20 | } 21 | 22 | 23 | 24 | List sideMenuItemRoutes = [ 25 | MenuItem(overviewPageDisplayName, overviewPageRoute), 26 | MenuItem(driversPageDisplayName, driversPageRoute), 27 | MenuItem(clientsPageDisplayName, clientsPageRoute), 28 | MenuItem(authenticationPageDisplayName, authenticationPageRoute), 29 | ]; 30 | -------------------------------------------------------------------------------- /lib/vertical_menu_item.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/controllers.dart'; 3 | import 'package:get/get.dart'; 4 | import 'package:flutter_web_dashboard/constants/style.dart'; 5 | 6 | import 'widgets/custom_text.dart'; 7 | 8 | class VertticalMenuItem extends StatelessWidget { 9 | final String itemName; 10 | final Function()? onTap; 11 | const VertticalMenuItem({Key? key, required this.itemName, this.onTap}) 12 | : super(key: key); 13 | 14 | @override 15 | Widget build(BuildContext context) { 16 | return InkWell( 17 | onTap: onTap, 18 | onHover: (value) { 19 | value 20 | ? menuController.onHover(itemName) 21 | : menuController.onHover("not hovering"); 22 | }, 23 | child: Obx(() => Container( 24 | color: menuController.isHovering(itemName) 25 | ? lightGrey.withOpacity(.1) 26 | : Colors.transparent, 27 | child: Row( 28 | children: [ 29 | Visibility( 30 | visible: menuController.isHovering(itemName) || 31 | menuController.isActive(itemName), 32 | maintainSize: true, 33 | maintainAnimation: true, 34 | maintainState: true, 35 | child: Container( 36 | width: 3, 37 | height: 72, 38 | color: Colors.white, 39 | ), 40 | ), 41 | Expanded( 42 | child: Column( 43 | mainAxisSize: MainAxisSize.min, 44 | children: [ 45 | Padding( 46 | padding: const EdgeInsets.all(16), 47 | child: menuController.returnIconFor(itemName), 48 | ), 49 | if (!menuController.isActive(itemName)) 50 | Flexible( 51 | child: CustomText( 52 | text: itemName, 53 | color: menuController.isHovering(itemName) 54 | ? Colors.white 55 | : lightGrey, 56 | )) 57 | else 58 | Flexible( 59 | child: CustomText( 60 | text: itemName, 61 | color: Colors.white, 62 | size: 18, 63 | weight: FontWeight.bold, 64 | )) 65 | ], 66 | ), 67 | ), 68 | ], 69 | ), 70 | ))); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /lib/widgets/custom_text.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class CustomText extends StatelessWidget { 4 | final String text; 5 | final double? size; 6 | final Color? color; 7 | final FontWeight? weight; 8 | 9 | const CustomText({Key? key,required this.text, this.size, this.color, this.weight}) : super(key: key); 10 | 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return Text( 15 | text ,style: TextStyle(fontSize: size ?? 16, color: color ?? Colors.black, fontWeight: weight ?? FontWeight.normal), 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/widgets/horizontal_menu_item.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/controllers.dart'; 3 | import 'package:get/get.dart'; 4 | import 'package:flutter_web_dashboard/constants/style.dart'; 5 | 6 | import 'custom_text.dart'; 7 | 8 | class HorizontalMenuItem extends StatelessWidget { 9 | final String itemName; 10 | final Function()? onTap; 11 | const HorizontalMenuItem({ Key? key,required this.itemName, this.onTap }) : super(key: key); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | double width = MediaQuery.of(context).size.width; 16 | 17 | return InkWell( 18 | onTap: onTap, 19 | onHover: (value){ 20 | value ? 21 | menuController.onHover(itemName) : menuController.onHover("not hovering"); 22 | }, 23 | child: Obx(() => Container( 24 | color: menuController.isHovering(itemName) ? lightGrey.withOpacity(.1) : Colors.transparent, 25 | child: Row( 26 | children: [ 27 | Visibility( 28 | visible: menuController.isHovering(itemName) || menuController.isActive(itemName), 29 | maintainSize: true, 30 | maintainAnimation: true, 31 | maintainState: true, 32 | child: Container( 33 | width: 6, 34 | height: 40, 35 | color: dark, 36 | ), 37 | ), 38 | SizedBox(width:width / 88), 39 | 40 | Padding( 41 | padding: const EdgeInsets.all(16), 42 | child: menuController.returnIconFor(itemName), 43 | ), 44 | if(!menuController.isActive(itemName)) 45 | Flexible(child: CustomText(text: itemName , color: menuController.isHovering(itemName) ? dark : lightGrey,)) 46 | else 47 | Flexible(child: CustomText(text: itemName , color: dark , size: 18, weight: FontWeight.bold,)) 48 | 49 | ], 50 | ), 51 | )) 52 | ); 53 | } 54 | } -------------------------------------------------------------------------------- /lib/widgets/large_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/helpers/local_navigator.dart'; 3 | import 'package:flutter_web_dashboard/widgets/side_menu.dart'; 4 | 5 | class LargeScreen extends StatelessWidget { 6 | const LargeScreen({Key? key}) : super(key: key); 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return Row( 11 | crossAxisAlignment: CrossAxisAlignment.start, 12 | children: [ 13 | const Expanded(child: SideMenu()), 14 | Expanded( 15 | flex: 5, 16 | child: Container( 17 | margin: const EdgeInsets.symmetric(horizontal: 16), 18 | child: localNavigator(), 19 | ), 20 | ) 21 | ], 22 | ); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/widgets/side_menu.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/controllers.dart'; 3 | import 'package:flutter_web_dashboard/constants/style.dart'; 4 | import 'package:flutter_web_dashboard/helpers/reponsiveness.dart'; 5 | import 'package:flutter_web_dashboard/routing/routes.dart'; 6 | import 'package:flutter_web_dashboard/widgets/custom_text.dart'; 7 | import 'package:flutter_web_dashboard/widgets/side_menu_item.dart'; 8 | import 'package:get/get.dart'; 9 | 10 | class SideMenu extends StatelessWidget { 11 | const SideMenu({ Key? key }) : super(key: key); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | double width = MediaQuery.of(context).size.width; 16 | 17 | return Container( 18 | color: light, 19 | child: ListView( 20 | children: [ 21 | if(ResponsiveWidget.isSmallScreen(context)) 22 | Column( 23 | mainAxisSize: MainAxisSize.min, 24 | children: [ 25 | const SizedBox( 26 | height: 40, 27 | ), 28 | Row( 29 | children: [ 30 | SizedBox(width: width / 48), 31 | Padding( 32 | padding: const EdgeInsets.only(right: 12), 33 | child: Image.asset("assets/icons/logo.png"), 34 | ), 35 | const Flexible( 36 | child: CustomText( 37 | text: "Dash", 38 | size: 20, 39 | weight: FontWeight.bold, 40 | color: active, 41 | ), 42 | ), 43 | SizedBox(width: width / 48), 44 | ], 45 | ), 46 | const SizedBox( 47 | height: 30, 48 | ), 49 | ], 50 | ), 51 | Divider(color: lightGrey.withOpacity(.1), ), 52 | 53 | Column( 54 | mainAxisSize: MainAxisSize.min, 55 | children: sideMenuItemRoutes 56 | .map((item) => SideMenuItem( 57 | itemName: item.name, 58 | onTap: () { 59 | if(item.route == authenticationPageRoute){ 60 | Get.offAllNamed(authenticationPageRoute); 61 | menuController.changeActiveItemTo(overviewPageDisplayName); 62 | 63 | } 64 | if (!menuController.isActive(item.name)) { 65 | menuController.changeActiveItemTo(item.name); 66 | if(ResponsiveWidget.isSmallScreen(context)) { 67 | Get.back(); 68 | } 69 | navigationController.navigateTo(item.route); 70 | } 71 | })) 72 | .toList(), 73 | ) 74 | ], 75 | ), 76 | ); 77 | } 78 | } -------------------------------------------------------------------------------- /lib/widgets/side_menu_item.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/helpers/reponsiveness.dart'; 3 | import 'package:flutter_web_dashboard/widgets/horizontal_menu_item.dart'; 4 | import 'package:flutter_web_dashboard/vertical_menu_item.dart'; 5 | 6 | class SideMenuItem extends StatelessWidget { 7 | final String itemName; 8 | final Function() onTap; 9 | 10 | const SideMenuItem({Key? key, required this.itemName, required this.onTap}) 11 | : super(key: key); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | if (ResponsiveWidget.isCustomSize(context)) { 16 | return VertticalMenuItem( 17 | itemName: itemName, 18 | onTap: onTap, 19 | ); 20 | } else { 21 | return HorizontalMenuItem( 22 | itemName: itemName, 23 | onTap: onTap, 24 | ); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lib/widgets/top_nav.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_web_dashboard/constants/style.dart'; 3 | import 'package:flutter_web_dashboard/helpers/reponsiveness.dart'; 4 | 5 | import 'custom_text.dart'; 6 | 7 | AppBar topNavigationBar(BuildContext context, GlobalKey key) => 8 | AppBar( 9 | leading: !ResponsiveWidget.isSmallScreen(context) 10 | ? Row( 11 | children: [ 12 | Padding( 13 | padding: const EdgeInsets.only(left: 16), 14 | child: Image.asset( 15 | "assets/icons/logo.png", 16 | width: 28, 17 | ), 18 | ), 19 | ], 20 | ) 21 | : IconButton( 22 | icon: const Icon(Icons.menu), 23 | onPressed: () { 24 | key.currentState?.openDrawer(); 25 | }), 26 | title: Row( 27 | children: [ 28 | Visibility( 29 | visible: !ResponsiveWidget.isSmallScreen(context), 30 | child: const CustomText( 31 | text: "Dash", 32 | color: lightGrey, 33 | size: 20, 34 | weight: FontWeight.bold, 35 | )), 36 | Expanded(child: Container()), 37 | IconButton( 38 | icon: const Icon( 39 | Icons.settings, 40 | color: dark, 41 | ), 42 | onPressed: () {}), 43 | Stack( 44 | children: [ 45 | IconButton( 46 | icon: Icon( 47 | Icons.notifications, 48 | color: dark.withOpacity(.7), 49 | ), 50 | onPressed: () {}), 51 | Positioned( 52 | top: 7, 53 | right: 7, 54 | child: Container( 55 | width: 12, 56 | height: 12, 57 | padding: const EdgeInsets.all(4), 58 | decoration: BoxDecoration( 59 | color: active, 60 | borderRadius: BorderRadius.circular(30), 61 | border: Border.all(color: light, width: 2)), 62 | ), 63 | ) 64 | ], 65 | ), 66 | Container( 67 | width: 1, 68 | height: 22, 69 | color: lightGrey, 70 | ), 71 | const SizedBox( 72 | width: 24, 73 | ), 74 | const CustomText( 75 | text: "Santos Enoque", 76 | color: lightGrey, 77 | ), 78 | const SizedBox( 79 | width: 16, 80 | ), 81 | Container( 82 | decoration: BoxDecoration( 83 | color: active.withOpacity(.5), 84 | borderRadius: BorderRadius.circular(30)), 85 | child: Container( 86 | decoration: BoxDecoration( 87 | color: Colors.white, borderRadius: BorderRadius.circular(30)), 88 | padding: const EdgeInsets.all(2), 89 | margin: const EdgeInsets.all(2), 90 | child: const CircleAvatar( 91 | backgroundColor: light, 92 | child: Icon( 93 | Icons.person_outline, 94 | color: dark, 95 | ), 96 | ), 97 | ), 98 | ) 99 | ], 100 | ), 101 | iconTheme: const IconThemeData(color: dark), 102 | elevation: 0, 103 | backgroundColor: Colors.transparent, 104 | ); 105 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.11.0" 12 | boolean_selector: 13 | dependency: transitive 14 | description: 15 | name: boolean_selector 16 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.1.1" 20 | characters: 21 | dependency: transitive 22 | description: 23 | name: characters 24 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "1.3.0" 28 | charts_common: 29 | dependency: transitive 30 | description: 31 | name: charts_common 32 | sha256: "7b8922f9b0d9b134122756a787dab1c3946ae4f3fc5022ff323ba0014998ea02" 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "0.12.0" 36 | charts_flutter_new: 37 | dependency: "direct main" 38 | description: 39 | name: charts_flutter_new 40 | sha256: c8c106c5d6acd145d6969f85aa65412ccf2c27bbb0177ec11c10a285a286524a 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "0.12.0" 44 | clock: 45 | dependency: transitive 46 | description: 47 | name: clock 48 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.1.1" 52 | collection: 53 | dependency: transitive 54 | description: 55 | name: collection 56 | sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "1.17.2" 60 | crypto: 61 | dependency: transitive 62 | description: 63 | name: crypto 64 | sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab 65 | url: "https://pub.dev" 66 | source: hosted 67 | version: "3.0.3" 68 | cupertino_icons: 69 | dependency: "direct main" 70 | description: 71 | name: cupertino_icons 72 | sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be 73 | url: "https://pub.dev" 74 | source: hosted 75 | version: "1.0.5" 76 | data_table_2: 77 | dependency: "direct main" 78 | description: 79 | name: data_table_2 80 | sha256: "3898c424db33437ba2eb8e6bd2e7db3635a19efc0daadfaee427e1949f399b0f" 81 | url: "https://pub.dev" 82 | source: hosted 83 | version: "2.5.6" 84 | fake_async: 85 | dependency: transitive 86 | description: 87 | name: fake_async 88 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 89 | url: "https://pub.dev" 90 | source: hosted 91 | version: "1.3.1" 92 | ffi: 93 | dependency: transitive 94 | description: 95 | name: ffi 96 | sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" 97 | url: "https://pub.dev" 98 | source: hosted 99 | version: "2.1.0" 100 | flutter: 101 | dependency: "direct main" 102 | description: flutter 103 | source: sdk 104 | version: "0.0.0" 105 | flutter_lints: 106 | dependency: "direct dev" 107 | description: 108 | name: flutter_lints 109 | sha256: "2118df84ef0c3ca93f96123a616ae8540879991b8b57af2f81b76a7ada49b2a4" 110 | url: "https://pub.dev" 111 | source: hosted 112 | version: "2.0.2" 113 | flutter_test: 114 | dependency: "direct dev" 115 | description: flutter 116 | source: sdk 117 | version: "0.0.0" 118 | get: 119 | dependency: "direct main" 120 | description: 121 | name: get 122 | sha256: "2ba20a47c8f1f233bed775ba2dd0d3ac97b4cf32fc17731b3dfc672b06b0e92a" 123 | url: "https://pub.dev" 124 | source: hosted 125 | version: "4.6.5" 126 | google_fonts: 127 | dependency: "direct main" 128 | description: 129 | name: google_fonts 130 | sha256: e20ff62b158b96f392bfc8afe29dee1503c94fbea2cbe8186fd59b756b8ae982 131 | url: "https://pub.dev" 132 | source: hosted 133 | version: "5.1.0" 134 | http: 135 | dependency: transitive 136 | description: 137 | name: http 138 | sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" 139 | url: "https://pub.dev" 140 | source: hosted 141 | version: "1.1.0" 142 | http_parser: 143 | dependency: transitive 144 | description: 145 | name: http_parser 146 | sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" 147 | url: "https://pub.dev" 148 | source: hosted 149 | version: "4.0.2" 150 | intl: 151 | dependency: transitive 152 | description: 153 | name: intl 154 | sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" 155 | url: "https://pub.dev" 156 | source: hosted 157 | version: "0.17.0" 158 | lints: 159 | dependency: transitive 160 | description: 161 | name: lints 162 | sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" 163 | url: "https://pub.dev" 164 | source: hosted 165 | version: "2.1.1" 166 | logging: 167 | dependency: transitive 168 | description: 169 | name: logging 170 | sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" 171 | url: "https://pub.dev" 172 | source: hosted 173 | version: "1.2.0" 174 | matcher: 175 | dependency: transitive 176 | description: 177 | name: matcher 178 | sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" 179 | url: "https://pub.dev" 180 | source: hosted 181 | version: "0.12.16" 182 | material_color_utilities: 183 | dependency: transitive 184 | description: 185 | name: material_color_utilities 186 | sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" 187 | url: "https://pub.dev" 188 | source: hosted 189 | version: "0.5.0" 190 | meta: 191 | dependency: transitive 192 | description: 193 | name: meta 194 | sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" 195 | url: "https://pub.dev" 196 | source: hosted 197 | version: "1.9.1" 198 | path: 199 | dependency: transitive 200 | description: 201 | name: path 202 | sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" 203 | url: "https://pub.dev" 204 | source: hosted 205 | version: "1.8.3" 206 | path_provider: 207 | dependency: transitive 208 | description: 209 | name: path_provider 210 | sha256: "909b84830485dbcd0308edf6f7368bc8fd76afa26a270420f34cabea2a6467a0" 211 | url: "https://pub.dev" 212 | source: hosted 213 | version: "2.1.0" 214 | path_provider_android: 215 | dependency: transitive 216 | description: 217 | name: path_provider_android 218 | sha256: "5d44fc3314d969b84816b569070d7ace0f1dea04bd94a83f74c4829615d22ad8" 219 | url: "https://pub.dev" 220 | source: hosted 221 | version: "2.1.0" 222 | path_provider_foundation: 223 | dependency: transitive 224 | description: 225 | name: path_provider_foundation 226 | sha256: "1b744d3d774e5a879bb76d6cd1ecee2ba2c6960c03b1020cd35212f6aa267ac5" 227 | url: "https://pub.dev" 228 | source: hosted 229 | version: "2.3.0" 230 | path_provider_linux: 231 | dependency: transitive 232 | description: 233 | name: path_provider_linux 234 | sha256: ba2b77f0c52a33db09fc8caf85b12df691bf28d983e84cf87ff6d693cfa007b3 235 | url: "https://pub.dev" 236 | source: hosted 237 | version: "2.2.0" 238 | path_provider_platform_interface: 239 | dependency: transitive 240 | description: 241 | name: path_provider_platform_interface 242 | sha256: bced5679c7df11190e1ddc35f3222c858f328fff85c3942e46e7f5589bf9eb84 243 | url: "https://pub.dev" 244 | source: hosted 245 | version: "2.1.0" 246 | path_provider_windows: 247 | dependency: transitive 248 | description: 249 | name: path_provider_windows 250 | sha256: ee0e0d164516b90ae1f970bdf29f726f1aa730d7cfc449ecc74c495378b705da 251 | url: "https://pub.dev" 252 | source: hosted 253 | version: "2.2.0" 254 | platform: 255 | dependency: transitive 256 | description: 257 | name: platform 258 | sha256: "57c07bf82207aee366dfaa3867b3164e4f03a238a461a11b0e8a3a510d51203d" 259 | url: "https://pub.dev" 260 | source: hosted 261 | version: "3.1.1" 262 | plugin_platform_interface: 263 | dependency: transitive 264 | description: 265 | name: plugin_platform_interface 266 | sha256: "43798d895c929056255600343db8f049921cbec94d31ec87f1dc5c16c01935dd" 267 | url: "https://pub.dev" 268 | source: hosted 269 | version: "2.1.5" 270 | sky_engine: 271 | dependency: transitive 272 | description: flutter 273 | source: sdk 274 | version: "0.0.99" 275 | source_span: 276 | dependency: transitive 277 | description: 278 | name: source_span 279 | sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" 280 | url: "https://pub.dev" 281 | source: hosted 282 | version: "1.10.0" 283 | stack_trace: 284 | dependency: transitive 285 | description: 286 | name: stack_trace 287 | sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 288 | url: "https://pub.dev" 289 | source: hosted 290 | version: "1.11.0" 291 | stream_channel: 292 | dependency: transitive 293 | description: 294 | name: stream_channel 295 | sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" 296 | url: "https://pub.dev" 297 | source: hosted 298 | version: "2.1.1" 299 | string_scanner: 300 | dependency: transitive 301 | description: 302 | name: string_scanner 303 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 304 | url: "https://pub.dev" 305 | source: hosted 306 | version: "1.2.0" 307 | term_glyph: 308 | dependency: transitive 309 | description: 310 | name: term_glyph 311 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 312 | url: "https://pub.dev" 313 | source: hosted 314 | version: "1.2.1" 315 | test_api: 316 | dependency: transitive 317 | description: 318 | name: test_api 319 | sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" 320 | url: "https://pub.dev" 321 | source: hosted 322 | version: "0.6.0" 323 | typed_data: 324 | dependency: transitive 325 | description: 326 | name: typed_data 327 | sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c 328 | url: "https://pub.dev" 329 | source: hosted 330 | version: "1.3.2" 331 | vector_math: 332 | dependency: transitive 333 | description: 334 | name: vector_math 335 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 336 | url: "https://pub.dev" 337 | source: hosted 338 | version: "2.1.4" 339 | web: 340 | dependency: transitive 341 | description: 342 | name: web 343 | sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 344 | url: "https://pub.dev" 345 | source: hosted 346 | version: "0.1.4-beta" 347 | win32: 348 | dependency: transitive 349 | description: 350 | name: win32 351 | sha256: f2add6fa510d3ae152903412227bda57d0d5a8da61d2c39c1fb022c9429a41c0 352 | url: "https://pub.dev" 353 | source: hosted 354 | version: "5.0.6" 355 | xdg_directories: 356 | dependency: transitive 357 | description: 358 | name: xdg_directories 359 | sha256: f0c26453a2d47aa4c2570c6a033246a3fc62da2fe23c7ffdd0a7495086dc0247 360 | url: "https://pub.dev" 361 | source: hosted 362 | version: "1.0.2" 363 | sdks: 364 | dart: ">=3.1.0 <4.0.0" 365 | flutter: ">=3.10.0" 366 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutter_web_dashboard 2 | description: A new Flutter project. 3 | # The following line prevents the package from being accidentally published to 4 | # pub.dev using `flutter pub publish`. This is preferred for private packages. 5 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 6 | 7 | # The following defines the version and build number for your application. 8 | # A version number is three numbers separated by dots, like 1.2.43 9 | # followed by an optional build number separated by a +. 10 | # Both the version and the builder number may be overridden in flutter 11 | # build by specifying --build-name and --build-number, respectively. 12 | # In Android, build-name is used as versionName while build-number used as versionCode. 13 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 14 | # In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. 15 | # Read more about iOS versioning at 16 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 17 | # In Windows, build-name is used as the major, minor, and patch parts 18 | # of the product and file versions while build-number is used as the build suffix. 19 | version: 1.0.0+1 20 | 21 | environment: 22 | sdk: '>=3.1.0 <4.0.0' 23 | 24 | # Dependencies specify other packages that your package needs in order to work. 25 | # To automatically upgrade your package dependencies to the latest versions 26 | # consider running `flutter pub upgrade --major-versions`. Alternatively, 27 | # dependencies can be manually updated by changing the version numbers below to 28 | # the latest version available on pub.dev. To see which dependencies have newer 29 | # versions available, run `flutter pub outdated`. 30 | dependencies: 31 | flutter: 32 | sdk: flutter 33 | google_fonts: ^5.1.0 34 | charts_flutter_new: ^0.12.0 35 | get: ^4.6.5 36 | data_table_2: ^2.5.6 37 | 38 | 39 | # The following adds the Cupertino Icons font to your application. 40 | # Use with the CupertinoIcons class for iOS style icons. 41 | cupertino_icons: ^1.0.2 42 | 43 | dev_dependencies: 44 | flutter_test: 45 | sdk: flutter 46 | 47 | # The "flutter_lints" package below contains a set of recommended lints to 48 | # encourage good coding practices. The lint set provided by the package is 49 | # activated in the `analysis_options.yaml` file located at the root of your 50 | # package. See that file for information about deactivating specific lint 51 | # rules and activating additional ones. 52 | flutter_lints: ^2.0.0 53 | 54 | # For information on the generic Dart part of this file, see the 55 | # following page: https://dart.dev/tools/pub/pubspec 56 | 57 | # The following section is specific to Flutter packages. 58 | flutter: 59 | 60 | # The following line ensures that the Material Icons font is 61 | # included with your application, so that you can use the icons in 62 | # the material Icons class. 63 | uses-material-design: true 64 | 65 | # To add assets to your application, add an assets section, like this: 66 | assets: 67 | - assets/icons/ 68 | - assets/images/ 69 | 70 | # An image asset can refer to one or more resolution-specific "variants", see 71 | # https://flutter.dev/assets-and-images/#resolution-aware 72 | 73 | # For details regarding adding assets from package dependencies, see 74 | # https://flutter.dev/assets-and-images/#from-packages 75 | 76 | # To add custom fonts to your application, add a fonts section here, 77 | # in this "flutter" section. Each entry in this list should have a 78 | # "family" key with the font family name, and a "fonts" key with a 79 | # list giving the asset and other descriptors for the font. For 80 | # example: 81 | # fonts: 82 | # - family: Schyler 83 | # fonts: 84 | # - asset: fonts/Schyler-Regular.ttf 85 | # - asset: fonts/Schyler-Italic.ttf 86 | # style: italic 87 | # - family: Trajan Pro 88 | # fonts: 89 | # - asset: fonts/TrajanPro.ttf 90 | # - asset: fonts/TrajanPro_Bold.ttf 91 | # weight: 700 92 | # 93 | # For details regarding fonts from package dependencies, 94 | # see https://flutter.dev/custom-fonts/#from-packages 95 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santos-Enoque/flutter-web-dashboard-template/32c3f21191212e6c164575898ba7ec88176d1365/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santos-Enoque/flutter-web-dashboard-template/32c3f21191212e6c164575898ba7ec88176d1365/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santos-Enoque/flutter-web-dashboard-template/32c3f21191212e6c164575898ba7ec88176d1365/web/icons/Icon-512.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santos-Enoque/flutter-web-dashboard-template/32c3f21191212e6c164575898ba7ec88176d1365/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Santos-Enoque/flutter-web-dashboard-template/32c3f21191212e6c164575898ba7ec88176d1365/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | flutter_web_dashboard 33 | 34 | 35 | 39 | 40 | 41 | 42 | 43 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flutter_web_dashboard", 3 | "short_name": "flutter_web_dashboard", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | --------------------------------------------------------------------------------