Skip to content

Commit

Permalink
Create dark mode support
Browse files Browse the repository at this point in the history
  • Loading branch information
CoderJava committed May 30, 2020
1 parent c614091 commit 4dada26
Show file tree
Hide file tree
Showing 9 changed files with 232 additions and 96 deletions.
19 changes: 15 additions & 4 deletions lib/app.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
import 'package:flutter/material.dart';
import 'package:flutter_news_app/feature/presentation/page/home/home_page.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';

class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'News App',
home: HomePage(),
return ValueListenableBuilder(
valueListenable: Hive.box('settings').listenable(),
builder: (context, box, widget) {
var isDarkMode = box.get('darkMode') ?? false;
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'News App',
theme: ThemeData(
brightness: isDarkMode ? Brightness.dark : Brightness.light,
),
home: HomePage(),
);
},
);
}
}
147 changes: 89 additions & 58 deletions lib/feature/presentation/page/home/home_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@ import 'package:flutter_news_app/feature/data/model/categorynews/category_news_m
import 'package:flutter_news_app/feature/data/model/topheadlinesnews/top_headlines_news_response_model.dart';
import 'package:flutter_news_app/feature/presentation/bloc/topheadlinesnews/bloc.dart';
import 'package:flutter_news_app/feature/presentation/page/search/search_page.dart';
import 'package:flutter_news_app/feature/presentation/page/settings/settings_page.dart';
import 'package:flutter_news_app/feature/presentation/widget/widget_failure_message.dart';
import 'package:flutter_news_app/feature/presentation/widget/widget_item_news.dart';
import 'package:flutter_news_app/injection_container.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:intl/intl.dart';
import 'package:url_launcher/url_launcher.dart';

