chore: Add code lint check for unused code

This commit is contained in:
Christian Kußowski 2026-02-18 16:10:23 +01:00
parent b4fbe46d43
commit 1896c56544
No known key found for this signature in database
GPG key ID: E067ECD60F1A0652
12 changed files with 36 additions and 352 deletions

View file

@ -29,6 +29,9 @@ jobs:
run: ./scripts/add-firebase-messaging.sh
- run: flutter analyze
- run: flutter test
- run: dart run dart_code_linter:metrics check-unused-code lib
- run: dart run dart_code_linter:metrics check-unused-files lib
- run: dart run dart_code_linter:metrics check-unused-l10n lib
build_debug_apk:
runs-on: ubuntu-latest

View file

@ -1,30 +0,0 @@
abstract class AppEmojis {
static const List<String> emojis = [
'👍',
'😊',
'😀',
'❤️',
'😍',
'😘',
'😇',
'😅',
'😭',
'😜',
'😱',
'😆',
'😉',
'😡',
'👋',
'🤔',
'🙁',
'🥳',
'😟',
'😄',
'😁',
'🙄',
'😂',
'🤣',
'😌',
'😬',
];
}

View file

@ -1,85 +0,0 @@
import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pages/chat/add_widget_tile_view.dart';
class AddWidgetTile extends StatefulWidget {
final Room room;
const AddWidgetTile({super.key, required this.room});
@override
State<AddWidgetTile> createState() => AddWidgetTileState();
}
class AddWidgetTileState extends State<AddWidgetTile> {
final TextEditingController urlController = TextEditingController();
final TextEditingController nameController = TextEditingController();
String widgetType = 'm.etherpad';
late final bool initiallyExpanded;
String? nameError;
String? urlError;
@override
void initState() {
initiallyExpanded = widget.room.widgets.isEmpty;
super.initState();
}
void setWidgetType(String value) => setState(() => widgetType = value);
void addWidget() {
try {
nameError = null;
urlError = null;
final room = widget.room;
final name = nameController.text;
final uri = Uri.tryParse(urlController.text);
if (name.length < 3) {
setState(() {
nameError = L10n.of(context).widgetNameError;
});
return;
}
if (uri == null || uri.scheme != 'https') {
setState(() {
urlError = L10n.of(context).widgetUrlError;
});
return;
}
setState(() {});
late MatrixWidget matrixWidget;
switch (widgetType) {
case 'm.etherpad':
matrixWidget = MatrixWidget.etherpad(room, name, uri);
break;
case 'm.jitsi':
matrixWidget = MatrixWidget.jitsi(room, name, uri);
break;
case 'm.video':
matrixWidget = MatrixWidget.video(room, name, uri);
break;
default:
matrixWidget = MatrixWidget.custom(room, name, uri);
break;
}
widget.room.addWidget(matrixWidget);
Navigator.of(context).pop();
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(L10n.of(context).errorAddingWidget)),
);
}
}
@override
Widget build(BuildContext context) => AddWidgetTileView(controller: this);
}

View file

@ -1,73 +0,0 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pages/chat/add_widget_tile.dart';
class AddWidgetTileView extends StatelessWidget {
final AddWidgetTileState controller;
const AddWidgetTileView({super.key, required this.controller});
@override
Widget build(BuildContext context) {
return ExpansionTile(
title: Text(L10n.of(context).addWidget),
leading: const Icon(Icons.add),
initiallyExpanded: controller.initiallyExpanded,
children: [
CupertinoSegmentedControl(
groupValue: controller.widgetType,
padding: const EdgeInsets.all(8),
children:
{
'm.etherpad': Text(L10n.of(context).widgetEtherpad),
'm.jitsi': Text(L10n.of(context).widgetJitsi),
'm.video': Text(L10n.of(context).widgetVideo),
'm.custom': Text(L10n.of(context).widgetCustom),
}.map(
(key, value) => MapEntry(
key,
Padding(
padding: const EdgeInsets.symmetric(horizontal: 4.0),
child: value,
),
),
),
onValueChanged: controller.setWidgetType,
),
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
controller: controller.nameController,
autofocus: true,
decoration: InputDecoration(
prefixIcon: const Icon(Icons.label),
label: Text(L10n.of(context).widgetName),
errorText: controller.nameError,
),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
controller: controller.urlController,
decoration: InputDecoration(
prefixIcon: const Icon(Icons.add_link),
label: Text(L10n.of(context).link),
errorText: controller.urlError,
),
),
),
OverflowBar(
children: [
TextButton(
onPressed: controller.addWidget,
child: Text(L10n.of(context).addWidget),
),
],
),
],
);
}
}

View file

@ -16,8 +16,6 @@ import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'
import 'package:fluffychat/widgets/future_loading_dialog.dart';
import 'package:fluffychat/widgets/matrix.dart';
enum AliasActions { copy, delete, setCanonical }
class ChatDetails extends StatefulWidget {
final String roomId;
final Widget? embeddedCloseButton;

View file

@ -29,15 +29,6 @@ import '../../config/setting_keys.dart';
import '../../utils/url_launcher.dart';
import '../../widgets/matrix.dart';
enum PopupMenuAction {
settings,
invite,
newGroup,
newSpace,
setStatus,
archive,
}
enum ActiveFilter { allChats, messages, groups, unread, spaces }
extension LocalizedActiveFilter on ActiveFilter {
@ -879,8 +870,6 @@ class ChatListController extends State<ChatList>
enum EditBundleAction { addToBundle, removeFromBundle }
enum InviteActions { accept, decline, block }
enum ChatContextAction {
open,
goToSpace,

View file

@ -14,8 +14,6 @@ import '../../config/themes.dart';
import '../../utils/date_time_extension.dart';
import '../../widgets/avatar.dart';
enum ArchivedRoomAction { delete, rejoin }
class ChatListItem extends StatelessWidget {
final Room room;
final Room? space;

View file

@ -45,10 +45,6 @@ import 'platform_infos.dart';
//<GOOGLE_SERVICES>import 'package:fcm_shared_isolate/fcm_shared_isolate.dart';
class NoTokenException implements Exception {
String get cause => 'Cannot get firebase token';
}
class BackgroundPush {
static BackgroundPush? _instance;
final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin =

View file

@ -1,100 +0,0 @@
import 'package:flutter/material.dart';
import 'package:fluffychat/config/themes.dart';
class AvatarPageHeader extends StatelessWidget {
final Widget avatar;
final void Function()? onAvatarEdit;
final Widget? textButtonLeft, textButtonRight;
final List<Widget> iconButtons;
const AvatarPageHeader({
super.key,
required this.avatar,
this.onAvatarEdit,
this.iconButtons = const [],
this.textButtonLeft,
this.textButtonRight,
});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final onAvatarEdit = this.onAvatarEdit;
return Center(
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: FluffyThemes.columnWidth),
child: Column(
mainAxisSize: .min,
crossAxisAlignment: .center,
spacing: 8.0,
children: [
Stack(
children: [
avatar,
if (onAvatarEdit != null)
Positioned(
bottom: 0,
right: 0,
child: FloatingActionButton.small(
elevation: 2,
onPressed: onAvatarEdit,
heroTag: null,
child: const Icon(Icons.camera_alt_outlined),
),
),
],
),
TextButtonTheme(
data: TextButtonThemeData(
style: TextButton.styleFrom(
disabledForegroundColor: theme.colorScheme.onSurface,
foregroundColor: theme.colorScheme.onSurface,
textStyle: const TextStyle(fontWeight: FontWeight.normal),
),
),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: LayoutBuilder(
builder: (context, constraints) {
return Row(
mainAxisAlignment: .center,
children: [
ConstrainedBox(
constraints: BoxConstraints(
maxWidth: constraints.maxWidth / 2,
),
child: textButtonLeft,
),
ConstrainedBox(
constraints: BoxConstraints(
maxWidth: constraints.maxWidth / 2,
),
child: textButtonRight,
),
],
);
},
),
),
),
IconButtonTheme(
data: IconButtonThemeData(
style: IconButton.styleFrom(
backgroundColor: theme.colorScheme.surfaceContainer,
iconSize: 24,
padding: const EdgeInsets.all(16),
),
),
child: Row(
mainAxisAlignment: .spaceEvenly,
children: iconButtons,
),
),
const SizedBox(height: 0.0),
],
),
),
);
}
}

View file

@ -1,45 +0,0 @@
import 'package:flutter/material.dart';
import 'package:fluffychat/utils/error_reporter.dart';
class FluffyChatErrorWidget extends StatefulWidget {
final FlutterErrorDetails details;
const FluffyChatErrorWidget(this.details, {super.key});
@override
State<FluffyChatErrorWidget> createState() => _FluffyChatErrorWidgetState();
}
class _FluffyChatErrorWidgetState extends State<FluffyChatErrorWidget> {
static final Set<String> knownExceptions = {};
@override
void initState() {
super.initState();
if (knownExceptions.contains(widget.details.exception.toString())) {
return;
}
knownExceptions.add(widget.details.exception.toString());
WidgetsBinding.instance.addPostFrameCallback((_) {
ErrorReporter(
context,
'Error Widget',
).onErrorCallback(widget.details.exception, widget.details.stack);
});
}
@override
Widget build(BuildContext context) {
return Material(
color: Colors.orange,
child: Placeholder(
child: Center(
child: Material(
color: Colors.white.withAlpha(230),
borderRadius: BorderRadius.circular(8),
),
),
),
);
}
}

View file

@ -17,6 +17,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "8.4.1"
analyzer_plugin:
dependency: transitive
description:
name: analyzer_plugin
sha256: "825071d553c4aef2252196d46a665fbd8e0cb06de07725f25d1b29bd18d65fff"
url: "https://pub.dev"
source: hosted
version: "0.13.6"
animations:
dependency: "direct main"
description:
@ -273,6 +281,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.8"
dart_code_linter:
dependency: "direct dev"
description:
name: dart_code_linter
sha256: "1b53722d9933a5f5d4580acc29c7f16b1fde66d21d1ecf7bb2a811caf3a42b42"
url: "https://pub.dev"
source: hosted
version: "3.2.1"
dart_earcut:
dependency: transitive
description:
@ -289,6 +305,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.0"
dart_style:
dependency: transitive
description:
name: dart_style
sha256: a9c30492da18ff84efe2422ba2d319a89942d93e58eb0b73d32abe822ef54b7b
url: "https://pub.dev"
source: hosted
version: "3.1.3"
dart_webrtc:
dependency: transitive
description:
@ -1364,6 +1388,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.2.0"
pub_updater:
dependency: transitive
description:
name: pub_updater
sha256: "739a0161d73a6974c0675b864fb0cf5147305f7b077b7f03a58fa7a9ab3e7e7d"
url: "https://pub.dev"
source: hosted
version: "0.5.0"
pubspec_parse:
dependency: transitive
description:

View file

@ -85,6 +85,7 @@ dependencies:
webrtc_interface: ^1.3.0
dev_dependencies:
dart_code_linter: ^3.2.1
flutter_lints: ^6.0.0
flutter_native_splash: ^2.4.7
flutter_test: