Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lint rules suggestion. #138

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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
191 changes: 190 additions & 1 deletion analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,193 @@
include: package:flutter_lints/flutter.yaml

analyzer:
exclude: [ build/**, lib/**/*.g.dart, lib/l10n/** ]
exclude: [build/**, lib/**/*.g.dart, lib/l10n/**]
plugins:
- custom_lint
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at
# https://dart-lang.github.io/linter/lints/index.html.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
- always_declare_return_types
- always_use_package_imports
- annotate_overrides
- avoid_bool_literals_in_conditional_expressions
- avoid_catching_errors
- avoid_double_and_int_checks
- avoid_dynamic_calls
- avoid_empty_else
# - avoid_equals_and_hash_code_on_mutable_classes
- avoid_escaping_inner_quotes
- avoid_field_initializers_in_const_classes
- avoid_function_literals_in_foreach_calls
- avoid_init_to_null
- avoid_js_rounded_ints
- avoid_null_checks_in_equality_operators
# - avoid_positional_boolean_parameters
- avoid_print
- avoid_private_typedef_functions
# - avoid_redundant_argument_values
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
- avoid_return_types_on_setters
- avoid_returning_null_for_void
- avoid_returning_this
- avoid_setters_without_getters
- avoid_shadowing_type_parameters
- avoid_single_cascade_in_expression_statements
- avoid_slow_async_io
- avoid_type_to_string
- avoid_types_as_parameter_names
- avoid_unnecessary_containers
- avoid_unused_constructor_parameters
- avoid_void_async
- avoid_web_libraries_in_flutter
- await_only_futures
- camel_case_extensions
- camel_case_types
- cancel_subscriptions
# - cascade_invocations
- cast_nullable_to_non_nullable
- collection_methods_unrelated_type
- comment_references
- conditional_uri_does_not_exist
- constant_identifier_names
- control_flow_in_finally
- curly_braces_in_flow_control_structures
- deprecated_consistency
- directives_ordering
- empty_catches
- empty_constructor_bodies
- empty_statements
- eol_at_end_of_file
- exhaustive_cases
- file_names
# - flutter_style_todos
- hash_and_equals
- implementation_imports
- implicit_call_tearoffs
- join_return_with_assignment
- leading_newlines_in_multiline_strings
- library_names
- library_prefixes
- library_private_types_in_public_api
# - lines_longer_than_80_chars
- literal_only_boolean_expressions
- missing_whitespace_between_adjacent_strings
- no_adjacent_strings_in_list
# - no_default_cases
- no_duplicate_case_values
- no_logic_in_create_state
- no_runtimeType_toString
- non_constant_identifier_names
- noop_primitive_operations
- null_check_on_nullable_type_parameter
- null_closures
# - omit_local_variable_types
# - only_throw_errors
- overridden_fields
- package_api_docs
- package_names
- package_prefixed_library_names
# - parameter_assignments
- prefer_adjacent_string_concatenation
- prefer_asserts_in_initializer_lists
- prefer_asserts_with_message
- prefer_collection_literals
- prefer_conditional_assignment
- prefer_const_constructors
- prefer_const_constructors_in_immutables
- prefer_const_declarations
- prefer_const_literals_to_create_immutables
# - prefer_constructors_over_static_methods
- prefer_contains
- prefer_final_fields
- prefer_final_in_for_each
- prefer_final_locals
- prefer_for_elements_to_map_fromIterable
- prefer_function_declarations_over_variables
- prefer_generic_function_type_aliases
- prefer_if_elements_to_conditional_expressions
- prefer_if_null_operators
- prefer_initializing_formals
- prefer_inlined_adds
- prefer_int_literals
- prefer_interpolation_to_compose_strings
- prefer_is_empty
- prefer_is_not_empty
- prefer_is_not_operator
- prefer_iterable_whereType
- prefer_null_aware_method_calls
- prefer_null_aware_operators
- prefer_single_quotes
- prefer_spread_collections
- prefer_typing_uninitialized_variables
- provide_deprecation_message
- recursive_getters
- require_trailing_commas
- secure_pubspec_urls
- sized_box_for_whitespace
# - sized_box_shrink_expand
- slash_for_doc_comments
- sort_child_properties_last
# - sort_constructors_first
- sort_pub_dependencies
# - sort_unnamed_constructors_first
- test_types_in_equals
- throw_in_finally
- tighten_type_of_initializing_formals
- type_annotate_public_apis
- type_init_formals
- type_literal_in_constant_pattern
- unawaited_futures
- unnecessary_await_in_return
- unnecessary_brace_in_string_interps
- unnecessary_const
- unnecessary_constructor_name
- unnecessary_getters_setters
# - unnecessary_lambdas
- unnecessary_late
- unnecessary_new
- unnecessary_null_aware_assignments
- unnecessary_null_checks
- unnecessary_null_in_if_null_operators
- unnecessary_nullable_for_final_variable_declarations
- unnecessary_overrides
- unnecessary_parenthesis
- unnecessary_raw_strings
- unnecessary_statements
- unnecessary_string_escapes
- unnecessary_string_interpolations
- unnecessary_this
- unnecessary_to_list_in_spreads
- unrelated_type_equality_checks
- use_build_context_synchronously
- use_colored_box
- use_decorated_box
- use_enums
- use_full_hex_values_for_flutter_colors
- use_function_type_syntax_for_parameters
- use_is_even_rather_than_modulo
- use_key_in_widget_constructors
- use_late_for_private_fields_and_variables
- use_named_constants
- use_raw_strings
- use_rethrow_when_possible
- use_setters_to_change_properties
- use_string_buffers
- use_string_in_part_of_directives
- use_super_parameters
- use_to_and_as_if_applicable
- valid_regexps
- void_checks
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
19 changes: 10 additions & 9 deletions lib/api/podcast/mobile_podcast_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class MobilePodcastApi extends PodcastApi {
bool explicit = false,
String? searchProvider,
}) async {
var searchParams = {
final searchParams = {
'term': term,
'searchProvider': searchProvider,
};
Expand All @@ -48,7 +48,7 @@ class MobilePodcastApi extends PodcastApi {
String? countryCode = '',
String? languageCode = '',
}) async {
var searchParams = {
final searchParams = {
'size': size.toString(),
'genre': genre,
'searchProvider': searchProvider,
Expand All @@ -61,7 +61,7 @@ class MobilePodcastApi extends PodcastApi {

@override
List<String> genres(String searchProvider) {
var provider = searchProvider == 'itunes'
final provider = searchProvider == 'itunes'
? const podcast_search.ITunesProvider()
: podcast_search.PodcastIndexProvider(
key: podcastIndexKey,
Expand Down Expand Up @@ -101,12 +101,13 @@ class MobilePodcastApi extends PodcastApi {
}

return podcast_search.Podcast.loadTranscriptByUrl(
transcriptUrl: podcast_search.TranscriptUrl(url: transcriptUrl.url, type: format));
transcriptUrl: podcast_search.TranscriptUrl(url: transcriptUrl.url, type: format),
);
}

static Future<podcast_search.SearchResult> _search(Map<String, String?> searchParams) {
var term = searchParams['term']!;
var provider = searchParams['searchProvider'] == 'itunes'
final term = searchParams['term']!;
final provider = searchParams['searchProvider'] == 'itunes'
? const podcast_search.ITunesProvider()
: podcast_search.PodcastIndexProvider(
key: podcastIndexKey,
Expand All @@ -120,15 +121,15 @@ class MobilePodcastApi extends PodcastApi {
}

static Future<podcast_search.SearchResult> _charts(Map<String, String?> searchParams) {
var provider = searchParams['searchProvider'] == 'itunes'
final provider = searchParams['searchProvider'] == 'itunes'
? const podcast_search.ITunesProvider()
: podcast_search.PodcastIndexProvider(
key: podcastIndexKey,
secret: podcastIndexSecret,
);

var countryCode = searchParams['countryCode'];
var languageCode = searchParams['languageCode'] ?? '';
final countryCode = searchParams['countryCode'];
final languageCode = searchParams['languageCode'] ?? '';
var country = podcast_search.Country.none;

if (countryCode != null && countryCode.isNotEmpty) {
Expand Down
2 changes: 1 addition & 1 deletion lib/api/podcast/podcast_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import 'package:podcast_search/podcast_search.dart' as pslib;
/// TODO: Make this more generic so it's not tied to podcast_search
abstract class PodcastApi {
/// Search for podcasts matching the search criteria. Returns a
/// [SearchResult] instance.
/// [pslib.SearchResult] instance.
Future<pslib.SearchResult> search(
String term, {
String? country,
Expand Down
10 changes: 5 additions & 5 deletions lib/bloc/podcast/audio_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -115,14 +115,14 @@ class AudioBloc extends Bloc {

/// Setup a listener for episode requests and then connect to the
/// underlying audio service.
void _handleEpisodeRequests() async {
Future<void> _handleEpisodeRequests() async {
_play.listen((episode) {
audioPlayerService.playEpisode(episode: episode!, resume: true);
});
}

/// Listen for requests to change the position of the current episode.
void _handlePositionTransitions() async {
Future<void> _handlePositionTransitions() async {
_transitionPosition.listen((pos) async {
await audioPlayerService.seek(position: pos.ceil());
});
Expand Down Expand Up @@ -167,15 +167,15 @@ class AudioBloc extends Bloc {
}

@override
void pause() async {
Future<void> pause() async {
log.fine('Audio lifecycle pause');
await audioPlayerService.suspend();
}

@override
void resume() async {
Future<void> resume() async {
log.fine('Audio lifecycle resume');
var ep = await audioPlayerService.resume();
final ep = await audioPlayerService.resume();

if (ep != null) {
log.fine('Resuming with episode ${ep.title} - ${ep.position} - ${ep.played}');
Expand Down
11 changes: 7 additions & 4 deletions lib/bloc/podcast/episode_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'dart:async';

import 'package:anytime/bloc/bloc.dart';
import 'package:anytime/entities/episode.dart';
import 'package:anytime/entities/podcast.dart';
import 'package:anytime/services/audio/audio_player_service.dart';
import 'package:anytime/services/podcast/podcast_service.dart';
import 'package:anytime/state/bloc_state.dart';
Expand Down Expand Up @@ -56,9 +57,9 @@ class EpisodeBloc extends Bloc {
_listenEpisodeEvents();
}

void _handleDeleteDownloads() async {
Future<void> _handleDeleteDownloads() async {
_deleteDownload.stream.listen((episode) async {
var nowPlaying = audioPlayerService.nowPlaying?.guid == episode?.guid;
final nowPlaying = audioPlayerService.nowPlaying?.guid == episode?.guid;

/// If we are attempting to delete the episode we are currently playing, we need to stop the audio.
if (nowPlaying) {
Expand All @@ -71,7 +72,7 @@ class EpisodeBloc extends Bloc {
});
}

void _handleMarkAsPlayed() async {
Future<void> _handleMarkAsPlayed() async {
_togglePlayed.stream.listen((episode) async {
await podcastService.toggleEpisodePlayed(episode!);

Expand All @@ -81,7 +82,9 @@ class EpisodeBloc extends Bloc {

void _listenEpisodeEvents() {
// Listen for episode updates. If the episode is downloaded, we need to update.
podcastService.episodeListener!.where((event) => event.episode.downloaded || event.episode.played).listen((event) => fetchDownloads(true));
podcastService.episodeListener!
.where((event) => event.episode.downloaded || event.episode.played)
.listen((event) => fetchDownloads(true));
}

Stream<BlocState<List<Episode>>> _loadDownloads(bool silent) async* {
Expand Down
Loading