Skip to content
Merged
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
157 changes: 157 additions & 0 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
include: package:flutter_lints/flutter.yaml

analyzer:
strong-mode:
implicit-casts: true # to be changed
implicit-dynamic: true # to be changed
errors:
# Treat missing required parameters as a warning (not a hint)
missing_required_param: warning
# Treat missing returns as a warning (not a hint)
missing_return: warning
# Allow having TODOs in the code
todo: ignore
# Allow self-reference to deprecated members (we do this because otherwise we have
# to annotate every member in every test, assert, etc, when we deprecate something)
deprecated_member_use_from_same_package: ignore
# Ignore analyzer hints for updating pubspecs when using Future or
# Stream and not importing dart:async
# Please see https://github.com/flutter/flutter/pull/24528 for details.
sdk_version_async_exported_from_core: ignore

linter:
rules:
# These rules are documented on and in the same order as
# the Dart Lint rules page to make maintenance easier
# https://github.com/dart-lang/linter/blob/master/example/all.yaml
always_declare_return_types: false # definitely to be changed
always_put_control_body_on_new_line: true
always_require_non_null_named_parameters: true
always_specify_types: false #to be changed
annotate_overrides: true
avoid_bool_literals_in_conditional_expressions: true
avoid_classes_with_only_static_members: true
avoid_dynamic_calls: false # to be changed
avoid_empty_else: true
avoid_equals_and_hash_code_on_mutable_classes: true
avoid_escaping_inner_quotes: true
avoid_field_initializers_in_const_classes: true
avoid_function_literals_in_foreach_calls: true
avoid_init_to_null: true
avoid_null_checks_in_equality_operators: true
avoid_relative_lib_imports: true
avoid_renaming_method_parameters: true
avoid_return_types_on_setters: true
avoid_returning_null_for_void: true
avoid_shadowing_type_parameters: true
avoid_single_cascade_in_expression_statements: true
avoid_slow_async_io: true
avoid_type_to_string: true
avoid_types_as_parameter_names: true
avoid_unnecessary_containers: true
avoid_unused_constructor_parameters: true
avoid_void_async: false # to be changed
await_only_futures: true
camel_case_extensions: true
camel_case_types: false # maybe to be changed
cancel_subscriptions: true
cast_nullable_to_non_nullable: false # to be changed
constant_identifier_names: false
control_flow_in_finally: true
deprecated_consistency: true
directives_ordering: true
empty_catches: false # to be changed
empty_constructor_bodies: true
empty_statements: true
exhaustive_cases: true
file_names: true
flutter_style_todos: true
hash_and_equals: true
implementation_imports: true
iterable_contains_unrelated_type: true
leading_newlines_in_multiline_strings: true
library_names: true
library_prefixes: true
library_private_types_in_public_api: false # to be checked
list_remove_unrelated_type: true
missing_whitespace_between_adjacent_strings: false
no_adjacent_strings_in_list: true
no_duplicate_case_values: true
no_logic_in_create_state: true
non_constant_identifier_names: true
noop_primitive_operations: true
null_check_on_nullable_type_parameter: true
null_closures: true
overridden_fields: true
package_api_docs: true
package_names: true
package_prefixed_library_names: true
prefer_adjacent_string_concatenation: true
prefer_asserts_in_initializer_lists: true
prefer_collection_literals: true
prefer_conditional_assignment: true
prefer_const_constructors: false # definitely to be changed
prefer_const_constructors_in_immutables: true
prefer_const_declarations: true
prefer_const_literals_to_create_immutables: true
prefer_contains: true
prefer_equal_for_default_values: true
prefer_final_fields: true
prefer_final_in_for_each: true
prefer_final_locals: true
prefer_for_elements_to_map_fromIterable: true
prefer_foreach: true
prefer_function_declarations_over_variables: true
prefer_generic_function_type_aliases: true
prefer_if_elements_to_conditional_expressions: true
prefer_if_null_operators: true
prefer_initializing_formals: true
prefer_inlined_adds: true
prefer_interpolation_to_compose_strings: true
prefer_is_empty: true
prefer_is_not_empty: true
prefer_is_not_operator: true
prefer_iterable_whereType: true
prefer_null_aware_operators: true
prefer_single_quotes: true
prefer_spread_collections: true
prefer_typing_uninitialized_variables: false # to be changed
prefer_void_to_null: true
provide_deprecation_message: true
recursive_getters: true
sized_box_for_whitespace: true
slash_for_doc_comments: true
sort_constructors_first: false # good for code readability but later
sort_unnamed_constructors_first: true
test_types_in_equals: true
throw_in_finally: true
tighten_type_of_initializing_formals: true
type_init_formals: true
unnecessary_await_in_return: false # to be changed
unnecessary_brace_in_string_interps: true
unnecessary_const: true
unnecessary_getters_setters: true
unnecessary_new: true
unnecessary_null_aware_assignments: true
unnecessary_null_checks: true
unnecessary_null_in_if_null_operators: true
unnecessary_nullable_for_final_variable_declarations: true
unnecessary_overrides: true
unnecessary_parenthesis: true
unnecessary_statements: true
unnecessary_string_escapes: true
unnecessary_string_interpolations: true
unnecessary_this: true
unrelated_type_equality_checks: true
use_full_hex_values_for_flutter_colors: true
use_function_type_syntax_for_parameters: true
use_is_even_rather_than_modulo: true
use_key_in_widget_constructors: false
use_late_for_private_fields_and_variables: true
use_named_constants: true
use_raw_strings: true
use_rethrow_when_possible: true
use_test_throws_matchers: true
valid_regexps: true
void_checks: true

