///////////////flutter template 1
////////////////////////////////////
///////////////pubspec.yaml////////////////
name: template1
description: A new Flutter project.
version: 1.0.0+1
environment:
sdk: ">=2.2.2 <3.0.0"
dependencies:
flutter:
sdk: flutter
provider: ^4.0.5
shared_preferences: ^0.5.6+3
page_transition: ^1.1.5
flutter_icons: ^1.0.0+1
cupertino_icons: ^0.1.2
dev_dependencies:
flutter_test:
sdk: flutter
flutter:
uses-material-design: true
///////////////main.dart////////////////////////////
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'providers/app_provider.dart';
import 'screen/splash.dart';
import 'util/global.dart';
void main(){
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => AppProvider()),
],
child: MyApp(),
),);}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer(
builder: (BuildContext context, AppProvider appProvider, Widget child) {
return MaterialApp(
key: appProvider.key,
debugShowCheckedModeBanner: false,
navigatorKey: appProvider.navigatorKey,
title: G.appName,
theme: appProvider.theme,
home: Splash(),
);});}}
///////////////////////////////global.dart//////////////////////////
import 'package:flutter/material.dart';
class G{
static String appName = 'Template 1';
//Colors for theme
static Color lightPrimary = Colors.white;
static Color darkPrimary = Colors.black;
static Color lightAccent = Color(0xff06d6a7);
static Color darkAccent = Color(0xff06d6a7);
static Color lightBG = Colors.white;
static Color darkBG = Colors.black;
static double width;
static double height;
static ThemeData lightTheme = ThemeData(
fontFamily: "TimesNewRoman",
backgroundColor: lightBG,
primaryColor: lightPrimary,
accentColor: lightAccent,
cursorColor: lightAccent,
scaffoldBackgroundColor: lightBG,
appBarTheme: AppBarTheme(
elevation: 0,
textTheme: TextTheme(
title: TextStyle(
fontFamily: "TimesNewRoman",
color: Colors.black,
fontSize: 20,
fontWeight: FontWeight.w800,
),
),
),
);
static ThemeData darkTheme = ThemeData(
fontFamily: "TimesNewRoman",
brightness: Brightness.dark,
backgroundColor: darkBG,
primaryColor: darkPrimary,
accentColor: darkAccent,
scaffoldBackgroundColor: darkBG,
cursorColor: darkAccent,
appBarTheme: AppBarTheme(
elevation: 0,
textTheme: TextTheme(
title: TextStyle(
fontFamily: "TimesNewRoman",
color: lightBG,
fontSize: 20,
fontWeight: FontWeight.w800,
),),),);
static List map(List list, Function handler) {
List result = [];
for (var i = 0; i < list.length; i++) {
result.add(handler(i, list[i]));
}
return result;
} }
/////////////////////////app_provider.dart//////////////////////
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../util/global.dart';
class AppProvider extends ChangeNotifier{
AppProvider(){
checkTheme();
}
ThemeData theme = G.lightTheme;
Key key = UniqueKey();
GlobalKey navigatorKey = GlobalKey();
void setKey(value) {
key = value;
notifyListeners();
}
void setNavigatorKey(value) {
navigatorKey = value;
notifyListeners();
}
void setTheme(value, c) {
theme = value;
SharedPreferences.getInstance().then((prefs){
prefs.setString("theme", c).then((val){
SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values);
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
statusBarColor: c == "dark" ? G.darkPrimary : G.lightPrimary,
statusBarIconBrightness: c == "dark" ? Brightness.light:Brightness.dark,
));});});
notifyListeners();}
ThemeData getTheme(value) {
return theme;
}
Future checkTheme() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
ThemeData t;
String r = prefs.getString("theme") == null ? "light" : prefs.getString(
"theme");
if(r == "light"){
t = G.lightTheme;
setTheme(G.lightTheme, "light");
}else{
t = G.darkTheme;
setTheme(G.darkTheme, "dark");
}
return t;
}}
//////////////////////////////////bottom_nav_bar.dart/////////////////////////
import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart';
BottomNavigationBar bottomNavBar(BuildContext context, Function navigationTapped, int _page) {
return BottomNavigationBar(
backgroundColor: Theme.of(context).primaryColor,
selectedItemColor: Theme.of(context).accentColor,
unselectedItemColor: Colors.grey[500],
elevation: 20,
type: BottomNavigationBarType.fixed,
items: [
BottomNavigationBarItem(
icon: Icon(
Feather.home,
),
title: SizedBox(),
),
BottomNavigationBarItem(
icon: Icon(
Feather.compass,
),
title: SizedBox(),
),
BottomNavigationBarItem(
icon: Icon(
Feather.settings,
),
title: SizedBox(),
),
],
onTap: navigationTapped,
currentIndex: _page,
);
}
///////////////////////////////////////splash.dart////////////////////////////
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:page_transition/page_transition.dart';
import './main_screen.dart';
import '../util/global.dart';
class Splash extends StatefulWidget {
@override
_SplashState createState() => _SplashState();
}
class _SplashState extends State {
startTimeout() {
return new Timer(Duration(seconds: 2), handleTimeout);
}
void handleTimeout() {
changeScreen();
}
changeScreen() async {
Navigator.pushReplacement(
context,
PageTransition(
type: PageTransitionType.rightToLeft,
child: MainScreen(),
),);}
@override
void initState() {
super.initState();
startTimeout();
}
@override
Widget build(BuildContext context) {
G.height = MediaQuery.of(context).size.height;
G.width = MediaQuery.of(context).size.width;
return Scaffold(
body: Center(
child: Column(
// mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
//Icon(
// Feather.book_open,
// color: Theme.of(context).accentColor,
// size: 70,
//),
SizedBox(height: 20,),
Text(
"${G.appName}",
style: TextStyle(
color: Theme.of(context).accentColor,
fontSize: 25,
fontWeight: FontWeight.bold,
),),],),),);}}
//////////////////////////////////main_screen.dart//////////////////
import 'package:flutter/material.dart';
import '../widgets/bottom_nav_bar.dart';
import './home.dart';
import './settings.dart';
import './dummy.dart';
class MainScreen extends StatefulWidget{
@override
_MainScreenState createState() => _MainScreenState();
}
class _MainScreenState extends State{
PageController _pageController;
int _page = 0;
@override
void initState(){
super.initState();
_pageController = PageController(initialPage: 0);
}
@override
void dispose(){
super.dispose();
_pageController.dispose();
}
void onPageChanged(int page){
setState((){ this._page = page;});
}
void navigationTapped(int page){
_pageController.jumpToPage(page);
}
@override
Widget build(BuildContext context) {
// return WillPopScope(
// onWillPop:() => ExitDialog(context),
return Scaffold(
body: PageView(
physics: NeverScrollableScrollPhysics(),
controller: _pageController,
onPageChanged: onPageChanged,
children: [
Home(),
Dummy(),
Setting(),
],
),
bottomNavigationBar: bottomNavBar(context, navigationTapped, _page),
// ),
);}}
////////////////////////////////////home.dart////////////////////////////
import 'package:flutter/material.dart';
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(child:Text('home page',style:TextStyle(fontSize: 40))),
);
}
}
/////////////////////////////////settings.dart/////////////////////////
import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:page_transition/page_transition.dart';
import 'package:provider/provider.dart';
import '../providers/app_provider.dart';
import '../util/global.dart';
import './downloads.dart';
import './favorites.dart';
class Setting extends StatefulWidget {
@override
_SettingState createState() => _SettingState();
}
class _SettingState extends State {
List items = [
{
"icon": Feather.heart,
"title": "Favorites",
"page": Favorites(),
},
{
"icon": Feather.download,
"title": "Downloads",
"page": Downloads(),
},
{
"icon": Feather.moon,
"title": "Dark Mode"
},
// {
// "icon": Feather.info,
// "title": "About",
// "page": Container(),
// },
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text(
"Settings",
),),
body: ListView.separated(
padding: EdgeInsets.symmetric(horizontal: 10),
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: items.length,
itemBuilder: (BuildContext context, int index) {
if(items[index]['title'] =="Dark Mode"){
return SwitchListTile(
secondary: Icon(
items[index]['icon'],
),
title: Text(
items[index]['title'],
),
value: Provider.of(context).theme == G.lightTheme
? false
: true,
onChanged: (v){
if (v) {
Provider.of(context, listen: false)
.setTheme(G.darkTheme, "dark");
} else {
Provider.of(context, listen: false)
.setTheme(G.lightTheme, "light");
}},);}
return ListTile(
onTap: (){
if(items[index]['title'] == "About"){
}else{
// Provider.of(context, listen: false)
// .getFeed();
Navigator.push(
context,
PageTransition(
type: PageTransitionType.rightToLeft,
child: items[index]['page'],
),);}},
leading: Icon(
items[index]['icon'],
),
title: Text(
items[index]['title'],
),);},
separatorBuilder: (BuildContext context, int index) {
return Divider();
},),);}}