flutter_slider_drawer 2.1.3 flutter_slider_drawer: ^2.1.3 copied to clipboard
A Flutter package with custom implementation of the Slider Drawer Menu
import 'package:flutter/material.dart';
import 'package:flutter_slider_drawer/flutter_slider_drawer.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
MyAppState createState() => MyAppState();
}
class MyAppState extends State<MyApp> {
final GlobalKey<SliderDrawerState> _sliderDrawerKey =
GlobalKey<SliderDrawerState>();
late String title;
@override
void initState() {
title = "Home";
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(fontFamily: 'BalsamiqSans'),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: SliderDrawer(
appBar: SliderAppBar(
appBarColor: Colors.white,
title: Text(title,
style: const TextStyle(
fontSize: 22, fontWeight: FontWeight.w700))),
key: _sliderDrawerKey,
sliderOpenSize: 179,
slider: _SliderView(
onItemClick: (title) {
_sliderDrawerKey.currentState!.closeSlider();
setState(() {
this.title = title;
});
},
),
child: _AuthorList()),
),
);
}
}
class _SliderView extends StatelessWidget {
final Function(String)? onItemClick;
const _SliderView({Key? key, this.onItemClick}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
padding: const EdgeInsets.only(top: 30),
child: ListView(
children: <Widget>[
const SizedBox(
height: 30,
),
CircleAvatar(
radius: 65,
backgroundColor: Colors.grey,
child: CircleAvatar(
radius: 60,
backgroundImage: Image.network(
'https://nikhilvadoliya.github.io/assets/images/nikhil_1.webp')
.image,
),
),
const SizedBox(
height: 20,
),
const Text(
'Nick',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 30,
),
),
const SizedBox(
height: 20,
),
...[
Menu(Icons.home, 'Home'),
Menu(Icons.add_circle, 'Add Post'),
Menu(Icons.notifications_active, 'Notification'),
Menu(Icons.favorite, 'Likes'),
Menu(Icons.settings, 'Setting'),
Menu(Icons.arrow_back_ios, 'LogOut')
]
.map((menu) => _SliderMenuItem(
title: menu.title,
iconData: menu.iconData,
onTap: onItemClick))
.toList(),
],
),
);
}
}
class _SliderMenuItem extends StatelessWidget {
final String title;
final IconData iconData;
final Function(String)? onTap;
const _SliderMenuItem(
{Key? key,
required this.title,
required this.iconData,
required this.onTap})
: super(key: key);
@override
Widget build(BuildContext context) {
return ListTile(
title: Text(title,
style: const TextStyle(
color: Colors.black, fontFamily: 'BalsamiqSans_Regular')),
leading: Icon(iconData, color: Colors.black),
onTap: () => onTap?.call(title));
}
}
class _AuthorList extends StatelessWidget {
@override
Widget build(BuildContext context) {
List<Quotes> quotesList = [];
quotesList.add(Quotes(Colors.amber, 'Amelia Brown',
'Life would be a great deal easier if dead things had the decency to remain dead.'));
quotesList.add(Quotes(Colors.orange, 'Olivia Smith',
'That proves you are unusual," returned the Scarecrow'));
quotesList.add(Quotes(Colors.deepOrange, 'Sophia Jones',
'Her name badge read: Hello! My name is DIE, DEMIGOD SCUM!'));
quotesList.add(Quotes(Colors.red, 'Isabella Johnson',
'I am about as intimidating as a butterfly.'));
quotesList.add(Quotes(Colors.purple, 'Emily Taylor',
'Never ask an elf for help; they might decide your better off dead, eh?'));
quotesList
.add(Quotes(Colors.green, 'Maya Thomas', 'Act first, explain later'));
return Container(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: ListView.separated(
scrollDirection: Axis.vertical,
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10),
itemBuilder: (builder, index) {
return LimitedBox(
maxHeight: 150,
child: Container(
decoration: BoxDecoration(
color: quotesList[index].color,
borderRadius: const BorderRadius.all(
Radius.circular(10.0),
)),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(12),
child: Text(
quotesList[index].author,
style: const TextStyle(
fontFamily: 'BalsamiqSans_Blod',
fontSize: 30,
color: Colors.white),
),
),
Padding(
padding: const EdgeInsets.all(10),
child: Text(
quotesList[index].quote,
style: const TextStyle(
fontFamily: 'BalsamiqSans_Regular',
fontSize: 15,
color: Colors.white),
),
)
],
),
),
);
},
separatorBuilder: (builder, index) {
return const Divider(
height: 10,
thickness: 0,
);
},
itemCount: quotesList.length),
);
}
}
class Quotes {
final MaterialColor color;
final String author;
final String quote;
Quotes(this.color, this.author, this.quote);
}
class Menu {
final IconData iconData;
final String title;
Menu(this.iconData, this.title);
}