Skip to content

Commit 9812a3e

Browse files
Home bloc for filter events and title
1 parent 025b060 commit 9812a3e

10 files changed

+188
-231
lines changed

lib/bloc/task_bloc.dart

+5
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ class TaskBloc implements BlocBase {
141141
}
142142
}
143143
}
144+
145+
void updateFilters(Filter filter) {
146+
_lastFilterStatus = filter;
147+
refresh();
148+
}
144149
}
145150

146151
enum FILTER_STATUS { BY_TODAY, BY_WEEK, BY_PROJECT, BY_LABEL, BY_STATUS }

lib/main.dart

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_app/bloc/bloc_provider.dart';
23
import 'package:flutter_app/pages/home/home.dart';
3-
import 'package:flutter_app/pages/tasks/add_task.dart';
4+
import 'package:flutter_app/pages/home/home_bloc.dart';
45

5-
void main() => runApp(new MyApp());
6+
void main() => runApp(MyApp());
67

78
class MyApp extends StatelessWidget {
89
@override
910
Widget build(BuildContext context) {
10-
return new MaterialApp(
11+
return MaterialApp(
1112
debugShowCheckedModeBanner: false,
12-
routes: <String, WidgetBuilder>{
13-
'/addTask': (BuildContext context) => new AddTaskScreen(),
14-
},
15-
theme: new ThemeData(
13+
theme: ThemeData(
1614
accentColor: Colors.orange, primaryColor: const Color(0xFFDE4435)),
17-
home: new HomeScreen());
15+
home: BlocProvider(
16+
bloc: HomeBloc(),
17+
child: HomePage(),
18+
));
1819
}
1920
}

lib/pages/home/home.dart

+12-34
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,26 @@ import 'package:flutter/material.dart';
22
import 'package:flutter_app/bloc/bloc_provider.dart';
33
import 'package:flutter_app/bloc/task_bloc.dart';
44
import 'package:flutter_app/db/task_db.dart';
5+
import 'package:flutter_app/pages/home/home_bloc.dart';
56
import 'package:flutter_app/pages/home/side_drawer.dart';
6-
import 'package:flutter_app/pages/home/title_bloc.dart';
77
import 'package:flutter_app/pages/tasks/add_task.dart';
88
import 'package:flutter_app/pages/tasks/task_complted.dart';
99
import 'package:flutter_app/pages/tasks/task_widgets.dart';
1010

11-
class HomeScreen extends StatelessWidget {
12-
final TitleBloc _titleBloc = TitleBloc();
11+
class HomePage extends StatelessWidget {
1312
final TaskBloc _taskBloc = TaskBloc(TaskDB.get());
1413

1514
@override
1615
Widget build(BuildContext context) {
17-
return new Scaffold(
18-
appBar: new AppBar(
16+
final HomeBloc homeBloc = BlocProvider.of(context);
17+
homeBloc.filter.listen((filter) {
18+
_taskBloc.updateFilters(filter);
19+
});
20+
return Scaffold(
21+
appBar: AppBar(
1922
title: StreamBuilder<String>(
2023
initialData: 'Today',
21-
stream: _titleBloc.title,
24+
stream: homeBloc.title,
2225
builder: (context, snapshot) {
2326
return Text(snapshot.data);
2427
}),
@@ -33,37 +36,12 @@ class HomeScreen extends StatelessWidget {
3336
onPressed: () async {
3437
await Navigator.push(
3538
context,
36-
new MaterialPageRoute<bool>(
37-
builder: (context) => new AddTaskScreen()),
39+
MaterialPageRoute<bool>(builder: (context) => new AddTaskScreen()),
3840
);
3941
_taskBloc.refresh();
4042
},
4143
),
42-
drawer: new SideDrawer(
43-
projectSelection: (project) {
44-
_titleBloc.updateTitle(project.name);
45-
_taskBloc.filterByProject(project.id);
46-
},
47-
labelSelection: (label) {
48-
_titleBloc.updateTitle('@${label.name}');
49-
_taskBloc.filterByLabel(label.name);
50-
},
51-
dateSelection: (startTime, endTime) {
52-
var dayInMillis = 86340000;
53-
bool isNextWeek = endTime - startTime > dayInMillis;
54-
String homeTitle = isNextWeek ? 'Next 7 Days' : 'Today';
55-
_titleBloc.updateTitle(homeTitle);
56-
if (isNextWeek) {
57-
_taskBloc.filterTasksForNextWeek();
58-
} else {
59-
_taskBloc.filterTodayTasks();
60-
}
61-
},
62-
),
63-
/*drawer: BlocProvider<TasksBloc>(
64-
bloc: _taskBloc,
65-
child: SideDrawer(),
66-
),*/
44+
drawer: SideDrawer(),
6745
body: BlocProvider(
6846
bloc: _taskBloc,
6947
child: TasksPage(),
@@ -80,7 +58,7 @@ class HomeScreen extends StatelessWidget {
8058
case MenuItem.taskCompleted:
8159
await Navigator.push(
8260
context,
83-
new MaterialPageRoute<bool>(
61+
MaterialPageRoute<bool>(
8462
builder: (context) => TaskCompletedPage()),
8563
);
8664
_taskBloc.refresh();

lib/pages/home/home_bloc.dart

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import 'dart:async';
2+
3+
import 'package:flutter_app/bloc/bloc_provider.dart';
4+
import 'package:flutter_app/bloc/task_bloc.dart';
5+
6+
class HomeBloc implements BlocBase {
7+
StreamController<String> _titleController =
8+
StreamController<String>.broadcast();
9+
10+
Stream<String> get title => _titleController.stream;
11+
12+
StreamController<Filter> _filterController =
13+
StreamController<Filter>.broadcast();
14+
15+
Stream<Filter> get filter => _filterController.stream;
16+
17+
@override
18+
void dispose() {
19+
_titleController.close();
20+
_filterController.close();
21+
}
22+
23+
void updateTitle(String title) {
24+
_titleController.sink.add(title);
25+
}
26+
27+
void applyFilter(String title, Filter filter) {
28+
_filterController.sink.add(filter);
29+
updateTitle(title);
30+
}
31+
}

lib/pages/home/side_drawer.dart

+13-119
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,20 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_app/bloc/bloc_provider.dart';
3-
import 'package:flutter_app/db/app_db.dart';
3+
import 'package:flutter_app/bloc/task_bloc.dart';
44
import 'package:flutter_app/db/label_db.dart';
55
import 'package:flutter_app/db/project_db.dart';
6-
import 'package:flutter_app/models/label.dart';
76
import 'package:flutter_app/models/project.dart';
87
import 'package:flutter_app/pages/about/about_us.dart';
9-
import 'package:flutter_app/pages/labels/add_label.dart';
8+
import 'package:flutter_app/pages/home/home_bloc.dart';
109
import 'package:flutter_app/pages/labels/label_bloc.dart';
1110
import 'package:flutter_app/pages/labels/label_widget.dart';
1211
import 'package:flutter_app/pages/projects/project_bloc.dart';
1312
import 'package:flutter_app/pages/projects/project_widget.dart';
1413

15-
class SideDrawer extends StatefulWidget {
16-
ProjectSelection projectSelection;
17-
LabelSelection labelSelection;
18-
DateSelection dateSelection;
19-
20-
SideDrawer({this.projectSelection, this.labelSelection, this.dateSelection});
21-
22-
@override
23-
_SideDrawerState createState() => new _SideDrawerState();
24-
}
25-
26-
class _SideDrawerState extends State<SideDrawer> {
27-
final List<Project> projectList = new List();
28-
final List<Label> labelList = new List();
29-
30-
@override
31-
void initState() {
32-
super.initState();
33-
}
34-
14+
class SideDrawer extends StatelessWidget {
3515
@override
3616
Widget build(BuildContext context) {
17+
HomeBloc homeBloc = BlocProvider.of(context);
3718
return new Drawer(
3819
child: new ListView(
3920
children: <Widget>[
@@ -50,7 +31,7 @@ class _SideDrawerState extends State<SideDrawer> {
5031
onPressed: () {
5132
Navigator.push(
5233
context,
53-
new MaterialPageRoute<bool>(
34+
MaterialPageRoute<bool>(
5435
builder: (context) => new AboutUsScreen()),
5536
);
5637
})
@@ -64,123 +45,36 @@ class _SideDrawerState extends State<SideDrawer> {
6445
leading: new Icon(Icons.inbox),
6546
title: new Text("Inbox"),
6647
onTap: () {
67-
if (widget.projectSelection != null) {
68-
var project = Project.getInbox();
69-
widget.projectSelection(project);
70-
Navigator.pop(context);
71-
}
48+
var project = Project.getInbox();
49+
homeBloc.applyFilter(
50+
project.name, Filter.byProject(project.id));
51+
Navigator.pop(context);
7252
}),
7353
new ListTile(
7454
onTap: () {
75-
var dateTime = new DateTime.now();
76-
var taskStartTime =
77-
new DateTime(dateTime.year, dateTime.month, dateTime.day)
78-
.millisecondsSinceEpoch;
79-
var taskEndTime = new DateTime(
80-
dateTime.year, dateTime.month, dateTime.day, 23, 59)
81-
.millisecondsSinceEpoch;
82-
83-
if (widget.dateSelection != null) {
84-
widget.dateSelection(taskStartTime, taskEndTime);
85-
}
55+
homeBloc.applyFilter("Today", Filter.byToday());
8656
Navigator.pop(context);
8757
},
8858
leading: new Icon(Icons.calendar_today),
8959
title: new Text("Today")),
9060
new ListTile(
9161
onTap: () {
92-
var dateTime = new DateTime.now();
93-
var taskStartTime =
94-
new DateTime(dateTime.year, dateTime.month, dateTime.day)
95-
.millisecondsSinceEpoch;
96-
var taskEndTime = new DateTime(
97-
dateTime.year, dateTime.month, dateTime.day + 7, 23, 59)
98-
.millisecondsSinceEpoch;
99-
100-
if (widget.dateSelection != null) {
101-
widget.dateSelection(taskStartTime, taskEndTime);
102-
}
62+
homeBloc.applyFilter("Next 7 Days", Filter.byNextWeek());
10363
Navigator.pop(context);
10464
},
10565
leading: new Icon(Icons.calendar_today),
10666
title: new Text("Next 7 Days"),
10767
),
10868
BlocProvider(
10969
bloc: ProjectBloc(ProjectDB.get()),
110-
child: ProjectPage(widget.projectSelection),
70+
child: ProjectPage(),
11171
),
11272
BlocProvider(
11373
bloc: LabelBloc(LabelDB.get()),
114-
child: LabelPage(widget.labelSelection),
74+
child: LabelPage(),
11575
)
11676
],
11777
),
11878
);
11979
}
12080
}
121-
122-
class ProjectRow extends StatelessWidget {
123-
final Project project;
124-
final ProjectSelection projectSelection;
125-
126-
ProjectRow(this.project, {this.projectSelection});
127-
128-
@override
129-
Widget build(BuildContext context) {
130-
return new ListTile(
131-
onTap: () {
132-
if (projectSelection != null) {
133-
projectSelection(project);
134-
}
135-
},
136-
leading: new Container(
137-
width: 24.0,
138-
height: 24.0,
139-
),
140-
title: new Text(project.name),
141-
trailing: new Container(
142-
height: 10.0,
143-
width: 10.0,
144-
child: new CircleAvatar(
145-
backgroundColor: new Color(project.colorValue),
146-
),
147-
),
148-
);
149-
}
150-
}
151-
152-
class LabelRow extends StatelessWidget {
153-
final Label label;
154-
final LabelSelection labelSelection;
155-
156-
LabelRow(this.label, {this.labelSelection});
157-
158-
@override
159-
Widget build(BuildContext context) {
160-
return new ListTile(
161-
onTap: () {
162-
if (labelSelection != null) {
163-
labelSelection(label);
164-
}
165-
},
166-
leading: new Container(
167-
width: 24.0,
168-
height: 24.0,
169-
),
170-
title: new Text("@ ${label.name}"),
171-
trailing: new Container(
172-
height: 10.0,
173-
width: 10.0,
174-
child: new Icon(
175-
Icons.label,
176-
size: 16.0,
177-
color: new Color(label.colorValue),
178-
),
179-
),
180-
);
181-
}
182-
}
183-
184-
typedef void ProjectSelection(Project project);
185-
typedef void LabelSelection(Label label);
186-
typedef void DateSelection(int startDate, int endDate);

lib/pages/home/title_bloc.dart

-19
This file was deleted.

lib/pages/labels/add_label.dart

+8-7
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ class _AddLabelState extends State<AddLabel> {
3333
@override
3434
Widget build(BuildContext context) {
3535
LabelBloc labelBloc = BlocProvider.of(context);
36+
labelBloc.labelsExist.listen((isExist) {
37+
if (isExist) {
38+
showSnackbar(_scaffoldState, "Label already exists");
39+
} else {
40+
Navigator.pop(context);
41+
}
42+
});
3643
return new Scaffold(
3744
key: _scaffoldState,
3845
appBar: new AppBar(
@@ -50,13 +57,7 @@ class _AddLabelState extends State<AddLabel> {
5057
labelName,
5158
currentSelectedPalette.colorValue,
5259
currentSelectedPalette.colorName);
53-
labelBloc.checkIfLabelExist(label).then((isExist) {
54-
if (isExist) {
55-
showSnackbar(_scaffoldState, "Label already exists");
56-
}else{
57-
Navigator.pop(context);
58-
}
59-
});
60+
labelBloc.checkIfLabelExist(label);
6061
}
6162
}),
6263
body: new ListView(

0 commit comments

Comments
 (0)