first setup and basic building blocks
This commit is contained in:
		
							
								
								
									
										20
									
								
								lib/main.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								lib/main.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:fast_network_navigation/modules/scaffold.dart'; | ||||
|  | ||||
| void main() => runApp(const App()); | ||||
|  | ||||
| class App extends StatelessWidget { | ||||
|   const App({super.key}); | ||||
|  | ||||
|   static const appTitle = 'City Nav'; | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return MaterialApp( | ||||
|       title: appTitle, | ||||
|       home: BasePage(title: appTitle), | ||||
|       theme: ThemeData(useMaterial3: true, colorSchemeSeed: Colors.green), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|  | ||||
							
								
								
									
										14
									
								
								lib/modules/navigation.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								lib/modules/navigation.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
|  | ||||
| Widget singleDestination(BuildContext context, String title, String description, String image) { | ||||
|   return Card( | ||||
|     child: ListTile( | ||||
|       leading: Icon(Icons.location_on), | ||||
|       title: Text(title), | ||||
|       subtitle: Text(description), | ||||
|       onTap: () { | ||||
|         Navigator.pushNamed(context, '/destination'); | ||||
|       }, | ||||
|     ), | ||||
|   ); | ||||
| } | ||||
							
								
								
									
										93
									
								
								lib/modules/overview.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								lib/modules/overview.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_map/flutter_map.dart'; | ||||
| import 'package:sliding_up_panel/sliding_up_panel.dart'; | ||||
| import 'package:fast_network_navigation/modules/navigation.dart'; | ||||
|  | ||||
| class MapPage extends StatefulWidget { | ||||
|   @override | ||||
|   _MapPageState createState() => _MapPageState(); | ||||
| } | ||||
|  | ||||
| class _MapPageState extends State<MapPage> { | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     final ThemeData theme = Theme.of(context); | ||||
|     return SlidingUpPanel( | ||||
|         renderPanelSheet: false, | ||||
|         panel: _floatingPanel(theme), | ||||
|         collapsed: _floatingCollapsed(theme), | ||||
|         body: FlutterMap( | ||||
|           options: MapOptions( | ||||
|             initialZoom: 11, | ||||
|           ), | ||||
|           children: [ | ||||
|             openStreetMapTileLayer, | ||||
|           ], | ||||
|         ), | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   Widget _floatingCollapsed(ThemeData theme){ | ||||
|     return Container( | ||||
|       decoration: BoxDecoration( | ||||
|         color: theme.canvasColor, | ||||
|         borderRadius: BorderRadius.only(topLeft: Radius.circular(24.0), topRight: Radius.circular(24.0)), | ||||
|       ), | ||||
|        | ||||
|       child: Greeting(theme) | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   Widget _floatingPanel(ThemeData theme){ | ||||
|     return Container( | ||||
|       decoration: BoxDecoration( | ||||
|         color: Colors.white, | ||||
|         borderRadius: BorderRadius.all(Radius.circular(24.0)), | ||||
|         boxShadow: [ | ||||
|           BoxShadow( | ||||
|             blurRadius: 20.0, | ||||
|             color: theme.shadowColor, | ||||
|           ), | ||||
|         ] | ||||
|       ), | ||||
|       child: Center( | ||||
|         child: Padding( | ||||
|         padding: EdgeInsets.all(8.0), | ||||
|         child: SingleChildScrollView( | ||||
|           child: Column( | ||||
|             children: <Widget>[ | ||||
|               Greeting(theme), | ||||
|               Text("Got a lot to do today! Here is a rundown:"), | ||||
|               singleDestination(context, "Location 1", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 2", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 3", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 4", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 5", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 6", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 7", "some description", "Further information"), | ||||
|               singleDestination(context, "Location 8", "some description", "Further information"), | ||||
|             ], | ||||
|           ), | ||||
|         ), | ||||
|       ), | ||||
|     ), | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   Widget Greeting (ThemeData theme) { | ||||
|     return Center( | ||||
|         child: Text( | ||||
|           "Explore Kview", | ||||
|           style: TextStyle(color: theme.primaryColor, fontSize: 24.0, fontWeight: FontWeight.bold), | ||||
|         ), | ||||
|       ); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TileLayer get openStreetMapTileLayer => TileLayer( | ||||
|   urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', | ||||
|   userAgentPackageName: 'flutter_map', | ||||
| ); | ||||
|  | ||||
| // Add a pin to the map | ||||
							
								
								
									
										55
									
								
								lib/modules/profile.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								lib/modules/profile.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
|  | ||||
|  | ||||
|  | ||||
| class ProfilePage extends StatefulWidget { | ||||
|   @override | ||||
|   _ProfilePageState createState() => _ProfilePageState(); | ||||
| } | ||||
|  | ||||
| class _ProfilePageState extends State<ProfilePage> { | ||||
|    | ||||
|   double value = 0.0; | ||||
|   void onChanged(double newValue) { | ||||
|     setState(() { | ||||
|       value = newValue; | ||||
|     }); | ||||
|   } | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       appBar: AppBar( | ||||
|         title: Text('Profile'), | ||||
|       ), | ||||
|       body: Padding( | ||||
|         padding: EdgeInsets.all(8.0), | ||||
|         child: Column( | ||||
|           children: <Widget>[ | ||||
|             Card( | ||||
|               child: ListTile( | ||||
|                 leading: Icon(Icons.notifications_sharp), | ||||
|                 title: Text('Notification 1'), | ||||
|                 subtitle: Text('This is a first notification'), | ||||
|               ), | ||||
|             ), | ||||
|             Card( | ||||
|               child: ListTile( | ||||
|                 leading: Icon(Icons.notifications_sharp), | ||||
|                 title: Text('Notification 2'), | ||||
|                 subtitle: Text('This is a notification'), | ||||
|               ), | ||||
|             ), | ||||
|             Card( | ||||
|               child: ListTile( | ||||
|                 leading: Icon(Icons.outdoor_grill), | ||||
|                 title: Text("Eating preference"), | ||||
|                 subtitle: Slider.adaptive(value: value, onChanged: onChanged, min: 0, max: 5, divisions: 5, label: value.toInt().toString(),) | ||||
|                  | ||||
|               ) | ||||
|             ) | ||||
|           ], | ||||
|         ), | ||||
|       ) | ||||
|     ); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										89
									
								
								lib/modules/scaffold.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								lib/modules/scaffold.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
|  | ||||
| import 'package:fast_network_navigation/modules/overview.dart'; | ||||
| import 'package:fast_network_navigation/modules/profile.dart'; | ||||
|  | ||||
|  | ||||
| class BasePage extends StatefulWidget { | ||||
|   const BasePage({super.key, required this.title}); | ||||
|  | ||||
|   final String title; | ||||
|  | ||||
|   @override | ||||
|   State<BasePage> createState() => _BasePageState(); | ||||
| } | ||||
|  | ||||
| class _BasePageState extends State<BasePage> { | ||||
|   int _selectedIndex = 0; | ||||
|    | ||||
|   void _onItemTapped(int index) { | ||||
|     setState(() { | ||||
|       _selectedIndex = index; | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   Widget currentView = MapPage(); | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     final ThemeData theme = Theme.of(context); | ||||
|      | ||||
|     return Scaffold( | ||||
|       appBar: AppBar(title: Text(widget.title)), | ||||
|       body: Center(child: currentView), | ||||
|       drawer: Drawer( | ||||
|         // Add a ListView to the drawer. This ensures the user can scroll | ||||
|         // through the options in the drawer if there isn't enough vertical | ||||
|         // space to fit everything. | ||||
|         child: ListView( | ||||
|           // Important: Remove any padding from the ListView. | ||||
|           padding: EdgeInsets.zero, | ||||
|           children: [ | ||||
|             DrawerHeader( | ||||
|               decoration: BoxDecoration( | ||||
|                 gradient: LinearGradient(colors: [Colors.cyan, theme.primaryColor]) | ||||
|               ), | ||||
|               child: const Text('The fanciest navigation!'), | ||||
|             ), | ||||
|             ListTile( | ||||
|               title: const Text('Home'), | ||||
|               selected: _selectedIndex == 0, | ||||
|               onTap: () { | ||||
|                 // Update the state of the app | ||||
|                 _onItemTapped(0); | ||||
|                 // Then close the drawer | ||||
|                 currentView = MapPage(); | ||||
|                 Navigator.pop(context); | ||||
|               }, | ||||
|             ), | ||||
|             ListTile( | ||||
|               title: const Text('Business'), | ||||
|               selected: _selectedIndex == 1, | ||||
|               onTap: () { | ||||
|                 // Update the state of the app | ||||
|                 _onItemTapped(1); | ||||
|                 currentView = const Text("ghfhggfhgf"); | ||||
|  | ||||
|                 // Then close the drawer | ||||
|                 Navigator.pop(context); | ||||
|               }, | ||||
|             ), | ||||
|             // add a whitespace so that the settings are at the bottom | ||||
|              | ||||
|             const Divider(), | ||||
|             ListTile( | ||||
|               title: const Text('Settings'), | ||||
|               leading: const Icon(Icons.settings), | ||||
|               selected: _selectedIndex == 2, | ||||
|               onTap: () { | ||||
|                 _onItemTapped(2); | ||||
|                 currentView = ProfilePage(); | ||||
|                 Navigator.pop(context); | ||||
|                 }, | ||||
|             ), | ||||
|             // settings in the bottom of the drawer | ||||
|           ], | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user