From 5283d0fcc857880756d84937fa28b7f1d1c744cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 20 Feb 2026 14:03:46 +0100 Subject: [PATCH] refactor: Add more stricter lints --- analysis_options.yaml | 9 ++++- lib/config/isrg_x1.dart | 4 +- lib/pages/chat/command_hints.dart | 38 +++++++++---------- lib/pages/chat/events/html_message.dart | 5 +-- lib/pages/chat_list/chat_list_item.dart | 6 +-- .../chat_search/chat_search_files_tab.dart | 6 +-- lib/pages/login/login.dart | 2 +- .../settings_emotes/settings_emotes.dart | 6 +-- .../push_rule_extensions.dart | 2 +- .../sign_in/view_model/flows/sso_login.dart | 2 +- lib/utils/background_push.dart | 8 ++-- lib/utils/error_reporter.dart | 10 ++--- lib/utils/voip_plugin.dart | 2 +- .../local_notifications_extension.dart | 2 +- pubspec.lock | 24 ++++++------ 15 files changed, 66 insertions(+), 60 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 75a06f44d..36171e35e 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -2,7 +2,6 @@ include: package:flutter_lints/flutter.yaml linter: rules: - - camel_case_types - avoid_print - constant_identifier_names - prefer_final_locals @@ -10,6 +9,14 @@ linter: - sort_pub_dependencies - require_trailing_commas - omit_local_variable_types + - cancel_subscriptions + - always_declare_return_types + - no_adjacent_strings_in_list + - test_types_in_equals + - throw_in_finally + - unnecessary_statements + - avoid_bool_literals_in_conditional_expressions + - prefer_single_quotes analyzer: plugins: diff --git a/lib/config/isrg_x1.dart b/lib/config/isrg_x1.dart index 6a6d0ac2d..c7b503231 100644 --- a/lib/config/isrg_x1.dart +++ b/lib/config/isrg_x1.dart @@ -1,5 +1,5 @@ // ignore: constant_identifier_names -const String ISRG_X1 = """-----BEGIN CERTIFICATE----- +const String ISRG_X1 = '''-----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 @@ -29,4 +29,4 @@ oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE-----"""; +-----END CERTIFICATE-----'''; diff --git a/lib/pages/chat/command_hints.dart b/lib/pages/chat/command_hints.dart index 212bdf4d4..75bc14003 100644 --- a/lib/pages/chat/command_hints.dart +++ b/lib/pages/chat/command_hints.dart @@ -26,41 +26,41 @@ String commandExample(String command) { String commandHint(L10n l10n, String command) { switch (command) { - case "ban": + case 'ban': return l10n.commandHint_ban; - case "clearcache": + case 'clearcache': return l10n.commandHint_clearcache; - case "create": + case 'create': return l10n.commandHint_create; - case "discardsession": + case 'discardsession': return l10n.commandHint_discardsession; - case "dm": + case 'dm': return l10n.commandHint_dm; - case "html": + case 'html': return l10n.commandHint_html; - case "invite": + case 'invite': return l10n.commandHint_invite; - case "join": + case 'join': return l10n.commandHint_join; - case "kick": + case 'kick': return l10n.commandHint_kick; - case "leave": + case 'leave': return l10n.commandHint_leave; - case "me": + case 'me': return l10n.commandHint_me; - case "myroomavatar": + case 'myroomavatar': return l10n.commandHint_myroomavatar; - case "myroomnick": + case 'myroomnick': return l10n.commandHint_myroomnick; - case "op": + case 'op': return l10n.commandHint_op; - case "plain": + case 'plain': return l10n.commandHint_plain; - case "react": + case 'react': return l10n.commandHint_react; - case "send": + case 'send': return l10n.commandHint_send; - case "unban": + case 'unban': return l10n.commandHint_unban; case 'markasdm': return l10n.commandHint_markasdm; @@ -85,6 +85,6 @@ String commandHint(L10n l10n, String command) { case 'logoutall': return l10n.commandHint_logoutall; default: - return ""; + return ''; } } diff --git a/lib/pages/chat/events/html_message.dart b/lib/pages/chat/events/html_message.dart index 668a16ae9..906c6c242 100644 --- a/lib/pages/chat/events/html_message.dart +++ b/lib/pages/chat/events/html_message.dart @@ -253,9 +253,8 @@ class HtmlMessage extends StatelessWidget { : checkboxCheckedEvents?.firstWhereOrNull( (event) => event.checkedCheckboxId == checkboxIndex, ); - final staticallyChecked = !isCheckbox - ? false - : node.children.first.attributes['checked'] == 'true'; + final staticallyChecked = + isCheckbox && node.children.first.attributes['checked'] == 'true'; return WidgetSpan( child: Padding( diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index 10f07a80b..b30828127 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -56,9 +56,9 @@ class ChatListItem extends StatelessWidget { return const SizedBox.shrink(); } - final needLastEventSender = lastEvent == null - ? false - : room.getState(EventTypes.RoomMember, lastEvent.senderId) == null; + final needLastEventSender = + lastEvent != null && + room.getState(EventTypes.RoomMember, lastEvent.senderId) == null; final space = this.space; return Padding( diff --git a/lib/pages/chat_search/chat_search_files_tab.dart b/lib/pages/chat_search/chat_search_files_tab.dart index 8c5bdc60b..4aa95225d 100644 --- a/lib/pages/chat_search/chat_search_files_tab.dart +++ b/lib/pages/chat_search/chat_search_files_tab.dart @@ -55,9 +55,9 @@ class ChatSearchFilesTab extends StatelessWidget { 'UNKNOWN'); final sizeString = event.sizeString; final prevEvent = i > 0 ? events[i - 1] : null; - final sameEnvironment = prevEvent == null - ? false - : prevEvent.originServerTs.sameEnvironment(event.originServerTs); + final sameEnvironment = + prevEvent != null && + prevEvent.originServerTs.sameEnvironment(event.originServerTs); return Padding( padding: const EdgeInsets.all(8.0), child: Column( diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index cb2a45d6d..fdc2f7cad 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -207,7 +207,7 @@ class LoginController extends State { final data = { 'new_password': password, 'logout_devices': false, - "auth": AuthenticationThreePidCreds( + 'auth': AuthenticationThreePidCreds( type: AuthenticationTypes.emailIdentity, threepidCreds: ThreepidCreds( sid: response.result!.sid, diff --git a/lib/pages/settings_emotes/settings_emotes.dart b/lib/pages/settings_emotes/settings_emotes.dart index 0672f1633..c2f68a15a 100644 --- a/lib/pages/settings_emotes/settings_emotes.dart +++ b/lib/pages/settings_emotes/settings_emotes.dart @@ -234,9 +234,9 @@ class EmotesSettingsController extends State { ?.tryGetMap(stateKey ?? '') != null; - bool get readonly => room == null - ? false - : room?.canChangeStateEvent('im.ponies.room_emotes') == false; + bool get readonly => + room != null && + room?.canChangeStateEvent('im.ponies.room_emotes') == false; void resetAction() { setState(() { diff --git a/lib/pages/settings_notifications/push_rule_extensions.dart b/lib/pages/settings_notifications/push_rule_extensions.dart index 4cf53a92c..103fbc10f 100644 --- a/lib/pages/settings_notifications/push_rule_extensions.dart +++ b/lib/pages/settings_notifications/push_rule_extensions.dart @@ -117,6 +117,6 @@ extension PushRuleKindLocal on PushRuleKind { extension on String { String capitalize() { - return "${this[0].toUpperCase()}${substring(1).toLowerCase()}"; + return '${this[0].toUpperCase()}${substring(1).toLowerCase()}'; } } diff --git a/lib/pages/sign_in/view_model/flows/sso_login.dart b/lib/pages/sign_in/view_model/flows/sso_login.dart index 830693ef0..5eb5c3ccb 100644 --- a/lib/pages/sign_in/view_model/flows/sso_login.dart +++ b/lib/pages/sign_in/view_model/flows/sso_login.dart @@ -32,7 +32,7 @@ Future ssoLoginFlow( final urlScheme = (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS) ? Uri.parse(redirectUrl).scheme - : "http://localhost:3001"; + : 'http://localhost:3001'; final result = await FlutterWebAuth2.authenticate( url: url.toString(), callbackUrlScheme: urlScheme, diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index 776af7828..bec7d5ef5 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -231,7 +231,7 @@ class BackgroundPush { currentPushers.first.data.format == AppSettings.pushNotificationsPusherFormat.value && mapEquals(currentPushers.single.data.additionalProperties, { - "data_message": pusherDataMessageFormat, + 'data_message': pusherDataMessageFormat, })) { Logs().i('[Push] Pusher already set'); } else { @@ -269,7 +269,7 @@ class BackgroundPush { data: PusherData( url: Uri.parse(gatewayUrl!), format: AppSettings.pushNotificationsPusherFormat.value, - additionalProperties: {"data_message": pusherDataMessageFormat}, + additionalProperties: {'data_message': pusherDataMessageFormat}, ), kind: 'http', ), @@ -290,7 +290,7 @@ class BackgroundPush { static bool _wentToRoomOnStartup = false; Future setupPush() async { - Logs().d("SetupPush"); + Logs().d('SetupPush'); if (client.onLoginStateChanged.value != LoginState.loggedIn || !PlatformInfos.isMobile || matrix == null) { @@ -371,7 +371,7 @@ class BackgroundPush { Future setupUp() async { await UnifiedPushUi( context: matrix!.context, - instances: ["default"], + instances: ['default'], unifiedPushFunctions: UPFunctions(), showNoDistribDialog: false, onNoDistribDialogDismissed: () {}, // TODO: Implement me diff --git a/lib/utils/error_reporter.dart b/lib/utils/error_reporter.dart index c0ed2a3e7..514d8162b 100644 --- a/lib/utils/error_reporter.dart +++ b/lib/utils/error_reporter.dart @@ -15,11 +15,11 @@ class ErrorReporter { const ErrorReporter(this.context, [this.message]); static const Set ingoredTypes = { - "IOException", - "ClientException", - "SocketException", - "TlsException", - "HandshakeException", + 'IOException', + 'ClientException', + 'SocketException', + 'TlsException', + 'HandshakeException', }; void onErrorCallback(Object error, [StackTrace? stackTrace]) { diff --git a/lib/utils/voip_plugin.dart b/lib/utils/voip_plugin.dart index 62e729baa..27c5d103b 100644 --- a/lib/utils/voip_plugin.dart +++ b/lib/utils/voip_plugin.dart @@ -141,7 +141,7 @@ class VoipPlugin with WidgetsBindingObserver implements WebRTCDelegate { FlutterForegroundTask.setOnLockScreenVisibility(false); FlutterForegroundTask.stopService(); final wasForeground = matrix.store.getString('wasForeground'); - wasForeground == 'false' ? FlutterForegroundTask.minimizeApp() : null; + if (wasForeground == 'false') FlutterForegroundTask.minimizeApp(); } } } diff --git a/lib/widgets/local_notifications_extension.dart b/lib/widgets/local_notifications_extension.dart index f650d95cf..c2dcb7bc7 100644 --- a/lib/widgets/local_notifications_extension.dart +++ b/lib/widgets/local_notifications_extension.dart @@ -135,7 +135,7 @@ extension LocalNotificationsExtension on MatrixState { var action = DesktopNotificationActions.values.singleWhereOrNull( (a) => a.name == actionStr, ); - if (action == null && actionStr == "default") { + if (action == null && actionStr == 'default') { action = DesktopNotificationActions.openChat; } switch (action!) { diff --git a/pubspec.lock b/pubspec.lock index f18e1f455..e78f876fa 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: transitive description: name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.0" charcode: dependency: transitive description: @@ -1112,18 +1112,18 @@ packages: dependency: transitive description: name: matcher - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.18" + version: "0.12.17" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.13.0" + version: "0.11.1" matrix: dependency: "direct main" description: @@ -1869,26 +1869,26 @@ packages: dependency: transitive description: name: test - sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" + sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" url: "https://pub.dev" source: hosted - version: "1.29.0" + version: "1.26.3" test_api: dependency: transitive description: name: test_api - sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.9" + version: "0.7.7" test_core: dependency: transitive description: name: test_core - sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" + sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" url: "https://pub.dev" source: hosted - version: "0.6.15" + version: "0.6.12" timezone: dependency: transitive description: