wip: null safety

upgrade-2021-project
Stefan Haslinger 2022-03-11 16:00:45 +01:00
parent ceb8175194
commit f6fd2e05e3
16 changed files with 82 additions and 76 deletions

File diff suppressed because one or more lines are too long

View File

@ -28,7 +28,7 @@ Future<void> analyseActivities({
for (final Activity activity in activities) {
index += 1;
await activity.setAverages();
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
percent = 100 * index ~/ activities.length;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
@ -41,7 +41,7 @@ Future<void> analyseActivities({
);
}
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 5),

View File

@ -43,7 +43,7 @@ Future<void> autoTagging({
for (final Activity activity in activities) {
index += 1;
await activity.autoTagger(athlete: athlete);
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
percent = 100 * index ~/ activities.length;
ScaffoldMessenger.of(context).showSnackBar(
@ -59,7 +59,7 @@ Future<void> autoTagging({
);
}
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 5),

View File

@ -8,7 +8,7 @@ Future<void> downloadActivity({
required Activity activity,
required Athlete athlete,
}) async {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 10),
@ -21,7 +21,7 @@ Future<void> downloadActivity({
await activity.download(athlete: athlete);
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 2),

View File

@ -24,7 +24,7 @@ Future<void> downloadDemoData({
'upper_palatinate_winter_challenge_half_marathon.fit',
];
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Row(
@ -57,7 +57,7 @@ Future<void> downloadDemoData({
activity: activity,
athlete: athlete,
);
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(' Tagging »${activity.name}«')),
@ -65,7 +65,7 @@ Future<void> downloadDemoData({
await activity.autoTagger(athlete: athlete);
}
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Row(
@ -77,7 +77,7 @@ Future<void> downloadDemoData({
),
);
} else {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(' Please set up Power Zone Schema and Heart'

View File

@ -51,7 +51,7 @@ Future<void> importActivitiesLocally({
);
await activity.autoTagger(athlete: athlete);
}
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 5),

View File

@ -9,7 +9,7 @@ Future<void> parseActivity({
required Activity activity,
required Athlete athlete,
}) async {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
@ -28,16 +28,16 @@ Future<void> parseActivity({
percentageStream = activity.parse(athlete: athlete);
await for (final int value in percentageStream) {
if (value == -2) {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
} else if (value == -1) {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(' Analyzing »${activity.name}«'),
),
);
} else {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Row(
@ -60,7 +60,7 @@ Future<void> parseActivity({
await log.save();
activity.nonParsable = true;
await activity.save();
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(

View File

@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import '/models/activity.dart';
import '/models/athlete.dart';
import '/utils/icon_utils.dart';
@ -19,8 +18,8 @@ Future<void> queryStrava({
),
);
await Activity.queryStrava(athlete: athlete);
ScaffoldMessenger.of(context).hideCurrentSnackBar();
await athlete.queryStrava();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 1),

View File

@ -29,5 +29,5 @@ Future<void> setupDemoAthlete({
context: context,
athlete: athlete,
);
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
}

View File

@ -43,7 +43,7 @@ Future<void> updateJob({
);
await activity.autoTagger(athlete: athlete);
}
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 5),

View File

@ -7,12 +7,11 @@ import 'package:flutter/foundation.dart';
import 'package:intl/intl.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqfentity_gen/sqfentity_gen.dart';
import 'package:strava_flutter/domain/model/model_authentication_scopes.dart';
import 'package:strava_flutter/domain/model/model_summary_activity.dart';
import 'package:strava_flutter/strava_client.dart';
import '/model/model.dart'
show DbActivity, DbEvent, DbHeartRateZone, DbInterval, DbLap, DbPowerZone;
import '/secrets/secrets.dart';
import '/utils/date_time_utils.dart';
import '/utils/enums.dart';
import 'activity_tagging.dart';
@ -85,7 +84,7 @@ class Activity {
int? get id => _db.id;
DateTime? get startTime => _db.startTime;
DateTime get timeCreated => _db.timeCreated!;
DateTime get timeCreated => _db.timeCreated ?? DateTime(1970);
DateTime? get timeStamp => _db.timeStamp;
String? get event => _db.event;
@ -677,43 +676,6 @@ class Activity {
eventsForCurrentLap = <Event>[];
}
static Future<void> queryStrava({required Athlete athlete}) async {
final StravaClient stravaClient =
StravaClient(clientId: clientId, secret: secret);
await stravaClient.authentication
.authenticate(scopes: <AuthenticationScope>[
AuthenticationScope.read_all,
AuthenticationScope.profile_read_all,
AuthenticationScope.activity_read_all
], redirectUrl: 'stravaflutter://redirect');
final DateTime now = DateTime.now();
final DateTime startDate =
DateTime.now().subtract(Duration(days: athlete.downloadInterval!));
final List<SummaryActivity> summaryActivities = await stravaClient
.activities
.listLoggedInAthleteActivities(now, startDate, 1, 100);
await Future.forEach(summaryActivities,
(SummaryActivity summaryActivity) async {
final Activity activity = Activity.fromStrava(
summaryActivity: summaryActivity,
athlete: athlete,
);
final List<DbActivity> existingAlready = await DbActivity()
.select()
.stravaId
.equals(activity.stravaId)
.toList();
if (existingAlready.isEmpty) {
await activity.save();
}
});
}
Future<PowerZoneSchema?> get powerZoneSchema async =>
_powerZoneSchema ??= await PowerZoneSchema.getBy(
athletesId: athletesId,

View File

@ -3,6 +3,9 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqfentity_gen/sqfentity_gen.dart' show BoolResult;
import 'package:strava_flutter/domain/model/model_detailed_athlete.dart';
import 'package:strava_flutter/domain/model/model_authentication_scopes.dart';
import 'package:strava_flutter/domain/model/model_summary_activity.dart';
import 'package:strava_flutter/strava_client.dart';
import 'package:uuid/uuid.dart';
import '/model/model.dart'
show
@ -17,6 +20,7 @@ import '/models/activity.dart';
import '/models/interval.dart' as encrateia;
import '/models/power_zone_schema.dart';
import '/models/tag_group.dart';
import '/secrets/secrets.dart';
import '/models/weight.dart';
import 'heart_rate_zone_schema.dart';
@ -26,6 +30,7 @@ class Athlete {
String? email;
String? password;
StravaClient? stravaClient;
DbAthlete _db = DbAthlete(uuid: const Uuid().v1());
List<int?> filters = <int?>[];
@ -181,5 +186,45 @@ class Athlete {
(await powerZoneSchemas).isNotEmpty &&
(await heartRateZoneSchemas).isNotEmpty;
Future<void> queryStrava() async {
var currentStravaClient = stravaClient;
if (currentStravaClient == null) {
stravaClient = StravaClient(clientId: clientId, secret: secret, applicationName: uuid);
currentStravaClient = stravaClient!;
}
await currentStravaClient.authentication
.authenticate(scopes: <AuthenticationScope>[
AuthenticationScope.read_all,
AuthenticationScope.profile_read_all,
AuthenticationScope.activity_read_all
], redirectUrl: 'stravaflutter://redirect');
final DateTime now = DateTime.now();
final DateTime startDate =
DateTime.now().subtract(Duration(days: downloadInterval!));
final List<SummaryActivity> summaryActivities = await currentStravaClient
.activities
.listLoggedInAthleteActivities(now, startDate, 1, 100);
await Future.forEach(summaryActivities,
(SummaryActivity summaryActivity) async {
final Activity activity = Activity.fromStrava(
summaryActivity: summaryActivity,
athlete: this,
);
final List<DbActivity> existingAlready = await DbActivity()
.select()
.stravaId
.equals(activity.stravaId)
.toList();
if (existingAlready.isEmpty) {
await activity.save();
}
});
}
static Athlete exDb(DbAthlete db) => Athlete._fromDb(db);
}

View File

@ -299,7 +299,7 @@ class Lap {
await save();
}
Future<PowerZone?> get powerZone async {
Future<PowerZone> get powerZone async {
if (_powerZone == null) {
final DbPowerZone? dbPowerZone = await DbPowerZone()
.select()
@ -314,10 +314,10 @@ class Lap {
.toSingle();
_powerZone = PowerZone.exDb(dbPowerZone ?? DbPowerZone());
}
return _powerZone;
return _powerZone!;
}
Future<HeartRateZone?> get heartRateZone async {
Future<HeartRateZone> get heartRateZone async {
if (_heartRateZone == null) {
final DbHeartRateZone? dbHeartRateZone = await DbHeartRateZone()
.select()
@ -333,11 +333,11 @@ class Lap {
_heartRateZone = HeartRateZone.exDb(dbHeartRateZone ?? DbHeartRateZone());
}
return _heartRateZone;
return _heartRateZone!;
}
Future<void> autoTagger({required Athlete? athlete}) async {
final PowerZone powerZone = await (this.powerZone as Future<PowerZone>);
final PowerZone powerZone = await this.powerZone;
if (powerZone.id != null) {
final Tag powerTag = await Tag.autoPowerTag(
athlete: athlete!,
@ -353,7 +353,7 @@ class Lap {
}
final HeartRateZone heartRateZone =
await (this.heartRateZone as Future<HeartRateZone>);
await this.heartRateZone;
if (heartRateZone.id != null) {
final Tag heartRateTag = await Tag.autoHeartRateTag(
athlete: athlete!,

View File

@ -474,7 +474,7 @@ class _ShowActivityScreenState extends State<ShowActivityScreen> {
await widget.activity.autoTagger(athlete: widget.athlete);
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 2),
@ -521,7 +521,7 @@ class _ShowActivityScreenState extends State<ShowActivityScreen> {
await widget.activity.download(athlete: widget.athlete);
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 1),
@ -560,9 +560,9 @@ class _ShowActivityScreenState extends State<ShowActivityScreen> {
widget.activity.parse(athlete: widget.athlete);
await for (final int value in percentageStream) {
if (value == -2) {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
} else if (value == -1) {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 1),
@ -570,7 +570,7 @@ class _ShowActivityScreenState extends State<ShowActivityScreen> {
),
);
} else {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 3),

View File

@ -144,7 +144,7 @@ class _ActivitiesListWidgetState extends State<ActivitiesListWidget> {
final Stream<int> percentageStream =
activity.parse(athlete: widget.athlete);
await for (final int value in percentageStream) {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 3),

View File

@ -97,7 +97,7 @@ class _EditStravaAthleteWidgetState extends State<EditStravaAthleteWidget> {
if (await StravaFitDownload.credentialsAreValid(athlete: widget.athlete!)) {
final List<PowerZoneSchema> powerZoneSchemas =
await widget.athlete!.powerZoneSchemas;
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).removeCurrentSnackBar();
if (powerZoneSchemas.isEmpty) {
Navigator.pushReplacement(
context,