Skip to content

Commit a13704e

Browse files
committed
improve code style
1 parent 6fb4cb5 commit a13704e

8 files changed

Lines changed: 387 additions & 254 deletions

analysis_options.yaml

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
analyzer:
2+
errors:
3+
todo: ignore
4+
plugins:
5+
- dart_code_metrics # https://github.com/dart-code-checker/dart-code-metrics
6+
linter:
7+
rules:
8+
- always_declare_return_types
9+
- always_put_control_body_on_new_line
10+
# - always_put_required_named_parameters_first # not useful for Flutter widgets
11+
- always_require_non_null_named_parameters
12+
#- always_specify_types # This would enforce to write types literally everywhere.
13+
- annotate_overrides
14+
#- avoid_annotating_with_dynamic # Explicit annotation of dynamic as type is preferable. Also exclusive with type_annotate_public_apis
15+
#- avoid_as - deprecated, breaks lint
16+
- avoid_bool_literals_in_conditional_expressions
17+
#- avoid_catches_without_on_clauses # Do not enable this as enough_mail needs to handle several underlying exceptions and errors
18+
- avoid_catching_errors
19+
#- avoid_classes_with_only_static_members # Useful for some non-global helper cases
20+
- avoid_double_and_int_checks
21+
- avoid_empty_else
22+
- avoid_field_initializers_in_const_classes
23+
- avoid_function_literals_in_foreach_calls
24+
- avoid_implementing_value_types
25+
- avoid_init_to_null
26+
- avoid_js_rounded_ints
27+
- avoid_null_checks_in_equality_operators
28+
- avoid_positional_boolean_parameters
29+
- avoid_private_typedef_functions
30+
- avoid_renaming_method_parameters
31+
- avoid_relative_lib_imports
32+
- avoid_return_types_on_setters
33+
- avoid_returning_null
34+
- avoid_returning_null_for_future
35+
- avoid_returning_null_for_void
36+
- avoid_returning_this
37+
- avoid_setters_without_getters
38+
- avoid_shadowing_type_parameters
39+
- avoid_single_cascade_in_expression_statements
40+
- avoid_slow_async_io
41+
- avoid_types_as_parameter_names
42+
- avoid_types_on_closure_parameters
43+
- avoid_unused_constructor_parameters
44+
- avoid_void_async
45+
- avoid_web_libraries_in_flutter
46+
- await_only_futures
47+
- camel_case_types
48+
- cancel_subscriptions
49+
- cascade_invocations
50+
- cast_nullable_to_non_nullable
51+
- close_sinks
52+
- comment_references
53+
- constant_identifier_names
54+
- control_flow_in_finally
55+
- curly_braces_in_flow_control_structures
56+
#- diagnostic_describe_all_properties # We do not use diagnostics atm
57+
- directives_ordering
58+
- empty_constructor_bodies
59+
- empty_statements
60+
- empty_catches
61+
- file_names
62+
#- flutter_style_todos # Flutter todos are to verbose for our requirements.
63+
- hash_and_equals
64+
- implementation_imports
65+
- invariant_booleans
66+
- iterable_contains_unrelated_type
67+
# - join_return_with_assignment # leads to less readable code IMHO
68+
- library_names
69+
- library_prefixes
70+
- lines_longer_than_80_chars
71+
- list_remove_unrelated_type
72+
- literal_only_boolean_expressions
73+
- no_adjacent_strings_in_list
74+
- no_duplicate_case_values
75+
- non_constant_identifier_names
76+
- null_closures
77+
- omit_local_variable_types
78+
- one_member_abstracts
79+
- only_throw_errors
80+
- overridden_fields
81+
- package_api_docs
82+
- package_names
83+
- package_prefixed_library_names
84+
- parameter_assignments
85+
- prefer_adjacent_string_concatenation
86+
- prefer_asserts_in_initializer_lists
87+
- prefer_asserts_with_message
88+
- prefer_collection_literals
89+
- prefer_conditional_assignment
90+
- prefer_const_constructors
91+
- prefer_const_constructors_in_immutables
92+
- prefer_const_declarations
93+
- prefer_const_literals_to_create_immutables
94+
- prefer_constructors_over_static_methods
95+
- prefer_contains
96+
- prefer_equal_for_default_values
97+
- prefer_expression_function_bodies
98+
- prefer_final_fields
99+
- prefer_final_in_for_each
100+
- prefer_final_locals
101+
- prefer_for_elements_to_map_fromIterable
102+
- prefer_foreach
103+
- prefer_function_declarations_over_variables
104+
- prefer_generic_function_type_aliases
105+
- prefer_if_elements_to_conditional_expressions
106+
- prefer_initializing_formals
107+
- prefer_inlined_adds
108+
# - prefer_int_literals # more customary to use doubles eg in paddings
109+
- prefer_interpolation_to_compose_strings
110+
- prefer_is_empty
111+
- prefer_is_not_empty
112+
- prefer_iterable_whereType
113+
- prefer_mixin
114+
- prefer_null_aware_operators
115+
- prefer_relative_imports
116+
- prefer_single_quotes
117+
- prefer_spread_collections
118+
- prefer_typing_uninitialized_variables
119+
- prefer_void_to_null
120+
- provide_deprecation_message
121+
- public_member_api_docs
122+
- recursive_getters
123+
- slash_for_doc_comments
124+
- sort_constructors_first
125+
- sort_pub_dependencies
126+
- sort_unnamed_constructors_first
127+
- test_types_in_equals
128+
- throw_in_finally
129+
- type_annotate_public_apis
130+
- type_init_formals
131+
- unawaited_futures
132+
- unnecessary_await_in_return
133+
- unnecessary_brace_in_string_interps
134+
- unnecessary_const
135+
- unnecessary_getters_setters
136+
- unnecessary_lambdas
137+
- unnecessary_new
138+
- unnecessary_null_aware_assignments
139+
- unnecessary_null_in_if_null_operators
140+
- unnecessary_overrides
141+
- unnecessary_parenthesis
142+
- unnecessary_statements
143+
- unnecessary_this
144+
- unrelated_type_equality_checks
145+
- use_full_hex_values_for_flutter_colors
146+
- use_function_type_syntax_for_parameters
147+
- use_rethrow_when_possible
148+
- use_setters_to_change_properties
149+
- use_string_buffers
150+
- use_to_and_as_if_applicable
151+
- valid_regexps
152+
- void_checks
153+
dart_code_metrics:
154+
metrics:
155+
# disable metrics
156+
cyclomatic-complexity: 50
157+
maximum-nesting-level: 50
158+
number-of-parameters: 50
159+
source-lines-of-code: 500
160+
number-of-methods: 100
161+
metrics-exclude:
162+
- test/**
163+
rules:
164+
- avoid-non-null-assertion # comply to engineering standards and avoid !

example/enough_mail_flutter_example.dart

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,37 @@ import 'package:enough_mail_flutter/enough_mail_flutter.dart';
33
import 'package:flutter/widgets.dart';
44

55
/// Example implementation for displaying the message contents.
6-
///
6+
///
77
/// When required, the message contents are downloaded first.
8-
/// The implementation assumes that the `size` and `envelope` information have been previously downloaded,
9-
/// e.g. using `MailClient.fetchMessages(fetchPreference: FetchPreference.envelope)`.
10-
Widget buildViewerForMessage(MimeMessage mimeMessage, MailClient mailClient) {
11-
return MimeMessageDownloader(
12-
mimeMessage: mimeMessage,
13-
mailClient: mailClient,
14-
onDownloaded: onMessageDownloaded,
15-
blockExternalImages: false,
16-
mailtoDelegate: handleMailto,
17-
);
18-
}
8+
///
9+
/// The implementation assumes that the `size` and `envelope` information
10+
/// have been previously downloaded,
11+
///
12+
/// e.g. using
13+
/// `MailClient.fetchMessages(fetchPreference: FetchPreference.envelope)`.
14+
Widget buildViewerForMessage(MimeMessage mimeMessage, MailClient mailClient) =>
15+
MimeMessageDownloader(
16+
mimeMessage: mimeMessage,
17+
mailClient: mailClient,
18+
onDownloaded: onMessageDownloaded,
19+
blockExternalImages: false,
20+
mailtoDelegate: handleMailto,
21+
);
1922

2023
// Example implementation of an optional onDownloaded delegate
2124
void onMessageDownloaded(MimeMessage mimeMessage) {
2225
// update other things to show eg attachment view, e.g.:
2326
//setState(() {});
2427
}
2528

26-
/// Example implementation for displaying a message for which the contents already have been downloaded:
27-
Widget buildViewerForDownloadedMessage(MimeMessage mimeMessage) {
28-
return MimeMessageViewer(
29-
mimeMessage: mimeMessage,
30-
blockExternalImages: false,
31-
mailtoDelegate: handleMailto,
32-
);
33-
}
29+
/// Example implementation for displaying a message for which the contents
30+
/// already have been downloaded:
31+
Widget buildViewerForDownloadedMessage(MimeMessage mimeMessage) =>
32+
MimeMessageViewer(
33+
mimeMessage: mimeMessage,
34+
blockExternalImages: false,
35+
mailtoDelegate: handleMailto,
36+
);
3437

3538
/// Example implementation for a mailto delegate
3639
Future handleMailto(Uri mailto, MimeMessage mimeMessage) {
@@ -41,7 +44,6 @@ Future handleMailto(Uri mailto, MimeMessage mimeMessage) {
4144
// in reality navigate to compose screen, e.g.
4245
// return locator<NavigationService>()
4346
// .push(Routes.mailCompose, arguments: messageBuilder);
44-
print(
45-
'generated message: ${messageBuilder.buildMimeMessage().renderMessage()}');
47+
print('generated message: ${messageBuilder.buildMimeMessage()}');
4648
return Future.value();
4749
}

lib/enough_mail_flutter.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
/// UI components useful for displaying email mime messages
22
library enough_mail_flutter;
33

4-
export 'src/mime_message_viewer.dart';
5-
export 'src/mime_message_downloader.dart';
6-
export 'src/mime_media_provider.dart';
7-
8-
export 'package:webview_flutter/webview_flutter.dart';
9-
export 'package:url_launcher/url_launcher.dart';
104
export 'package:enough_mail_html/enough_mail_html.dart';
115
export 'package:enough_media/enough_media.dart';
6+
export 'package:url_launcher/url_launcher.dart';
7+
export 'package:webview_flutter/webview_flutter.dart';
8+
9+
export 'src/mime_media_provider.dart';
10+
export 'src/mime_message_downloader.dart';
11+
export 'src/mime_message_viewer.dart';

lib/src/mime_media_provider.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import 'package:enough_mail/enough_mail.dart';
22
import 'package:enough_media/enough_media.dart';
33

4+
/// Provides a simple way to generate a media provider from a mime message
45
class MimeMediaProviderFactory {
56
MimeMediaProviderFactory._internal();
67

8+
/// Creates a new [TextMediaProvider] or [MemoryMediaProvider] from
9+
/// the given [mimePart] in the [mimeMessage].
710
static MediaProvider fromMime(MimeMessage mimeMessage, MimePart mimePart) {
811
final name = mimePart.decodeFileName() ?? '';
912
var mediaType = mimePart.mediaType;

0 commit comments

Comments
 (0)