Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ios/Podfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'
platform :ios, '10.0'

# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
Expand Down
6 changes: 4 additions & 2 deletions ios/Runner.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objectVersion = 51;
objects = {

/* Begin PBXBuildFile section */
Expand Down Expand Up @@ -78,7 +78,6 @@
1859F0BD96D85F8A0ECF7A66 /* Pods-Runner.release.xcconfig */,
F250C6BE88EB3A7A92FDB4AF /* Pods-Runner.profile.xcconfig */,
);
name = Pods;
path = Pods;
sourceTree = "<group>";
};
Expand Down Expand Up @@ -384,6 +383,7 @@
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -520,6 +520,7 @@
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -550,6 +551,7 @@
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions lib/app/home/account/account_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class AccountPage extends StatelessWidget {
_signOut(context);
}
}

@override
Widget build(BuildContext context) {
final auth = Provider.of<AuthBase>(context, listen: false);
Expand All @@ -47,7 +48,7 @@ class AccountPage extends StatelessWidget {
],
bottom: PreferredSize(
preferredSize: Size.fromHeight(130),
child: _buildUserInfo(auth.currentUser),
child: _buildUserInfo(auth.currentUser!),
),
),
);
Expand All @@ -63,7 +64,7 @@ class AccountPage extends StatelessWidget {
SizedBox(height: 8),
if (user.displayName != null)
Text(
user.displayName,
user.displayName!,
style: TextStyle(color: Colors.white),
),
SizedBox(height: 8),
Expand Down
15 changes: 7 additions & 8 deletions lib/app/home/cupertino_home_scaffold.dart
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:time_tracker_flutter_course/app/home/jobs/jobs_page.dart';
import 'package:time_tracker_flutter_course/app/home/tab_item.dart';

class CupertinoHomeScaffold extends StatelessWidget {
const CupertinoHomeScaffold({
Key key,
@required this.currentTab,
@required this.onSelectTab,
@required this.widgetBuilders,
@required this.navigatorKeys,
Key? key,
required this.currentTab,
required this.onSelectTab,
required this.widgetBuilders,
required this.navigatorKeys,
}) : super(key: key);

final TabItem currentTab;
Expand All @@ -32,14 +31,14 @@ class CupertinoHomeScaffold extends StatelessWidget {
final item = TabItem.values[index];
return CupertinoTabView(
navigatorKey: navigatorKeys[item],
builder: (context) => widgetBuilders[item](context),
builder: (context) => widgetBuilders[item]!(context),
);
},
);
}

