navpages 1.3.0
navpages: ^1.3.0 copied to clipboard
A flexible Flutter package for creating responsive navigation pages with integrated navigation rails and sidebars.
example/main.dart
import 'package:flutter/material.dart';
import 'package:navpages/navpages.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'NavPages Example',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: NavPages(
expandable: true,
expanded: true,
buttons: [
NavRailButton(label: 'Dashboard', icon: Icons.dashboard),
NavRailButton(label: 'Analytics', icon: Icons.analytics),
NavRailButton(label: 'Reports', icon: Icons.assessment),
NavRailButton(label: 'Settings', icon: Icons.settings),
],
actions: [
NavRailButton(label: 'Help', icon: Icons.help),
NavRailButton(label: 'Profile', icon: Icons.person),
],
children: [
NavPage(
navbar: Navbar(
title: 'Dashboard',
actions: [
IconButton(
icon: const Icon(Icons.notifications),
onPressed: () {},
),
IconButton(icon: const Icon(Icons.search), onPressed: () {}),
],
),
child: const DashboardPage(),
),
NavPage(
navbar: Navbar(title: 'Analytics'),
child: const AnalyticsPage(),
),
NavPage(
navbar: Navbar(title: 'Reports'),
child: const ReportsPage(),
),
NavPage(
navbar: Navbar(title: 'Settings'),
child: const SettingsPage(),
),
],
),
);
}
}
class DashboardPage extends StatelessWidget {
const DashboardPage({super.key});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'Welcome to Dashboard',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
const SizedBox(height: 16),
Expanded(
child: GridView.count(
crossAxisCount: 2,
crossAxisSpacing: 16,
mainAxisSpacing: 16,
children: [
_buildCard('Total Users', '1,234', Icons.people, Colors.blue),
_buildCard(
'Revenue',
'\$12,345',
Icons.attach_money,
Colors.green,
),
_buildCard('Orders', '567', Icons.shopping_cart, Colors.orange),
_buildCard('Products', '89', Icons.inventory, Colors.purple),
],
),
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () {
NavPages.push(context, const DetailPage());
},
child: const Text('View Details'),
),
],
),
);
}
Widget _buildCard(String title, String value, IconData icon, Color color) {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(icon, size: 48, color: color),
const SizedBox(height: 8),
Text(
value,
style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
Text(title),
],
),
),
);
}
}
class AnalyticsPage extends StatelessWidget {
const AnalyticsPage({super.key});
@override
Widget build(BuildContext context) {
return const Padding(
padding: EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Analytics',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
SizedBox(height: 16),
Expanded(
child: Center(
child: Text(
'Analytics data would be displayed here.\n\nThis could include charts, graphs, and other data visualizations.',
textAlign: TextAlign.center,
style: TextStyle(fontSize: 16),
),
),
),
],
),
);
}
}
class ReportsPage extends StatelessWidget {
const ReportsPage({super.key});
@override
Widget build(BuildContext context) {
return const Padding(
padding: EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Reports',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
SizedBox(height: 16),
Expanded(
child: Center(
child: Text(
'Reports and documents would be displayed here.\n\nThis could include PDF viewers, data tables, and export options.',
textAlign: TextAlign.center,
style: TextStyle(fontSize: 16),
),
),
),
],
),
);
}
}
class SettingsPage extends StatelessWidget {
const SettingsPage({super.key});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'Settings',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
const SizedBox(height: 16),
Expanded(
child: ListView(
children: [
ListTile(
leading: const Icon(Icons.person),
title: const Text('Profile'),
subtitle: const Text('Manage your profile information'),
trailing: const Icon(Icons.arrow_forward_ios),
onTap: () {},
),
ListTile(
leading: const Icon(Icons.notifications),
title: const Text('Notifications'),
subtitle: const Text('Configure notification settings'),
trailing: const Icon(Icons.arrow_forward_ios),
onTap: () {},
),
ListTile(
leading: const Icon(Icons.security),
title: const Text('Privacy'),
subtitle: const Text('Manage privacy and security settings'),
trailing: const Icon(Icons.arrow_forward_ios),
onTap: () {},
),
ListTile(
leading: const Icon(Icons.language),
title: const Text('Language'),
subtitle: const Text('Change app language'),
trailing: const Icon(Icons.arrow_forward_ios),
onTap: () {},
),
const Divider(),
ListTile(
leading: const Icon(Icons.logout, color: Colors.red),
title: const Text(
'Logout',
style: TextStyle(color: Colors.red),
),
onTap: () {},
),
],
),
),
],
),
);
}
}
class DetailPage extends StatelessWidget {
const DetailPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: NavPages(
buttons: [
NavRailButton(
label: 'Overview',
icon: Icons.view_comfortable_rounded,
),
NavRailButton(label: 'Details', icon: Icons.info),
],
children: [
NavPage(
navbar: Navbar(title: 'Detail Overview'),
child: const Padding(
padding: EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Detail Overview',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
SizedBox(height: 16),
Text(
'This is a detail page that was pushed onto the navigation stack.',
style: TextStyle(fontSize: 16),
),
SizedBox(height: 16),
Text(
'You can use the back button in the navbar to return to the previous page, or use NavPages.pop(context) programmatically.',
style: TextStyle(fontSize: 16),
),
],
),
),
),
NavPage(
navbar: Navbar(title: 'Detail Information'),
child: const Padding(
padding: EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Detail Information',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
SizedBox(height: 16),
Text(
'This is another page in the detail section.',
style: TextStyle(fontSize: 16),
),
],
),
),
),
],
),
);
}
}