///////////////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(); },),);}}