BottomNavigationBarItem _buildItem(TabItem tabItem) {
final itemData = TabItemData.allTabs[tabItem];
final itemData = TabItemData.allTabs[tabItem]!;
final color = currentTab == tabItem ? Colors.indigo : Colors.grey;
return BottomNavigationBarItem(
icon: Icon(
Expand Down
18 changes: 9 additions & 9 deletions lib/app/home/entries/daily_jobs_details.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import 'package:time_tracker_flutter_course/app/home/entries/entry_job.dart';
/// Temporary model class to store the time tracked and pay for a job
class JobDetails {
JobDetails({
@required this.name,
@required this.durationInHours,
@required this.pay,
required this.name,
required this.durationInHours,
required this.pay,
});
final String name;
double durationInHours;
Expand All @@ -15,7 +15,7 @@ class JobDetails {

/// Groups together all jobs/entries on a given day
class DailyJobsDetails {
DailyJobsDetails({@required this.date, @required this.jobsDetails});
DailyJobsDetails({required this.date, required this.jobsDetails});
final DateTime date;
final List<JobDetails> jobsDetails;

Expand All @@ -36,7 +36,7 @@ class DailyJobsDetails {
if (map[entryDayStart] == null) {
map[entryDayStart] = [entryJob];
} else {
map[entryDayStart].add(entryJob);
map[entryDayStart]!.add(entryJob);
}
}
return map;
Expand All @@ -47,7 +47,7 @@ class DailyJobsDetails {
final byDate = _entriesByDate(entries);
List<DailyJobsDetails> list = [];
for (var date in byDate.keys) {
final entriesByDate = byDate[date];
final entriesByDate = byDate[date]!;
final byJob = _jobsDetails(entriesByDate);
list.add(DailyJobsDetails(date: date, jobsDetails: byJob));
}
Expand All @@ -56,7 +56,7 @@ class DailyJobsDetails {

/// groups entries by job
static List<JobDetails> _jobsDetails(List<EntryJob> entries) {
Map<String, JobDetails> jobDuration = {};
Map<String?, JobDetails> jobDuration = {};
for (var entryJob in entries) {
final entry = entryJob.entry;
final pay = entry.durationInHours * entryJob.job.ratePerHour;
Expand All @@ -67,8 +67,8 @@ class DailyJobsDetails {
pay: pay,
);
} else {
jobDuration[entry.jobId].pay += pay;
jobDuration[entry.jobId].durationInHours += entry.durationInHours;
jobDuration[entry.jobId]!.pay += pay;
jobDuration[entry.jobId]!.durationInHours += entry.durationInHours;
}
}
return jobDuration.values.toList();
Expand Down
8 changes: 4 additions & 4 deletions lib/app/home/entries/entries_bloc.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:collection/collection.dart' show IterableExtension;
import 'package:flutter/foundation.dart';
import 'package:rxdart/rxdart.dart';
import 'package:time_tracker_flutter_course/app/home/entries/daily_jobs_details.dart';
Expand All @@ -9,7 +10,7 @@ import 'package:time_tracker_flutter_course/app/home/models/job.dart';
import 'package:time_tracker_flutter_course/services/database.dart';

class EntriesBloc {
EntriesBloc({@required this.database});
EntriesBloc({required this.database});
final Database database;

/// combine List<Job>, List<Entry> into List<EntryJob>
Expand All @@ -22,11 +23,10 @@ class EntriesBloc {
static List<EntryJob> _entriesJobsCombiner(
List<Entry> entries, List<Job> jobs) {
return entries.map((entry) {
final job = jobs.firstWhere(
final job = jobs.firstWhereOrNull(
(job) => job.id == entry.jobId,
orElse: () => null,
);
return EntryJob(entry, job);
return EntryJob(entry, job!);
}).toList();
}

Expand Down
10 changes: 5 additions & 5 deletions lib/app/home/entries/entries_list_tile.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@ import 'package:flutter/material.dart';

class EntriesListTileModel {
const EntriesListTileModel({
@required this.leadingText,
@required this.trailingText,
required this.leadingText,
required this.trailingText,
this.middleText,
this.isHeader = false,
});
final String leadingText;
final String trailingText;
final String middleText;
final String? middleText;
final bool isHeader;
}

class EntriesListTile extends StatelessWidget {
const EntriesListTile({@required this.model});
const EntriesListTile({required this.model});
final EntriesListTileModel model;

@override
Expand All @@ -30,7 +30,7 @@ class EntriesListTile extends StatelessWidget {
Expanded(child: Container()),
if (model.middleText != null)
Text(
model.middleText,
model.middleText!,
style: TextStyle(color: Colors.green[700], fontSize: fontSize),
textAlign: TextAlign.right,
),
Expand Down
8 changes: 4 additions & 4 deletions lib/app/home/home_page.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

import 'package:flutter/material.dart';
import 'package:time_tracker_flutter_course/app/home/account/account_page.dart';
import 'package:time_tracker_flutter_course/app/home/cupertino_home_scaffold.dart';
Expand Down Expand Up @@ -31,7 +30,7 @@ class _HomePageState extends State<HomePage> {
void _select(TabItem tabItem) {
if (tabItem == _currentTab) {
// pop to first route
navigatorKeys[tabItem].currentState.popUntil((route) => route.isFirst);
navigatorKeys[tabItem]!.currentState?.popUntil((route) => route.isFirst);
} else {
setState(() => _currentTab = tabItem);
}
Expand All @@ -40,7 +39,9 @@ class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async => !await navigatorKeys[_currentTab].currentState.maybePop(),
onWillPop: () async =>
!(await navigatorKeys[_currentTab]!.currentState?.maybePop() ??
false),
child: CupertinoHomeScaffold(
currentTab: _currentTab,
onSelectTab: _select,
Expand All @@ -49,5 +50,4 @@ class _HomePageState extends State<HomePage> {
),
);
}

}
24 changes: 12 additions & 12 deletions lib/app/home/job_entries/entry_list_item.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ import 'package:time_tracker_flutter_course/app/home/models/job.dart';

class EntryListItem extends StatelessWidget {
const EntryListItem({
@required this.entry,
@required this.job,
@required this.onTap,
required this.entry,
required this.job,
this.onTap,
});

final Entry entry;
final Job job;
final VoidCallback onTap;
final VoidCallback? onTap;

@override
Widget build(BuildContext context) {
Expand Down Expand Up @@ -76,26 +76,26 @@ class EntryListItem extends StatelessWidget {

class DismissibleEntryListItem extends StatelessWidget {
const DismissibleEntryListItem({
this.key,
this.entry,
this.job,
required this.dismissibleKey,
required this.entry,
required this.job,
this.onDismissed,
this.onTap,
});

final Key key;
final Key dismissibleKey;
final Entry entry;
final Job job;
final VoidCallback onDismissed;
final VoidCallback onTap;
final VoidCallback? onDismissed;
final VoidCallback? onTap;

@override
Widget build(BuildContext context) {
return Dismissible(
background: Container(color: Colors.red),
key: key,
key: dismissibleKey,
direction: DismissDirection.endToStart,
onDismissed: (direction) => onDismissed(),
onDismissed: (direction) => onDismissed?.call(),
child: EntryListItem(
entry: entry,
job: job,
Expand Down
19 changes: 11 additions & 8 deletions lib/app/home/job_entries/entry_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@ import 'package:time_tracker_flutter_course/common_widgets/show_exception_alert_
import 'package:time_tracker_flutter_course/services/database.dart';

class EntryPage extends StatefulWidget {
const EntryPage({@required this.database, @required this.job, this.entry});
const EntryPage({required this.database, required this.job, this.entry});
final Database database;
final Job job;
final Entry entry;
final Entry? entry;

static Future<void> show(
{BuildContext context, Database database, Job job, Entry entry}) async {
{required BuildContext context,
required Database database,
required Job job,
Entry? entry}) async {
await Navigator.of(context, rootNavigator: true).push(
MaterialPageRoute(
builder: (context) =>
Expand All @@ -31,11 +34,11 @@ class EntryPage extends StatefulWidget {
}

class _EntryPageState extends State<EntryPage> {
DateTime _startDate;
TimeOfDay _startTime;
DateTime _endDate;
TimeOfDay _endTime;
String _comment;
late DateTime _startDate;
late TimeOfDay _startTime;
late DateTime _endDate;
late TimeOfDay _endTime;
late String _comment;

@override
void initState() {
Expand Down
Loading