You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
6.5 KiB
Dart
221 lines
6.5 KiB
Dart
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);
|
|
}
|