Expand Down Expand Up @@ -76,62 +79,87 @@ class _HomePageState extends State<HomePage> {
}
}
},
child: Stack(
children: [
Container(
width: double.infinity,
height: double.infinity,
color: Color(0xFFEFF5F5),
),
SafeArea(
child: Container(
width: double.infinity,
color: Color(0xFFEFF5F5),
padding: EdgeInsets.symmetric(
vertical: 24.h,
child: ValueListenableBuilder(
valueListenable: Hive.box('settings').listenable(),
builder: (context, box, widget) {
var isDarkMode = box.get('darkMode') ?? false;
return Stack(
children: [
Container(
width: double.infinity,
height: double.infinity,
color: isDarkMode ? null : Color(0xFFEFF5F5),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(horizontal: 48.w),
child: Row(
children: <Widget>[
Expanded(
child: Text(
'Daily News',
style: TextStyle(
fontSize: 48.sp,
SafeArea(
child: Container(
width: double.infinity,
color: isDarkMode ? null : Color(0xFFEFF5F5),
padding: EdgeInsets.symmetric(
vertical: 24.h,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(horizontal: 48.w),
child: Row(
children: <Widget>[
Expanded(
child: Text(
'Daily News',
style: TextStyle(
fontSize: 48.sp,
),
),
),
),
),
GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SearchPage()),
);
},
child: Hero(
tag: 'iconSearch',
child: Icon(Icons.search),
),
GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SearchPage()),
);
},
child: Hero(
tag: 'iconSearch',
child: Icon(
Icons.search,
size: 64.w,
),
),
),
SizedBox(width: 48.w),
GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SettingsPage(),
),
);
},
child: Icon(
Icons.settings,
size: 64.w,
),
),
],
),
],
),
),
WidgetDateToday(),
SizedBox(height: 24.h),
WidgetCategoryNews(listCategories: listCategories),
SizedBox(height: 24.h),
Expanded(
child: Platform.isIOS ? _buildWidgetContentNewsIOS() : _buildWidgetContentNewsAndroid(),
),
WidgetDateToday(),
SizedBox(height: 24.h),
WidgetCategoryNews(
listCategories: listCategories, indexDefaultSelected: indexCategorySelected),
SizedBox(height: 24.h),
Expanded(
child: Platform.isIOS ? _buildWidgetContentNewsIOS() : _buildWidgetContentNewsAndroid(),
),
],
),
],
),
),
),
),
],
],
);
},
),
),
),
Expand Down Expand Up @@ -404,8 +432,12 @@ class _HomePageState extends State<HomePage> {

class WidgetCategoryNews extends StatefulWidget {
final List<CategoryNewsModel> listCategories;
final int indexDefaultSelected;

WidgetCategoryNews({@required this.listCategories});
WidgetCategoryNews({
@required this.listCategories,
@required this.indexDefaultSelected,
});

@override
_WidgetCategoryNewsState createState() => _WidgetCategoryNewsState();
Expand All @@ -416,7 +448,7 @@ class _WidgetCategoryNewsState extends State<WidgetCategoryNews> {

@override
void initState() {
indexCategorySelected = 0;
indexCategorySelected = widget.indexDefaultSelected;
super.initState();
}

Expand All @@ -439,12 +471,11 @@ class _WidgetCategoryNewsState extends State<WidgetCategoryNews> {
if (indexCategorySelected == index) {
return;
}
setState(() {
indexCategorySelected = index;
});
setState(() => indexCategorySelected = index);
var topHeadlinesNewsBloc = BlocProvider.of<TopHeadlinesNewsBloc>(context);
topHeadlinesNewsBloc
.add(ChangeCategoryTopHeadlinesNewsEvent(indexCategorySelected: indexCategorySelected));
topHeadlinesNewsBloc.add(
ChangeCategoryTopHeadlinesNewsEvent(indexCategorySelected: index),
);
},
child: Container(
child: AnimatedContainer(
Expand Down
6 changes: 4 additions & 2 deletions lib/feature/presentation/page/search/search_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ class _SearchPageState extends State<SearchPage> {
@override
Widget build(BuildContext context) {
ScreenUtil.init(context);
var theme = Theme.of(context);
var isDarkTheme = theme.brightness == Brightness.dark;
return Scaffold(
body: BlocProvider<TopHeadlinesNewsBloc>(
create: (context) => topHeadlinesNewsBloc,
Expand All @@ -50,11 +52,11 @@ class _SearchPageState extends State<SearchPage> {
Container(
width: double.infinity,
height: double.infinity,
color: Color(0xFFEFF5F5),
color: isDarkTheme ? null : Color(0xFFEFF5F5),
),
SafeArea(
child: Container(
color: Color(0xFFEFF5F5),
color: isDarkTheme ? null : Color(0xFFEFF5F5),
width: double.infinity,
padding: EdgeInsets.symmetric(
vertical: 24.h,
Expand Down
96 changes: 96 additions & 0 deletions lib/feature/presentation/page/settings/settings_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';

class SettingsPage extends StatefulWidget {
@override
_SettingsPageState createState() => _SettingsPageState();
}

class _SettingsPageState extends State<SettingsPage> {
@override
Widget build(BuildContext context) {
ScreenUtil.init(context);
return Scaffold(
appBar: WidgetAppBar(),
body: Container(
width: double.infinity,
padding: EdgeInsets.all(48.w),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'Interface',
style: TextStyle(
fontSize: 48.sp,
fontWeight: FontWeight.bold,
),
),
Row(
children: <Widget>[
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'Use dark mode',
style: TextStyle(
fontSize: 42.sp,
),
),
Text(
'Get that whiteness out',
style: TextStyle(
fontSize: 36.sp,
color: Colors.grey,
),
),
],
),
),
ValueListenableBuilder(
valueListenable: Hive.box('settings').listenable(),
builder: (context, box, widget) {
var isDarkMode = box.get('darkMode') ?? false;
return Switch(
value: isDarkMode,
onChanged: (value) async {
isDarkMode = value;
await box.put('darkMode', isDarkMode);
},
);
},
),
],
),
],
),
),
);
}
}

class WidgetAppBar extends PreferredSize {
@override
Widget build(BuildContext context) {
return ValueListenableBuilder(
valueListenable: Hive.box('settings').listenable(),
builder: (context, box, widget) {
var isDarkMode = box.get('darkMode') ?? false;
return isDarkMode
? AppBar(
title: Text('Settings'),
)
: AppBar(
title: Text('Settings'),
);
},
);
}

@override
Size get preferredSize {
return Size.fromHeight(kToolbarHeight);
}
}
3 changes: 1 addition & 2 deletions lib/injection_container.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,9 @@ import 'package:flutter_news_app/feature/data/repository/news/news_repository_im
import 'package:flutter_news_app/feature/domain/repository/news/news_repository.dart';
import 'package:flutter_news_app/feature/domain/usecase/gettopheadlinesnews/get_top_headlines_news.dart';
import 'package:flutter_news_app/feature/domain/usecase/searchtopheadlinesnews/search_top_headlines_news.dart';
import 'package:flutter_news_app/feature/presentation/bloc/topheadlinesnews/bloc.dart';
import 'package:get_it/get_it.dart';

import 'feature/presentation/bloc/topheadlinesnews/bloc.dart';

final sl = GetIt.instance;

Future<void> init() async {
Expand Down
4 changes: 4 additions & 0 deletions lib/main_development.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@ import 'package:flutter_news_app/app.dart';
import 'package:flutter_news_app/config/base_url_config.dart';
import 'package:flutter_news_app/config/flavor_config.dart';
import 'package:flutter_news_app/injection_container.dart' as di;
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';

void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
await Hive.openBox('settings');
FlavorConfig(
flavor: Flavor.DEVELOPMENT,
values: FlavorValues(baseUrl: BaseUrlConfig().baseUrlDevelopment),
Expand Down
4 changes: 4 additions & 0 deletions lib/main_production.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@ import 'package:flutter_news_app/app.dart';
import 'package:flutter_news_app/config/base_url_config.dart';
import 'package:flutter_news_app/config/flavor_config.dart';
import 'package:flutter_news_app/injection_container.dart' as di;
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';

void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
await Hive.openBox('settings');
FlavorConfig(
flavor: Flavor.PRODUCTION,
values: FlavorValues(baseUrl: BaseUrlConfig().baseUrlProduction),
Expand Down
Loading

0 comments on commit 4dada26

Please sign in to comment.