diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..e0d7080 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,305 @@ +#include: package:flutter_lints/flutter.yaml +include: package:very_good_analysis/analysis_options.yaml + +analyzer: + errors: + avoid_dynamic_calls: error + missing_required_param: error + missing_return: error + # allow having TODOs in the code + todo: info + missing_enum_constant_in_switch: error + invalid_use_of_protected_member: error + unused_local_variable: warning + deprecated_member_use: warning + unused_element: warning + unused_field: warning + dead_code: error + must_call_super: error + + # linter errors + unnecessary_statements: error + recursive_getters: error + unnecessary_new: error + unnecessary_getters_setters: error + use_function_type_syntax_for_parameters: error + no_duplicate_case_values: error + no_adjacent_strings_in_list: error + non_constant_identifier_names: error + constant_identifier_names: error + avoid_returning_this: error + prefer_const_constructors_in_immutables: error + prefer_const_literals_to_create_immutables: error + avoid_equals_and_hash_code_on_mutable_classes: error + camel_case_types: error + camel_case_extensions: error + library_names: error + file_names: error + library_prefixes: error + invalid_use_of_visible_for_testing_member: error + invalid_use_of_visible_for_overriding_member: error + + + # linter warnings + annotate_overrides: warning + avoid_print: warning + unnecessary_lambdas: warning + use_key_in_widget_constructors: warning + prefer_final_fields: warning + prefer_final_locals: warning + prefer_final_in_for_each: warning + prefer_const_constructors: warning + unnecessary_const: warning + unnecessary_brace_in_string_interps: warning + invalid_visibility_annotation: warning + + # linter ignores + lines_longer_than_80_chars: ignore + always_use_package_imports: ignore + avoid_setters_without_getters: ignore + sort_constructors_first: ignore + public_member_api_docs: ignore + require_trailing_commas: ignore + type_annotate_public_apis: ignore + + exclude: + - "bin/cache/**" + - "**/*.chopper.dart" + - "**/generated/**" + - "**/*.g.dart" + language: + strict-casts: true + strict-raw-types: true + +linter: + rules: + always_declare_return_types: true + always_put_control_body_on_new_line: false # Opinionated: trade-off for conciseness is acceptable here + always_put_required_named_parameters_first: true + always_specify_types: false # Conflicts with avoid_types_on_closure_parameters + always_use_package_imports: false # Conflicts with prefer_relative_imports + annotate_overrides: true + annotate_redeclares: true + avoid_annotating_with_dynamic: true + avoid_bool_literals_in_conditional_expressions: true + avoid_catches_without_on_clauses: true + avoid_catching_errors: true + avoid_classes_with_only_static_members: false # We do this a lot + avoid_double_and_int_checks: true + avoid_dynamic_calls: true + 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_final_parameters: true + avoid_function_literals_in_foreach_calls: true + avoid_futureor_void: true + avoid_implementing_value_types: true + avoid_init_to_null: true + avoid_js_rounded_ints: true + avoid_multiple_declarations_per_line: true + avoid_null_checks_in_equality_operators: true + avoid_positional_boolean_parameters: true + avoid_print: true + avoid_private_typedef_functions: true + avoid_redundant_argument_values: true + avoid_relative_lib_imports: true + avoid_renaming_method_parameters: true + avoid_return_types_on_setters: true + avoid_returning_null_for_void: true + avoid_returning_this: true + avoid_setters_without_getters: 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_types_on_closure_parameters: true + avoid_unnecessary_containers: true + avoid_unused_constructor_parameters: true + avoid_void_async: true + avoid_web_libraries_in_flutter: true + await_only_futures: true + camel_case_extensions: true + camel_case_types: true + cancel_subscriptions: true + cascade_invocations: true + cast_nullable_to_non_nullable: true + close_sinks: true + collection_methods_unrelated_type: true + combinators_ordering: true + comment_references: true + conditional_uri_does_not_exist: true + constant_identifier_names: true + control_flow_in_finally: true + curly_braces_in_flow_control_structures: true + dangling_library_doc_comments: true + depend_on_referenced_packages: true + deprecated_consistency: true + deprecated_member_use_from_same_package: true + diagnostic_describe_all_properties: false # Opinionated: a bit much for now. Better used at a package-level + directives_ordering: true + discarded_futures: false + do_not_use_environment: true + document_ignores: true + empty_catches: true + empty_constructor_bodies: true + empty_statements: true + eol_at_end_of_file: true + exhaustive_cases: true + file_names: true + flutter_style_todos: true + hash_and_equals: true + implementation_imports: true + implicit_call_tearoffs: true + implicit_reopen: true + invalid_case_patterns: true + invalid_runtime_check_with_js_interop_types: true + join_return_with_assignment: true + leading_newlines_in_multiline_strings: true + library_annotations: true + library_names: true + library_prefixes: true + library_private_types_in_public_api: true + lines_longer_than_80_chars: true + literal_only_boolean_expressions: true + matching_super_parameters: true + missing_code_block_language_in_doc_comment: true + missing_whitespace_between_adjacent_strings: true + no_adjacent_strings_in_list: true + no_default_cases: true + no_duplicate_case_values: true + no_leading_underscores_for_library_prefixes: true + no_leading_underscores_for_local_identifiers: true + no_literal_bool_comparisons: true + no_logic_in_create_state: true + no_runtimeType_toString: true + no_self_assignments: true + no_wildcard_variable_uses: true + non_constant_identifier_names: true + noop_primitive_operations: true + null_check_on_nullable_type_parameter: true + null_closures: true + omit_local_variable_types: true + omit_obvious_local_variable_types: true + omit_obvious_property_types: true + one_member_abstracts: true + only_throw_errors: true + overridden_fields: true + package_names: true + package_prefixed_library_names: true + parameter_assignments: true + prefer_adjacent_string_concatenation: true + prefer_asserts_in_initializer_lists: true + prefer_asserts_with_message: true + prefer_collection_literals: true + prefer_conditional_assignment: true + prefer_const_constructors: true + prefer_const_constructors_in_immutables: true + prefer_const_declarations: true + prefer_const_literals_to_create_immutables: true + prefer_constructors_over_static_methods: true + prefer_contains: true + prefer_double_quotes: false # Conflicts with prefer_single_quotes + prefer_expression_function_bodies: true + prefer_final_fields: true + prefer_final_in_for_each: true + prefer_final_locals: true + prefer_final_parameters: false # Conflicts with avoid_final_parameters. Covered by parameter_assignments. + 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_int_literals: 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_mixin: true + prefer_null_aware_method_calls: true + prefer_null_aware_operators: true + prefer_relative_imports: true + prefer_single_quotes: true + prefer_spread_collections: true + prefer_typing_uninitialized_variables: true + prefer_void_to_null: true + provide_deprecation_message: true + public_member_api_docs: true + recursive_getters: true + require_trailing_commas: false # Made obsolete due to the new Dart formatter in 3.7 + secure_pubspec_urls: true + sized_box_for_whitespace: true + sized_box_shrink_expand: true + slash_for_doc_comments: true + sort_child_properties_last: true + sort_constructors_first: true + sort_pub_dependencies: true + sort_unnamed_constructors_first: true + specify_nonobvious_local_variable_types: false # Conflicts with omit_local_variable_types + specify_nonobvious_property_types: false # Type inference by the plugin + IDE makes this obsolete + strict_top_level_inference: true + test_types_in_equals: true + throw_in_finally: true + tighten_type_of_initializing_formals: true + type_annotate_public_apis: false # Conflicts with omit_obvious_property_types. Type is inferred is usually correctly done + type_init_formals: true + type_literal_in_constant_pattern: true + unawaited_futures: false # Doesn't allow the use of `.unawaited` extension + unintended_html_in_doc_comment: true + unnecessary_async: true + unnecessary_await_in_return: true + unnecessary_brace_in_string_interps: true + unnecessary_breaks: true + unnecessary_const: true + unnecessary_constructor_name: true + unnecessary_final: false + unnecessary_getters_setters: true + unnecessary_lambdas: true + unnecessary_late: true + unnecessary_library_directive: true + unnecessary_library_name: true + unnecessary_new: true + unnecessary_null_aware_assignments: true + unnecessary_null_aware_operator_on_extension_on_nullable: 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_raw_strings: true + unnecessary_statements: true + unnecessary_string_escapes: true + unnecessary_string_interpolations: true + unnecessary_this: true + unnecessary_to_list_in_spreads: true + unnecessary_underscores: true + unreachable_from_main: true + unrelated_type_equality_checks: true + unsafe_variance: false # Too pedantic. Actually unsafe in only a handful of cases. + use_build_context_synchronously: true + use_colored_box: true + use_decorated_box: true + use_enums: true + use_full_hex_values_for_flutter_colors: true + use_function_type_syntax_for_parameters: true + use_if_null_to_convert_nulls_to_bools: true + use_is_even_rather_than_modulo: true + use_key_in_widget_constructors: true + use_late_for_private_fields_and_variables: true + use_named_constants: true + use_raw_strings: true + use_rethrow_when_possible: true + use_setters_to_change_properties: true + use_string_buffers: true + use_string_in_part_of_directives: true + use_super_parameters: true + use_test_throws_matchers: true + use_to_and_as_if_applicable: true + use_truncating_division: true + valid_regexps: true + void_checks: true \ No newline at end of file diff --git a/example/enough_platform_widgets_example.dart b/example/enough_platform_widgets_example.dart index bce8db1..549e664 100644 --- a/example/enough_platform_widgets_example.dart +++ b/example/enough_platform_widgets_example.dart @@ -29,14 +29,14 @@ class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) => PlatformScaffold( appBar: PlatformAppBar( - title: Text('Hello World'), + title: const Text('Hello World'), ), body: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: ListView( - children: [ + children: const [ SelectablePlatformListTile( title: Text('List Tile 1'), ), diff --git a/lib/cupertino.dart b/lib/cupertino.dart index 0fa4d3b..cf6f30e 100644 --- a/lib/cupertino.dart +++ b/lib/cupertino.dart @@ -1,4 +1,4 @@ -export 'src/cupertino/cupertino.dart'; - -export 'package:cupertino_stepper/cupertino_stepper.dart'; export 'package:cupertino_progress_bar/cupertino_progress_bar.dart'; +export 'package:cupertino_stepper/cupertino_stepper.dart'; + +export 'src/cupertino/cupertino.dart'; diff --git a/lib/enough_platform_widgets.dart b/lib/enough_platform_widgets.dart index 5df7f33..ab17261 100644 --- a/lib/enough_platform_widgets.dart +++ b/lib/enough_platform_widgets.dart @@ -1,7 +1,7 @@ library enough_platform_widgets; -export 'src/cupertino/cupertino.dart'; -export 'src/platform/platform.dart'; - export 'package:cupertino_stepper/cupertino_stepper.dart'; export 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; + +export 'src/cupertino/cupertino.dart'; +export 'src/platform/platform.dart'; diff --git a/lib/platform.dart b/lib/platform.dart index d377ee1..4136945 100644 --- a/lib/platform.dart +++ b/lib/platform.dart @@ -1,3 +1,3 @@ -export 'src/platform/platform.dart'; - export 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; + +export 'src/platform/platform.dart'; diff --git a/lib/src/cupertino/cupertino.dart b/lib/src/cupertino/cupertino.dart index cb26dbf..3cf77b9 100644 --- a/lib/src/cupertino/cupertino.dart +++ b/lib/src/cupertino/cupertino.dart @@ -1,12 +1,12 @@ -export 'cupertino_page_scaffold_with_toolbar.dart'; -export 'cupertino_toolbar.dart'; -export 'cupertino_page.dart'; -export 'cupertino_checkbox_list_tile.dart'; -export 'cupertino_radio_list_tile.dart'; export 'cupertino_bar.dart'; +export 'cupertino_checkbox_list_tile.dart'; export 'cupertino_chip.dart'; export 'cupertino_dropdown_button.dart'; -export 'cupertino_snack_app.dart'; -export 'cupertino_multiple_segmented.dart'; export 'cupertino_inkwell.dart'; +export 'cupertino_multiple_segmented.dart'; +export 'cupertino_page.dart'; +export 'cupertino_page_scaffold_with_toolbar.dart'; +export 'cupertino_radio_list_tile.dart'; export 'cupertino_search.dart'; +export 'cupertino_snack_app.dart'; +export 'cupertino_toolbar.dart'; diff --git a/lib/src/cupertino/cupertino_checkbox_list_tile.dart b/lib/src/cupertino/cupertino_checkbox_list_tile.dart index 0f7f159..c41a3d5 100644 --- a/lib/src/cupertino/cupertino_checkbox_list_tile.dart +++ b/lib/src/cupertino/cupertino_checkbox_list_tile.dart @@ -40,7 +40,7 @@ class CupertinoCheckboxListTile extends StatelessWidget { CupertinoIcons.circle, color: highlightColor, ); - final padding = contentPadding ?? EdgeInsets.all(8.0); + final padding = contentPadding ?? const EdgeInsets.all(8.0); final t = title; final st = subtitle; var content = t != null && st != null @@ -49,11 +49,7 @@ class CupertinoCheckboxListTile extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [t, st], ) - : t != null - ? t - : st != null - ? st - : Container(); + : t ?? (st ?? Container()); if (selected) { content = CupertinoTheme( data: CupertinoThemeData( diff --git a/lib/src/cupertino/cupertino_chip.dart b/lib/src/cupertino/cupertino_chip.dart index 11fbf07..a781315 100644 --- a/lib/src/cupertino/cupertino_chip.dart +++ b/lib/src/cupertino/cupertino_chip.dart @@ -34,7 +34,7 @@ class CupertinoChip extends StatelessWidget { child: Container( decoration: BoxDecoration( border: Border.all(), - borderRadius: BorderRadius.all(Radius.circular(8))), + borderRadius: const BorderRadius.all(Radius.circular(8))), child: Padding( padding: const EdgeInsets.all(4.0), child: content, diff --git a/lib/src/cupertino/cupertino_dropdown_button.dart b/lib/src/cupertino/cupertino_dropdown_button.dart index ce3167c..d880e40 100644 --- a/lib/src/cupertino/cupertino_dropdown_button.dart +++ b/lib/src/cupertino/cupertino_dropdown_button.dart @@ -63,10 +63,10 @@ class _CupertinoDropdownButtonState final currentIndex = max(items.indexWhere((item) => item.value == currentValue), 0); final child = currentValue == null - ? widget.hint ?? Icon(CupertinoIcons.arrow_down) + ? widget.hint ?? const Icon(CupertinoIcons.arrow_down) : children[currentIndex]; return CupertinoButton( - padding: EdgeInsets.all(8.0), + padding: const EdgeInsets.all(8.0), child: FittedBox(child: child), onPressed: () async { widget.onTap?.call(); diff --git a/lib/src/cupertino/cupertino_multiple_segmented.dart b/lib/src/cupertino/cupertino_multiple_segmented.dart index df900fa..550a176 100644 --- a/lib/src/cupertino/cupertino_multiple_segmented.dart +++ b/lib/src/cupertino/cupertino_multiple_segmented.dart @@ -79,7 +79,7 @@ class CupertinoMultipleSegmentedControl extends StatefulWidget { /// If no [groupValue] is provided, or the [groupValue] is null, no widget will /// appear as selected. The [groupValue] must be either null or one of the keys /// in the [children] map. - CupertinoMultipleSegmentedControl({ + const CupertinoMultipleSegmentedControl({ Key? key, required this.children, required this.isSelected, @@ -361,7 +361,7 @@ class _SegmentedControlState extends State final List _gestureChildren = []; final List _backgroundColors = []; //int? selectedIndex; - int? pressedIndex = _pressedKey; + final int? pressedIndex = _pressedKey; for (var i = 0; i < widget.children.length; i++) { final selected = widget.isSelected[i]; @@ -417,7 +417,7 @@ class _SegmentedControlState extends State } class _SegmentedControlRenderWidget extends MultiChildRenderObjectWidget { - _SegmentedControlRenderWidget({ + const _SegmentedControlRenderWidget({ Key? key, List children = const [], required this.isSelected, diff --git a/lib/src/cupertino/cupertino_radio_list_tile.dart b/lib/src/cupertino/cupertino_radio_list_tile.dart index 6712d59..87ec1f6 100644 --- a/lib/src/cupertino/cupertino_radio_list_tile.dart +++ b/lib/src/cupertino/cupertino_radio_list_tile.dart @@ -33,20 +33,16 @@ class CupertinoRadioListTile extends StatelessWidget { final highlightColor = (onChanged != null) ? (activeColor ?? theme.primaryColor) : (theme.barBackgroundColor); - final padding = contentPadding ?? EdgeInsets.all(8.0); + final padding = contentPadding ?? const EdgeInsets.all(8.0); final t = title; final st = subtitle; - var content = t != null && st != null + final content = t != null && st != null ? Column( mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [t, st], ) - : t != null - ? t - : st != null - ? st - : Container(); + : t ?? (st ?? Container()); return GestureDetector( child: Row( mainAxisAlignment: MainAxisAlignment.start, @@ -64,7 +60,7 @@ class CupertinoRadioListTile extends StatelessWidget { child: Padding( padding: padding, child: CupertinoTheme( - data: CupertinoThemeData( + data: const CupertinoThemeData( textTheme: CupertinoTextThemeData( primaryColor: CupertinoColors.label, // textStyle: TextStyle(color: CupertinoColors.label), diff --git a/lib/src/cupertino/cupertino_search.dart b/lib/src/cupertino/cupertino_search.dart index e66d45f..5e2e387 100644 --- a/lib/src/cupertino/cupertino_search.dart +++ b/lib/src/cupertino/cupertino_search.dart @@ -155,8 +155,8 @@ class _CupertinoSearchPage extends StatelessWidget { color: CupertinoColors.secondaryLabel), suffix: CupertinoButton( minSize: 10, - padding: EdgeInsetsDirectional.fromSTEB(0, 0, 5, 2), - child: Icon( + padding: const EdgeInsetsDirectional.fromSTEB(0, 0, 5, 2), + child: const Icon( CupertinoIcons.xmark_circle_fill, size: iconSize, color: CupertinoColors.secondaryLabel, diff --git a/lib/src/platform/decorated_platform_textfield.dart b/lib/src/platform/decorated_platform_textfield.dart index 7d13e53..fb4e323 100644 --- a/lib/src/platform/decorated_platform_textfield.dart +++ b/lib/src/platform/decorated_platform_textfield.dart @@ -293,14 +293,14 @@ class DecoratedPlatformTextField extends StatelessWidget { /// widget. /// /// If [mouseCursor] is a [MaterialStateProperty], - /// [MaterialStateProperty.resolve] is used for the following [MaterialState]s: + /// [WidgetStateProperty.resolve] is used for the following [WidgetState]s: /// - /// * [MaterialState.error]. - /// * [MaterialState.hovered]. - /// * [MaterialState.focused]. - /// * [MaterialState.disabled]. + /// * [WidgetState.error]. + /// * [WidgetState.hovered]. + /// * [WidgetState.focused]. + /// * [WidgetState.disabled]. /// - /// If this property is null, [MaterialStateMouseCursor.textable] will be used. + /// If this property is null, [WidgetStateMouseCursor.textable] will be used. /// /// The [mouseCursor] is the only property of [TextField] that controls the /// appearance of the mouse pointer. All other properties related to "cursor" @@ -558,7 +558,7 @@ class DecoratedPlatformTextField extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, children: [ Padding( - padding: EdgeInsets.only(right: 8.0), + padding: const EdgeInsets.only(right: 8.0), child: icon, ), Expanded(child: content), @@ -566,7 +566,7 @@ class DecoratedPlatformTextField extends StatelessWidget { ); } content = Padding( - padding: EdgeInsets.symmetric(vertical: 4.0), + padding: const EdgeInsets.symmetric(vertical: 4.0), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, @@ -576,7 +576,7 @@ class DecoratedPlatformTextField extends StatelessWidget { style: decoration?.labelStyle, ), Padding( - padding: EdgeInsets.only(top: 4.0), + padding: const EdgeInsets.only(top: 4.0), child: content, ), ], @@ -584,13 +584,13 @@ class DecoratedPlatformTextField extends StatelessWidget { ); } else if (cupertinoShowLabel && (labelText != null || icon != null)) { content = Padding( - padding: EdgeInsets.symmetric(vertical: 4.0), + padding: const EdgeInsets.symmetric(vertical: 4.0), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ if (labelText != null) ...{ Padding( - padding: EdgeInsets.only(right: 8.0), + padding: const EdgeInsets.only(right: 8.0), child: Text( labelText, style: decoration?.labelStyle, @@ -599,7 +599,7 @@ class DecoratedPlatformTextField extends StatelessWidget { }, if (icon != null) ...{ Padding( - padding: EdgeInsets.only(right: 8.0), + padding: const EdgeInsets.only(right: 8.0), child: icon, ), }, @@ -609,7 +609,7 @@ class DecoratedPlatformTextField extends StatelessWidget { ); } else { content = Padding( - padding: EdgeInsets.symmetric(vertical: 4.0), + padding: const EdgeInsets.symmetric(vertical: 4.0), child: content, ); } diff --git a/lib/src/platform/dialog_helper.dart b/lib/src/platform/dialog_helper.dart index fe5ca18..485e095 100644 --- a/lib/src/platform/dialog_helper.dart +++ b/lib/src/platform/dialog_helper.dart @@ -31,7 +31,7 @@ class DialogHelper { CupertinoDialogAction( child: cancelActionText != null ? Text(cancelActionText) - : Icon(CupertinoIcons.clear), + : const Icon(CupertinoIcons.clear), onPressed: () => Navigator.of(context).pop(false), ), CupertinoDialogAction( @@ -65,7 +65,7 @@ class DialogHelper { TextButton( child: cancelActionText != null ? PlatformText(cancelActionText) - : Icon(Icons.cancel), + : const Icon(Icons.cancel), onPressed: () => Navigator.of(context).pop(false), ), TextButton( diff --git a/lib/src/platform/platform.dart b/lib/src/platform/platform.dart index 8f3608c..11a72b9 100644 --- a/lib/src/platform/platform.dart +++ b/lib/src/platform/platform.dart @@ -1,26 +1,26 @@ -export 'platform_info.dart'; -export 'platform_chip.dart'; -export 'platform_popup_button.dart'; -export 'platform_stepper.dart'; -export 'platform_toolbar.dart'; -export 'platform_page_scaffold.dart'; -export 'platform_checkbox_list_tile.dart'; -export 'platform_radio_list_tile.dart'; export 'decorated_platform_textfield.dart'; -export 'platform_sliver_appbar.dart'; -export 'platform_drawer.dart'; +export 'dialog_helper.dart'; export 'platform_bottom_bar.dart'; -export 'platform_progress_indicator.dart'; -export 'platform_text_button_icon.dart'; +export 'platform_checkbox_list_tile.dart'; +export 'platform_chip.dart'; export 'platform_dialog_action_button.dart'; export 'platform_dialog_action_text.dart'; +export 'platform_drawer.dart'; export 'platform_dropdown_button.dart'; -export 'platform_time_picker.dart'; -export 'platform_snack_app.dart'; -export 'platform_icon_button.dart'; export 'platform_filled_button_icon.dart'; -export 'dialog_helper.dart'; +export 'platform_icon_button.dart'; export 'platform_icons.dart'; -export 'platform_toggle_buttons.dart'; +export 'platform_info.dart'; export 'platform_inkwell.dart'; +export 'platform_page_scaffold.dart'; +export 'platform_popup_button.dart'; +export 'platform_progress_indicator.dart'; +export 'platform_radio_list_tile.dart'; +export 'platform_sliver_appbar.dart'; +export 'platform_snack_app.dart'; +export 'platform_stepper.dart'; +export 'platform_text_button_icon.dart'; +export 'platform_time_picker.dart'; +export 'platform_toggle_buttons.dart'; +export 'platform_toolbar.dart'; export 'selectable_platform_list_tile.dart'; diff --git a/lib/src/platform/platform_filled_button_icon.dart b/lib/src/platform/platform_filled_button_icon.dart index 27bc049..29848b2 100644 --- a/lib/src/platform/platform_filled_button_icon.dart +++ b/lib/src/platform/platform_filled_button_icon.dart @@ -47,13 +47,13 @@ class PlatformFilledButtonIcon extends StatelessWidget { autofocus: autofocus, ), cupertino: (context, platform) => CupertinoButton.filled( - padding: EdgeInsets.all(8.0), + padding: const EdgeInsets.all(8.0), key: widgetKey, child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Padding( - padding: EdgeInsets.only(right: 8.0), + padding: const EdgeInsets.only(right: 8.0), child: icon, ), Expanded(child: label), diff --git a/lib/src/platform/platform_info.dart b/lib/src/platform/platform_info.dart index b1d0332..818204a 100644 --- a/lib/src/platform/platform_info.dart +++ b/lib/src/platform/platform_info.dart @@ -4,6 +4,6 @@ import 'package:flutter/foundation.dart'; class PlatformInfo { /// Checks if the app is currently running on iOS or macOS static final bool isCupertino = - (defaultTargetPlatform == TargetPlatform.iOS || - defaultTargetPlatform == TargetPlatform.macOS); + defaultTargetPlatform == TargetPlatform.iOS || + defaultTargetPlatform == TargetPlatform.macOS; } diff --git a/lib/src/platform/platform_inkwell.dart b/lib/src/platform/platform_inkwell.dart index b3ffd9e..def50d9 100644 --- a/lib/src/platform/platform_inkwell.dart +++ b/lib/src/platform/platform_inkwell.dart @@ -80,13 +80,13 @@ class PlatformInkWell extends StatelessWidget { /// widget. /// /// If [mouseCursor] is a [MaterialStateProperty], - /// [MaterialStateProperty.resolve] is used for the following [MaterialState]s: + /// [WidgetStateProperty.resolve] is used for the following [WidgetState]s: /// - /// * [MaterialState.hovered]. - /// * [MaterialState.focused]. - /// * [MaterialState.disabled]. + /// * [WidgetState.hovered]. + /// * [WidgetState.focused]. + /// * [WidgetState.disabled]. /// - /// If this property is null, [MaterialStateMouseCursor.clickable] will be used. + /// If this property is null, [WidgetStateMouseCursor.clickable] will be used. final MouseCursor? mouseCursor; /// Whether this ink response should be clipped its bounds. @@ -205,12 +205,12 @@ class PlatformInkWell extends StatelessWidget { /// /// This default null property can be used as an alternative to /// [focusColor], [hoverColor], and [splashColor]. If non-null, - /// it is resolved against one of [MaterialState.focused], - /// [MaterialState.hovered], and [MaterialState.pressed]. It's + /// it is resolved against one of [WidgetState.focused], + /// [WidgetState.hovered], and [WidgetState.pressed]. It's /// convenient to use when the parent widget can pass along its own /// MaterialStateProperty value for the overlay color. /// - /// [MaterialState.pressed] triggers a ripple (an ink splash), per + /// [WidgetState.pressed] triggers a ripple (an ink splash), per /// the current Material Design spec. The [overlayColor] doesn't map /// a state to [highlightColor] because a separate highlight is not /// used by the current design guidelines. See @@ -224,7 +224,7 @@ class PlatformInkWell extends StatelessWidget { /// * The Material Design specification for overlay colors and how they /// match a component's state: /// . - final MaterialStateProperty? overlayColor; + final WidgetStateProperty? overlayColor; /// The splash color of the ink response. If this property is null then the /// splash color of the theme, [ThemeData.splashColor], will be used. diff --git a/lib/src/platform/platform_popup_button.dart b/lib/src/platform/platform_popup_button.dart index 718674d..befb27f 100644 --- a/lib/src/platform/platform_popup_button.dart +++ b/lib/src/platform/platform_popup_button.dart @@ -13,7 +13,7 @@ class PlatformPopupMenuButton extends StatelessWidget { final Widget? icon; final EdgeInsets? cupertinoButtonPadding; - PlatformPopupMenuButton({ + const PlatformPopupMenuButton({ Key? key, this.child, required this.itemBuilder, @@ -58,13 +58,13 @@ class PlatformPopupMenuButton extends StatelessWidget { }, cupertino: (context, platform) => CupertinoButton( padding: cupertinoButtonPadding, - child: icon ?? child ?? Icon(CupertinoIcons.ellipsis_circle), + child: icon ?? child ?? const Icon(CupertinoIcons.ellipsis_circle), onPressed: () => _showActionSheet(context), ), ); } - void _showActionSheet(BuildContext context) async { + Future _showActionSheet(BuildContext context) async { final localizations = MaterialLocalizations.of(context); final cancelLabel = _toCamelCase(localizations.cancelButtonLabel); final value = await showCupertinoModalPopup( @@ -102,7 +102,7 @@ class PlatformPopupMenuButton extends StatelessWidget { }, ); } - return Divider(); + return const Divider(); } PopupMenuEntry _toMaterialEntry( @@ -113,7 +113,7 @@ class PlatformPopupMenuButton extends StatelessWidget { child: entry.child, ); } - return PopupMenuDivider(); + return const PopupMenuDivider(); } } diff --git a/lib/src/platform/platform_progress_indicator.dart b/lib/src/platform/platform_progress_indicator.dart index 16d84c6..ada7de2 100644 --- a/lib/src/platform/platform_progress_indicator.dart +++ b/lib/src/platform/platform_progress_indicator.dart @@ -23,7 +23,7 @@ class PlatformProgressIndicator extends StatelessWidget { return PlatformWidget( material: (context, platform) => CircularProgressIndicator(value: v), cupertino: (context, platform) => (v == null) - ? CupertinoActivityIndicator() + ? const CupertinoActivityIndicator() : CupertinoProgressBar(value: v)); } } diff --git a/lib/src/platform/platform_snack_app.dart b/lib/src/platform/platform_snack_app.dart index 127e199..20da5cc 100644 --- a/lib/src/platform/platform_snack_app.dart +++ b/lib/src/platform/platform_snack_app.dart @@ -51,7 +51,7 @@ class PlatformSnackApp extends StatelessWidget { routeInformationParser = null, routerDelegate = null; - PlatformSnackApp.router({ + const PlatformSnackApp.router({ super.key, this.widgetKey, this.backButtonDispatcher, diff --git a/lib/src/platform/platform_text_button_icon.dart b/lib/src/platform/platform_text_button_icon.dart index 8f5bf48..9a8e756 100644 --- a/lib/src/platform/platform_text_button_icon.dart +++ b/lib/src/platform/platform_text_button_icon.dart @@ -48,13 +48,13 @@ class PlatformTextButtonIcon extends StatelessWidget { ), cupertino: (context, platform) => CupertinoButton( color: backgroundColor, - padding: EdgeInsets.all(8.0), + padding: const EdgeInsets.all(8.0), key: widgetKey, child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Padding( - padding: EdgeInsets.only(right: 8.0), + padding: const EdgeInsets.only(right: 8.0), child: icon, ), Expanded( diff --git a/lib/src/platform/platform_time_picker.dart b/lib/src/platform/platform_time_picker.dart index cb6a7c8..7c66ecc 100644 --- a/lib/src/platform/platform_time_picker.dart +++ b/lib/src/platform/platform_time_picker.dart @@ -36,12 +36,12 @@ Future showPlatformTimePicker({ CupertinoButton( child: (cancelText != null) ? Text(cancelText) - : Icon(CupertinoIcons.clear_circled), + : const Icon(CupertinoIcons.clear_circled), onPressed: () => Navigator.of(context).pop(false)), CupertinoButton( child: (confirmText != null) ? Text(confirmText) - : Icon(CupertinoIcons.check_mark_circled), + : const Icon(CupertinoIcons.check_mark_circled), onPressed: () => Navigator.of(context).pop(true)), ], ), @@ -120,12 +120,12 @@ Future showPlatformSpecificDatePicker({ CupertinoButton( child: (cancelText != null) ? Text(cancelText) - : Icon(CupertinoIcons.clear_circled), + : const Icon(CupertinoIcons.clear_circled), onPressed: () => Navigator.of(context).pop(false)), CupertinoButton( child: (confirmText != null) ? Text(confirmText) - : Icon(CupertinoIcons.check_mark_circled), + : const Icon(CupertinoIcons.check_mark_circled), onPressed: () => Navigator.of(context).pop(true)), ], ), diff --git a/pubspec.yaml b/pubspec.yaml index a91fc73..b90d09f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,8 +8,8 @@ topics: - widgets environment: - sdk: ">=2.17.0 <4.0.0" - flutter: ">=3.16.0" + sdk: ">=3.0.0 <4.0.0" + flutter: ">=3.16.0 <4.0.0" dependencies: cupertino_stepper: ^0.2.1 @@ -21,5 +21,6 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + very_good_analysis: ^7.0.0 flutter: