From 9d007815df25100cdd0623dd8c48d2c4fd2ad6cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 19 Feb 2026 08:42:35 +0100 Subject: [PATCH] refactor: Enable rule avoid dynamic --- analysis_options.yaml | 6 +++++ lib/pages/chat/chat.dart | 10 ++++---- lib/pages/chat/events/audio_player.dart | 6 ++--- .../chat/events/message_download_content.dart | 2 +- lib/pages/chat/events/message_reactions.dart | 2 +- lib/pages/chat/start_poll_bottom_sheet.dart | 2 +- .../chat_encryption_settings.dart | 2 +- lib/pages/chat_members/chat_members.dart | 4 ++-- .../chat_search/chat_search_files_tab.dart | 2 +- lib/pages/dialer/pip/pip_view.dart | 4 ++-- lib/pages/image_viewer/video_player.dart | 2 +- lib/pages/new_group/new_group.dart | 2 +- lib/pages/settings/settings.dart | 2 +- .../event_extension.dart | 2 +- lib/widgets/app_lock.dart | 2 +- lib/widgets/theme_builder.dart | 2 +- pubspec.lock | 24 +++++++++---------- 17 files changed, 41 insertions(+), 35 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 835b6a611..ef627c7f8 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -12,8 +12,14 @@ linter: - omit_local_variable_types analyzer: + plugins: + - dart_code_linter errors: todo: ignore use_build_context_synchronously: ignore exclude: - lib/l10n/*.dart + +dart_code_linter: + rules: + - avoid-dynamic \ No newline at end of file diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index bbd4b25a2..f4c2a34d1 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -117,9 +117,9 @@ class ChatController extends State bool currentlyTyping = false; bool dragging = false; - void onDragEntered(dynamic _) => setState(() => dragging = true); + void onDragEntered(_) => setState(() => dragging = true); - void onDragExited(dynamic _) => setState(() => dragging = false); + void onDragExited(_) => setState(() => dragging = false); void onDragDone(DropDoneDetails details) async { setState(() => dragging = false); @@ -213,7 +213,7 @@ class ChatController extends State context.go('/rooms'); } - void requestHistory([dynamic _]) async { + void requestHistory([_]) async { Logs().v('Requesting history...'); await timeline?.requestHistory(historyCount: _loadHistoryCount); } @@ -265,7 +265,7 @@ class ChatController extends State } } - void _shareItems([dynamic _]) { + void _shareItems([_]) { final shareItems = widget.shareItems; if (shareItems == null || shareItems.isEmpty) return; if (!room.otherPartyCanReceiveMessages) { @@ -1053,7 +1053,7 @@ class ChatController extends State scrollController.jumpTo(0); } - void onEmojiSelected(dynamic _, Emoji? emoji) { + void onEmojiSelected(_, Emoji? emoji) { typeEmoji(emoji); onInputBarChanged(sendController.text); } diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index 16b0af24c..fd631cbc1 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -151,7 +151,7 @@ class AudioPlayerState extends State { setState(() => status = AudioPlayerStatus.downloading); try { final fileSize = widget.event.content - .tryGetMap('info') + .tryGetMap('info') ?.tryGet('size'); matrixFile = await widget.event.downloadAndDecryptAttachment( onDownloadProgress: fileSize != null && fileSize > 0 @@ -242,7 +242,7 @@ class AudioPlayerState extends State { List? _getWaveform() { final eventWaveForm = widget.event.content - .tryGetMap('org.matrix.msc1767.audio') + .tryGetMap('org.matrix.msc1767.audio') ?.tryGetList('waveform'); if (eventWaveForm == null || eventWaveForm.isEmpty) { return null; @@ -275,7 +275,7 @@ class AudioPlayerState extends State { } final durationInt = widget.event.content - .tryGetMap('info') + .tryGetMap('info') ?.tryGet('duration'); if (durationInt != null) { final duration = Duration(milliseconds: durationInt); diff --git a/lib/pages/chat/events/message_download_content.dart b/lib/pages/chat/events/message_download_content.dart index 46d5167ca..501c02433 100644 --- a/lib/pages/chat/events/message_download_content.dart +++ b/lib/pages/chat/events/message_download_content.dart @@ -27,7 +27,7 @@ class MessageDownloadContent extends StatelessWidget { final filetype = (filename.contains('.') ? filename.split('.').last.toUpperCase() : event.content - .tryGetMap('info') + .tryGetMap('info') ?.tryGet('mimetype') ?.toUpperCase() ?? 'UNKNOWN'); diff --git a/lib/pages/chat/events/message_reactions.dart b/lib/pages/chat/events/message_reactions.dart index 5f5b4aa2b..86d8ade6a 100644 --- a/lib/pages/chat/events/message_reactions.dart +++ b/lib/pages/chat/events/message_reactions.dart @@ -26,7 +26,7 @@ class MessageReactions extends StatelessWidget { for (final e in allReactionEvents) { final key = e.content - .tryGetMap('m.relates_to') + .tryGetMap('m.relates_to') ?.tryGet('key'); if (key != null) { if (!reactionMap.containsKey(key)) { diff --git a/lib/pages/chat/start_poll_bottom_sheet.dart b/lib/pages/chat/start_poll_bottom_sheet.dart index b90dc473b..25e18ad44 100644 --- a/lib/pages/chat/start_poll_bottom_sheet.dart +++ b/lib/pages/chat/start_poll_bottom_sheet.dart @@ -56,7 +56,7 @@ class _StartPollBottomSheetState extends State { } } - void _updateCanCreate([dynamic _]) { + void _updateCanCreate([_]) { final newCanCreate = _bodyController.text.trim().isNotEmpty && !_answers.any((controller) => controller.text.trim().isEmpty); diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart index 6996d58d4..704f33641 100644 --- a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart @@ -30,7 +30,7 @@ class ChatEncryptionSettingsController extends State { } } - void enableEncryption(dynamic _) async { + void enableEncryption(_) async { if (room.encrypted) { showOkAlertDialog( context: context, diff --git a/lib/pages/chat_members/chat_members.dart b/lib/pages/chat_members/chat_members.dart index 21cbc5258..e4ce1a5ab 100644 --- a/lib/pages/chat_members/chat_members.dart +++ b/lib/pages/chat_members/chat_members.dart @@ -29,7 +29,7 @@ class ChatMembersController extends State { setFilter(); } - void setFilter([dynamic _]) async { + void setFilter([_]) async { final filter = filterController.text.toLowerCase().trim(); final members = this.members @@ -56,7 +56,7 @@ class ChatMembersController extends State { }); } - void refreshMembers([dynamic _]) async { + void refreshMembers([_]) async { Logs().d('Load room members from', widget.roomId); try { setState(() { diff --git a/lib/pages/chat_search/chat_search_files_tab.dart b/lib/pages/chat_search/chat_search_files_tab.dart index 24d27cece..8c5bdc60b 100644 --- a/lib/pages/chat_search/chat_search_files_tab.dart +++ b/lib/pages/chat_search/chat_search_files_tab.dart @@ -49,7 +49,7 @@ class ChatSearchFilesTab extends StatelessWidget { final filetype = (filename.contains('.') ? filename.split('.').last.toUpperCase() : event.content - .tryGetMap('info') + .tryGetMap('info') ?.tryGet('mimetype') ?.toUpperCase() ?? 'UNKNOWN'); diff --git a/lib/pages/dialer/pip/pip_view.dart b/lib/pages/dialer/pip/pip_view.dart index 1cf1e5ecc..804ee8371 100644 --- a/lib/pages/dialer/pip/pip_view.dart +++ b/lib/pages/dialer/pip/pip_view.dart @@ -105,7 +105,7 @@ class PIPViewState extends State with TickerProviderStateMixin { }); } - void _onPanEnd(dynamic _) { + void _onPanEnd(_) { if (!_isDragging) return; final nearestCorner = _calculateNearestCorner( @@ -122,7 +122,7 @@ class PIPViewState extends State with TickerProviderStateMixin { }); } - void _onPanStart(dynamic _) { + void _onPanStart(_) { if (_isAnimating()) return; setState(() { _dragOffset = _offsets[_corner]!; diff --git a/lib/pages/image_viewer/video_player.dart b/lib/pages/image_viewer/video_player.dart index fa18f93c4..5ca9fcc2b 100644 --- a/lib/pages/image_viewer/video_player.dart +++ b/lib/pages/image_viewer/video_player.dart @@ -43,7 +43,7 @@ class EventVideoPlayerState extends State { try { final fileSize = widget.event.content - .tryGetMap('info') + .tryGetMap('info') ?.tryGet('size'); final videoFile = await widget.event.downloadAndDecryptAttachment( onDownloadProgress: fileSize == null diff --git a/lib/pages/new_group/new_group.dart b/lib/pages/new_group/new_group.dart index c5737a32b..4c2e711ad 100644 --- a/lib/pages/new_group/new_group.dart +++ b/lib/pages/new_group/new_group.dart @@ -108,7 +108,7 @@ class NewGroupController extends State { context.pop(spaceId); } - void submitAction([dynamic _]) async { + void submitAction([_]) async { final client = Matrix.of(context).client; try { diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index 13ca20a1e..e3c1146f4 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -182,7 +182,7 @@ class SettingsController extends State { bool? crossSigningCached; bool? showChatBackupBanner; - void firstRunBootstrapAction([dynamic _]) async { + void firstRunBootstrapAction([_]) async { if (showChatBackupBanner != true) { showOkAlertDialog( context: context, diff --git a/lib/utils/matrix_sdk_extensions/event_extension.dart b/lib/utils/matrix_sdk_extensions/event_extension.dart index 2da3a1f0c..09cbe5343 100644 --- a/lib/utils/matrix_sdk_extensions/event_extension.dart +++ b/lib/utils/matrix_sdk_extensions/event_extension.dart @@ -59,7 +59,7 @@ extension LocalizedBody on Event { (content['url'] is String)); String? get sizeString => content - .tryGetMap('info') + .tryGetMap('info') ?.tryGet('size') ?.sizeString; } diff --git a/lib/widgets/app_lock.dart b/lib/widgets/app_lock.dart index a8b933011..636b38dff 100644 --- a/lib/widgets/app_lock.dart +++ b/lib/widgets/app_lock.dart @@ -41,7 +41,7 @@ class AppLock extends State with WidgetsBindingObserver { WidgetsBinding.instance.addPostFrameCallback(_checkLoggedIn); } - void _checkLoggedIn(dynamic _) async { + void _checkLoggedIn(_) async { if (widget.clients.any((client) => client.isLogged())) return; await changePincode(null); diff --git a/lib/widgets/theme_builder.dart b/lib/widgets/theme_builder.dart index 669c88913..0be03731d 100644 --- a/lib/widgets/theme_builder.dart +++ b/lib/widgets/theme_builder.dart @@ -41,7 +41,7 @@ class ThemeController extends State { static ThemeController of(BuildContext context) => Provider.of(context, listen: false); - void _loadData(dynamic _) async { + void _loadData(_) async { final preferences = _sharedPreferences ??= await SharedPreferences.getInstance(); 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: