flutter_kanpur_ui_kit 0.0.10
flutter_kanpur_ui_kit: ^0.0.10 copied to clipboard
A reusable Flutter UI kit from the Flutter Kanpur community featuring customizable widgets.
import 'package:flutter/material.dart';
import 'package:flutter_kanpur_ui_kit/flutter_kanpur_ui_kit.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
// Initialize ScreenUtil for responsive design
return ScreenUtilInit(
designSize: const Size(360, 690),
minTextAdapt: true,
splitScreenMode: true,
builder: (_, child) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Kanpur UI Kit Example',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.redAccent),
useMaterial3: true,
),
home: child,
);
},
child: const MainNavigationPage(),
);
}
}
/// Main navigation page that manages bottom navigation state
/// and displays different pages based on selected index
class MainNavigationPage extends StatefulWidget {
const MainNavigationPage({super.key});
@override
State<MainNavigationPage> createState() => _MainNavigationPageState();
}
class _MainNavigationPageState extends State<MainNavigationPage> {
// Current selected index for bottom navigation
int _currentIndex = 0;
// List of pages corresponding to each navigation item
final List<Widget> _pages = [
const HomePage(),
const SearchPage(),
const CreatePage(),
const TrendingPage(),
const ProfilePage(),
];
@override
Widget build(BuildContext context) {
return Scaffold(
extendBody: true,
extendBodyBehindAppBar: true,
backgroundColor: Color(0XFF1E3A4D),
body: Container(
decoration: BoxDecoration(
gradient: RadialGradient(
radius: 0.8,
colors: [Color(0XFF1E3A4D), Color(0XFF010A10)],
),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'1. GlassBottomNavBar()',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
GlassBottomNavbar(
currentIndex: _currentIndex,
onTap: (index) {
setState(() {
_currentIndex = index;
});
},
),
Text(
'2. BottomNavBar()',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
BottomNavbar(
currentIndex: _currentIndex,
onTap: (index) {
setState(() {
_currentIndex = index;
});
},
),
Text(
'3. GradiantButton()',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 35.0,
vertical: 20,
),
child: GradientButton(
height: 65,
text: "Create Account", onTap: () {}),
),
],
),
),
appBar:
AppBar(
toolbarHeight: 100,
centerTitle: true,
title: Column(
mainAxisSize: MainAxisSize.min,
children: [
const Text(
'Flutter Kanpur Ui Kit',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
const SizedBox(height: 10),
const Text(
'An opensource contribution by\nFlutter Kanpur Community.',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.grey,
fontSize: 14,
fontStyle: FontStyle.italic,
),
),
],
),
backgroundColor: Colors.transparent,
elevation: 0,
)
);
}
}
/// Home Page - First tab
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.home,
size: 64,
color: Theme.of(context).colorScheme.primary,
),
const SizedBox(height: 20),
Text(
'Flutter Kanpur Ui Kit',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 20),
GradientButton(
text: 'Gradient Button',
onTap: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Home button tapped!')),
);
},
),
],
),
),
);
}
}
/// Search Page - Second tab
class SearchPage extends StatelessWidget {
const SearchPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Search'),
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.search,
size: 64,
color: Theme.of(context).colorScheme.primary,
),
const SizedBox(height: 20),
Text(
'Search Page',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 20),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 40),
child: TextField(
decoration: InputDecoration(
hintText: 'Search...',
prefixIcon: const Icon(Icons.search),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
),
),
),
),
],
),
),
);
}
}
/// Create Page - Third tab
class CreatePage extends StatelessWidget {
const CreatePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.add_circle_outline,
size: 64,
color: Theme.of(context).colorScheme.primary,
),
const SizedBox(height: 20),
Text(
'Create New Content',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 20),
GradientButton(
text: 'Create Post',
onTap: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Create functionality!')),
);
},
),
],
),
),
);
}
}
/// Trending Page - Fourth tab
class TrendingPage extends StatelessWidget {
const TrendingPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.trending_up,
size: 64,
color: Theme.of(context).colorScheme.primary,
),
const SizedBox(height: 20),
Text(
'Trending Now',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 20),
Text(
'Discover what\'s popular',
style: Theme.of(context).textTheme.bodyLarge,
),
],
),
),
);
}
}
/// Profile Page - Fifth tab
class ProfilePage extends StatelessWidget {
const ProfilePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CircleAvatar(
radius: 50,
backgroundColor: Theme.of(context).colorScheme.primary,
child: const Icon(Icons.person, size: 50, color: Colors.white),
),
const SizedBox(height: 20),
Text(
'Your Profile',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 20),
ListTile(
leading: const Icon(Icons.settings),
title: const Text('Settings'),
onTap: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Settings tapped!')),
);
},
),
ListTile(
leading: const Icon(Icons.logout),
title: const Text('Logout'),
onTap: () {
ScaffoldMessenger.of(
context,
).showSnackBar(const SnackBar(content: Text('Logout tapped!')));
},
),
],
),
),
);
}
}