2 changes: 1 addition & 1 deletion lib/exceptions/http_exception.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class WgerHttpException implements Exception {
errors = responseBody;
}
}
this.errors = errors;
errors = errors;
}

@override
Expand Down
1 change: 1 addition & 0 deletions lib/helpers/consts.dart
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ const DEFAULT_ANIMATION_CURVE = Curves.bounceIn;
/// Dateformat used when using a date as a key in a dictionary. Using either the
/// regular date object or date.toLocal() can cause problems, depending on the
/// system's settings. Using a string is safer.
//ignore: non_constant_identifier_names
final DateFormatLists = DateFormat('yyyy-MM-dd');

/// Available plate weights, used for the plate calculator
Expand Down
10 changes: 5 additions & 5 deletions lib/helpers/gym_mode.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@

/// Calculates the number of plates needed to reach a specific weight
List<num> plateCalculator(num totalWeight, num barWeight, List<num> plates) {
List<num> ans = [];
var platesCount = plates.length;
final List<num> ans = [];
final platesCount = plates.length;

// Weight is less than the bar
if (totalWeight < barWeight) {
Expand All @@ -35,7 +35,7 @@ List<num> plateCalculator(num totalWeight, num barWeight, List<num> plates) {
}

// Iterate through the plates, beginning with the biggest ones
for (var plate in plates.reversed) {
for (final plate in plates.reversed) {
while (totalWeight >= plate) {
totalWeight -= plate;
ans.add(plate);
Expand All @@ -49,8 +49,8 @@ List<num> plateCalculator(num totalWeight, num barWeight, List<num> plates) {
///
/// e.g. [15, 15, 15, 10, 10, 5] returns {15: 3, 10: 2, 5: 1}
Map<num, int> groupPlates(List<num> plates) {
Map<num, int> out = {};
for (var plate in plates) {
final Map<num, int> out = {};
for (final plate in plates) {
if (!out.containsKey(plate)) {
out[plate] = 1;
} else {
Expand Down
4 changes: 2 additions & 2 deletions lib/helpers/json.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,15 @@ String? toDate(DateTime? dateTime) {
if (dateTime == null) {
return null;
}
return DateFormat('yyyy-MM-dd').format(dateTime).toString();
return DateFormat('yyyy-MM-dd').format(dateTime);
}

/*
* Converts a time to a date object.
* Needed e.g. when the wger api only sends a time but no date information.
*/
TimeOfDay stringToTime(String? time) {
String out = time ?? '00:00';
final String out = time ?? '00:00';
return TimeOfDay.fromDateTime(
DateTime.parse('2020-01-01 $out'),
);
Expand Down
16 changes: 9 additions & 7 deletions lib/helpers/misc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ String repText(
WeightUnit weightUnitObj,
String? rir,
) {
// TODO: how to (easily?) translate strings like the units or 'RiR'?
// TODO(x): how to (easily?) translate strings like the units or 'RiR'

List<String> out = [];
final List<String> out = [];

if (reps != null) {
out.add(reps.toString());
Expand Down Expand Up @@ -71,20 +71,22 @@ List<DateTime> daysInRange(DateTime first, DateTime last) {

extension TimeOfDayExtension on TimeOfDay {
bool isAfter(TimeOfDay other) {
if (toMinutes() > other.toMinutes())
if (toMinutes() > other.toMinutes()) {
return true;
else
} else {
return false;
}
}

bool isBefore(TimeOfDay other) {
if (toMinutes() < other.toMinutes())
if (toMinutes() < other.toMinutes()) {
return true;
else
} else {
return false;
}
}

int toMinutes() {
return ((hour * 60) + minute);
return (hour * 60) + minute;
}
}
14 changes: 6 additions & 8 deletions lib/helpers/ui.dart
Original file line number Diff line number Diff line change
Expand Up @@ -49,16 +49,16 @@ void showHttpExceptionErrorDialog(WgerHttpException exception, BuildContext cont
log(exception.toString());
log('-------------------');

List<Widget> errorList = [];
for (var key in exception.errors!.keys) {
final List<Widget> errorList = [];
for (final key in exception.errors!.keys) {
// Error headers
errorList.add(Text(key, style: TextStyle(fontWeight: FontWeight.bold)));

// Error messages
if (exception.errors![key] is String) {
errorList.add(Text(exception.errors![key]));
} else {
for (var value in exception.errors![key]) {
for (final value in exception.errors![key]) {
errorList.add(Text(value));
}
}
Expand All @@ -69,11 +69,9 @@ void showHttpExceptionErrorDialog(WgerHttpException exception, BuildContext cont
context: context,
builder: (ctx) => AlertDialog(
title: Text(AppLocalizations.of(ctx).anErrorOccurred),
content: Container(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [...errorList],
),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [...errorList],
),
actions: [
TextButton(
Expand Down
14 changes: 7 additions & 7 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class MyApp extends StatelessWidget {
create: (context) =>
ExercisesProvider(Provider.of<AuthProvider>(context, listen: false), []),
update: (context, auth, previous) =>
previous != null ? previous : ExercisesProvider(auth, []),
previous ?? ExercisesProvider(auth, []),
),
ChangeNotifierProxyProvider2<AuthProvider, ExercisesProvider, WorkoutPlansProvider>(
create: (context) => WorkoutPlansProvider(
Expand All @@ -75,31 +75,31 @@ class MyApp extends StatelessWidget {
[],
),
update: (context, auth, exercises, previous) =>
previous != null ? previous : WorkoutPlansProvider(auth, exercises, []),
previous ?? WorkoutPlansProvider(auth, exercises, []),
),
ChangeNotifierProxyProvider<AuthProvider, NutritionPlansProvider>(
create: (context) =>
NutritionPlansProvider(Provider.of<AuthProvider>(context, listen: false), []),
update: (context, auth, previous) =>
previous != null ? previous : NutritionPlansProvider(auth, []),
previous ?? NutritionPlansProvider(auth, []),
),
ChangeNotifierProxyProvider<AuthProvider, MeasurementProvider>(
create: (context) => MeasurementProvider(
WgerBaseProvider(Provider.of<AuthProvider>(context, listen: false))),
update: (context, base, previous) =>
previous != null ? previous : MeasurementProvider(WgerBaseProvider(base)),
previous ?? MeasurementProvider(WgerBaseProvider(base)),
),
ChangeNotifierProxyProvider<AuthProvider, BodyWeightProvider>(
create: (context) =>
BodyWeightProvider(Provider.of<AuthProvider>(context, listen: false), []),
update: (context, auth, previous) =>
previous != null ? previous : BodyWeightProvider(auth, []),
previous ?? BodyWeightProvider(auth, []),
),
ChangeNotifierProxyProvider<AuthProvider, GalleryProvider>(
create: (context) =>
GalleryProvider(Provider.of<AuthProvider>(context, listen: false), []),
update: (context, auth, previous) =>
previous != null ? previous : GalleryProvider(auth, []),
previous ?? GalleryProvider(auth, []),
),
],
child: Consumer<AuthProvider>(
Expand All @@ -118,7 +118,7 @@ class MyApp extends StatelessWidget {
routes: {
DashboardScreen.routeName: (ctx) => DashboardScreen(),
FormScreen.routeName: (ctx) => FormScreen(),
GalleryScreen.routeName: (ctx) => GalleryScreen(),
GalleryScreen.routeName: (ctx) => const GalleryScreen(),
GymModeScreen.routeName: (ctx) => GymModeScreen(),
HomeTabsScreen.routeName: (ctx) => HomeTabsScreen(),
MeasurementCategoriesScreen.routeName: (ctx) => MeasurementCategoriesScreen(),
Expand Down
10 changes: 5 additions & 5 deletions lib/models/exercises/exercise.dart
Original file line number Diff line number Diff line change
Expand Up @@ -81,22 +81,22 @@ class Exercise {
this.musclesSecondary = musclesSecondary ?? [];
this.muscles = muscles ?? [];
if (category != null) {
this.categoryObj = category;
this.categoryId = category.id;
categoryObj = category;
categoryId = category.id;
}
}

ExerciseImage? get getMainImage {
try {
return images.firstWhere((image) => image.isMain);
} on StateError catch (e) {
} on StateError {
return null;
}
}

set category(ExerciseCategory category) {
this.categoryId = category.id;
this.categoryObj = category;
categoryId = category.id;
categoryObj = category;
}

// Boilerplate
Expand Down
4 changes: 2 additions & 2 deletions lib/models/gallery/image.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ class Image {
});

Image.emtpy() {
this.date = DateTime.now();
this.description = '';
date = DateTime.now();
description = '';
}

// Boilerplate
Expand Down
Loading