auto-claude: subtask-6-1 - Run flutter analyze to ensure no errors or warnings

Fixed all 39 analyzer issues:
- Removed unused import (animation_system.dart in collapsible_routes_sidebar.dart)
- Removed unused element (_buildActionButton in dark_mode_map.dart)
- Fixed unnecessary non-null assertions on AppLocalizations.of(context)
- Removed unnecessary type checks in providers.dart
- Used super parameters for key in navigation_tc_dialog.dart and status_colors.dart
- Replaced print statements with debugPrint in providers.dart and logging_interceptor.dart

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Mathias Beaulieu-Duncan 2026-01-20 11:54:12 -05:00
parent c53f4a3b2f
commit 6986a12b91
12 changed files with 48 additions and 109 deletions

View File

@ -3,23 +3,23 @@
"spec": "001-normalize-code-update-packages-widgetify-component", "spec": "001-normalize-code-update-packages-widgetify-component",
"state": "building", "state": "building",
"subtasks": { "subtasks": {
"completed": 10, "completed": 11,
"total": 14, "total": 14,
"in_progress": 1, "in_progress": 1,
"failed": 0 "failed": 0
}, },
"phase": { "phase": {
"current": "Unlock Orientation", "current": "Cleanup and Verification",
"id": null, "id": null,
"total": 1 "total": 3
}, },
"workers": { "workers": {
"active": 0, "active": 0,
"max": 1 "max": 1
}, },
"session": { "session": {
"number": 11, "number": 12,
"started_at": "2026-01-20T11:20:56.182893" "started_at": "2026-01-20T11:20:56.182893"
}, },
"last_update": "2026-01-20T11:46:27.066658" "last_update": "2026-01-20T11:47:55.069999"
} }

View File

@ -4,7 +4,6 @@ import '../l10n/app_localizations.dart';
import '../models/delivery_route.dart'; import '../models/delivery_route.dart';
import '../theme/spacing_system.dart'; import '../theme/spacing_system.dart';
import '../theme/size_system.dart'; import '../theme/size_system.dart';
import '../theme/animation_system.dart';
import '../theme/color_system.dart'; import '../theme/color_system.dart';
import '../utils/breakpoints.dart'; import '../utils/breakpoints.dart';
import '../providers/providers.dart'; import '../providers/providers.dart';
@ -73,7 +72,7 @@ class _CollapsibleRoutesSidebarState extends ConsumerState<CollapsibleRoutesSide
final isMobile = context.isMobile; final isMobile = context.isMobile;
final isDarkMode = Theme.of(context).brightness == Brightness.dark; final isDarkMode = Theme.of(context).brightness == Brightness.dark;
final isExpanded = ref.watch(collapseStateProvider); final isExpanded = ref.watch(collapseStateProvider);
final l10n = AppLocalizations.of(context)!; final l10n = AppLocalizations.of(context);
// On mobile, always show as collapsible // On mobile, always show as collapsible
if (isMobile) { if (isMobile) {

View File

@ -738,60 +738,4 @@ class _DarkModeMapComponentState extends State<DarkModeMapComponent> {
); );
} }
Widget _buildActionButton({
required String label,
required IconData icon,
required VoidCallback? onPressed,
required Color color,
}) {
final isDisabled = onPressed == null;
final buttonColor = isDisabled ? color.withValues(alpha: 0.5) : color;
return Container(
margin: const EdgeInsets.only(bottom: 8),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
boxShadow: [
BoxShadow(
color: Colors.black.withValues(alpha: 0.3),
blurRadius: 4,
offset: const Offset(0, 2),
),
],
),
child: Material(
color: buttonColor,
borderRadius: BorderRadius.circular(8),
child: InkWell(
onTap: onPressed,
borderRadius: BorderRadius.circular(8),
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 8,
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
icon,
color: Colors.white,
size: 18,
),
const SizedBox(width: 6),
Text(
label,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 14,
),
),
],
),
),
),
),
);
}
} }

View File

@ -95,7 +95,7 @@ class _DeliveryListItemState extends State<DeliveryListItem>
Widget build(BuildContext context) { Widget build(BuildContext context) {
final isDark = Theme.of(context).brightness == Brightness.dark; final isDark = Theme.of(context).brightness == Brightness.dark;
final statusColor = _getStatusColor(widget.delivery); final statusColor = _getStatusColor(widget.delivery);
final l10n = AppLocalizations.of(context)!; final l10n = AppLocalizations.of(context);
// Collapsed view: Show only the badge // Collapsed view: Show only the badge
if (widget.isCollapsed) { if (widget.isCollapsed) {

View File

@ -6,10 +6,10 @@ class NavigationTermsAndConditionsDialog extends StatelessWidget {
final VoidCallback? onDecline; final VoidCallback? onDecline;
const NavigationTermsAndConditionsDialog({ const NavigationTermsAndConditionsDialog({
Key? key, super.key,
required this.onAccept, required this.onAccept,
this.onDecline, this.onDecline,
}) : super(key: key); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View File

@ -80,7 +80,7 @@ class _RouteListItemState extends State<RouteListItem>
Widget build(BuildContext context) { Widget build(BuildContext context) {
final isDark = Theme.of(context).brightness == Brightness.dark; final isDark = Theme.of(context).brightness == Brightness.dark;
final statusColor = _getStatusColor(widget.route); final statusColor = _getStatusColor(widget.route);
final l10n = AppLocalizations.of(context)!; final l10n = AppLocalizations.of(context);
// Collapsed view: Show only the badge // Collapsed view: Show only the badge
if (widget.isCollapsed) { if (widget.isCollapsed) {

View File

@ -88,7 +88,7 @@ class _DeliveriesPageState extends ConsumerState<DeliveriesPage> {
final deliveriesData = ref.watch(deliveriesProvider(widget.routeFragmentId)); final deliveriesData = ref.watch(deliveriesProvider(widget.routeFragmentId));
final tokenAsync = ref.watch(authTokenProvider); final tokenAsync = ref.watch(authTokenProvider);
final token = tokenAsync.hasValue ? tokenAsync.value : null; final token = tokenAsync.hasValue ? tokenAsync.value : null;
final l10n = AppLocalizations.of(context)!; final l10n = AppLocalizations.of(context);
// When embedded in sidebar, show only the delivery list with back button // When embedded in sidebar, show only the delivery list with back button
// This is a responsive sidebar that collapses like routes // This is a responsive sidebar that collapses like routes
@ -300,7 +300,7 @@ class _DeliveriesPageState extends ConsumerState<DeliveriesPage> {
} }
if (token == null) { if (token == null) {
final l10n = AppLocalizations.of(context)!; final l10n = AppLocalizations.of(context);
ToastHelper.showError(context, l10n.authenticationRequired); ToastHelper.showError(context, l10n.authenticationRequired);
return; return;
} }
@ -322,7 +322,7 @@ class _DeliveriesPageState extends ConsumerState<DeliveriesPage> {
); );
result.when( result.when(
success: (_) { success: (_) {
final l10n = AppLocalizations.of(context)!; final l10n = AppLocalizations.of(context);
// ignore: unused_result // ignore: unused_result
ref.refresh(deliveriesProvider(widget.routeFragmentId)); ref.refresh(deliveriesProvider(widget.routeFragmentId));
// ignore: unused_result // ignore: unused_result
@ -330,7 +330,7 @@ class _DeliveriesPageState extends ConsumerState<DeliveriesPage> {
ToastHelper.showSuccess(context, l10n.deliverySuccessful); ToastHelper.showSuccess(context, l10n.deliverySuccessful);
}, },
onError: (error) { onError: (error) {
final l10n = AppLocalizations.of(context)!; final l10n = AppLocalizations.of(context);
ToastHelper.showError(context, l10n.error(error.message)); ToastHelper.showError(context, l10n.error(error.message));
}, },
); );
@ -343,7 +343,6 @@ class _DeliveriesPageState extends ConsumerState<DeliveriesPage> {
); );
result.when( result.when(
success: (_) { success: (_) {
final l10n = AppLocalizations.of(context)!;
// ignore: unused_result // ignore: unused_result
ref.refresh(deliveriesProvider(widget.routeFragmentId)); ref.refresh(deliveriesProvider(widget.routeFragmentId));
// ignore: unused_result // ignore: unused_result
@ -351,7 +350,7 @@ class _DeliveriesPageState extends ConsumerState<DeliveriesPage> {
ToastHelper.showSuccess(context, 'Delivery marked as uncompleted'); ToastHelper.showSuccess(context, 'Delivery marked as uncompleted');
}, },
onError: (error) { onError: (error) {
final l10n = AppLocalizations.of(context)!; final l10n = AppLocalizations.of(context);
ToastHelper.showError(context, l10n.error(error.message)); ToastHelper.showError(context, l10n.error(error.message));
}, },
); );
@ -386,7 +385,7 @@ class _DeliveriesPageState extends ConsumerState<DeliveriesPage> {
String? token, String? token,
) async { ) async {
if (token == null) { if (token == null) {
final l10n = AppLocalizations.of(context)!; final l10n = AppLocalizations.of(context);
ToastHelper.showError(context, l10n.authenticationRequired); ToastHelper.showError(context, l10n.authenticationRequired);
return; return;
} }

View File

@ -79,7 +79,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
), ),
const SizedBox(height: 24), const SizedBox(height: 24),
Text( Text(
AppLocalizations.of(context)!.appTitle, AppLocalizations.of(context).appTitle,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.displayMedium?.copyWith( style: Theme.of(context).textTheme.displayMedium?.copyWith(
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
@ -88,7 +88,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Text( Text(
AppLocalizations.of(context)!.appDescription, AppLocalizations.of(context).appDescription,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.bodyLarge?.copyWith( style: Theme.of(context).textTheme.bodyLarge?.copyWith(
color: Theme.of(context).colorScheme.onSurfaceVariant, color: Theme.of(context).colorScheme.onSurfaceVariant,
@ -98,8 +98,8 @@ class _LoginPageState extends ConsumerState<LoginPage> {
TextFormField( TextFormField(
controller: _usernameController, controller: _usernameController,
decoration: InputDecoration( decoration: InputDecoration(
labelText: AppLocalizations.of(context)!.username, labelText: AppLocalizations.of(context).username,
hintText: AppLocalizations.of(context)!.usernameHint, hintText: AppLocalizations.of(context).usernameHint,
prefixIcon: const Icon(Icons.person), prefixIcon: const Icon(Icons.person),
border: const OutlineInputBorder(), border: const OutlineInputBorder(),
), ),
@ -107,7 +107,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
enabled: !_isLoading, enabled: !_isLoading,
validator: (value) { validator: (value) {
if (value == null || value.trim().isEmpty) { if (value == null || value.trim().isEmpty) {
return AppLocalizations.of(context)!.usernameRequired; return AppLocalizations.of(context).usernameRequired;
} }
return null; return null;
}, },
@ -116,8 +116,8 @@ class _LoginPageState extends ConsumerState<LoginPage> {
TextFormField( TextFormField(
controller: _passwordController, controller: _passwordController,
decoration: InputDecoration( decoration: InputDecoration(
labelText: AppLocalizations.of(context)!.password, labelText: AppLocalizations.of(context).password,
hintText: AppLocalizations.of(context)!.passwordHint, hintText: AppLocalizations.of(context).passwordHint,
prefixIcon: const Icon(Icons.lock), prefixIcon: const Icon(Icons.lock),
border: const OutlineInputBorder(), border: const OutlineInputBorder(),
suffixIcon: IconButton( suffixIcon: IconButton(
@ -137,7 +137,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
onFieldSubmitted: (_) => _handleLogin(), onFieldSubmitted: (_) => _handleLogin(),
validator: (value) { validator: (value) {
if (value == null || value.isEmpty) { if (value == null || value.isEmpty) {
return AppLocalizations.of(context)!.passwordRequired; return AppLocalizations.of(context).passwordRequired;
} }
return null; return null;
}, },
@ -159,7 +159,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
), ),
), ),
) )
: Text(AppLocalizations.of(context)!.loginButton), : Text(AppLocalizations.of(context).loginButton),
), ),
], ],
), ),

View File

@ -11,7 +11,7 @@ class SettingsPage extends ConsumerWidget {
final userProfile = ref.watch(userProfileProvider); final userProfile = ref.watch(userProfileProvider);
final languageAsync = ref.watch(languageProvider); final languageAsync = ref.watch(languageProvider);
final themeMode = ref.watch(themeModeProvider); final themeMode = ref.watch(themeModeProvider);
final l10n = AppLocalizations.of(context)!; final l10n = AppLocalizations.of(context);
final language = languageAsync.maybeWhen( final language = languageAsync.maybeWhen(
data: (value) => value, data: (value) => value,

View File

@ -57,11 +57,9 @@ final deliveryRoutesProvider = FutureProvider<List<DeliveryRoute>>((ref) async {
query: _EmptyQuery(), query: _EmptyQuery(),
fromJson: (json) { fromJson: (json) {
// API returns data wrapped in object with "data" field // API returns data wrapped in object with "data" field
if (json is Map<String, dynamic>) { final data = json['data'];
final data = json['data']; if (data is List<dynamic>) {
if (data is List<dynamic>) { return data.map((r) => DeliveryRoute.fromJson(r as Map<String, dynamic>)).toList();
return data.map((r) => DeliveryRoute.fromJson(r as Map<String, dynamic>)).toList();
}
} }
return []; return [];
}, },
@ -88,11 +86,9 @@ final deliveriesProvider = FutureProvider.family<List<Delivery>, int>((ref, rout
query: _DeliveriesQuery(routeFragmentId: routeFragmentId), query: _DeliveriesQuery(routeFragmentId: routeFragmentId),
fromJson: (json) { fromJson: (json) {
// API returns data wrapped in object with "data" field // API returns data wrapped in object with "data" field
if (json is Map<String, dynamic>) { final data = json['data'];
final data = json['data']; if (data is List<dynamic>) {
if (data is List<dynamic>) { return data.map((d) => Delivery.fromJson(d as Map<String, dynamic>)).toList();
return data.map((d) => Delivery.fromJson(d as Map<String, dynamic>)).toList();
}
} }
return []; return [];
}, },
@ -100,9 +96,9 @@ final deliveriesProvider = FutureProvider.family<List<Delivery>, int>((ref, rout
// Log error if API call failed // Log error if API call failed
result.whenError((error) { result.whenError((error) {
print('ERROR fetching deliveries for route $routeFragmentId: ${error.message}'); debugPrint('ERROR fetching deliveries for route $routeFragmentId: ${error.message}');
if (error.originalException != null) { if (error.originalException != null) {
print('Original exception: ${error.originalException}'); debugPrint('Original exception: ${error.originalException}');
} }
}); });

View File

@ -194,12 +194,12 @@ class StatusBadgeWidget extends StatelessWidget {
final double fontSize; final double fontSize;
const StatusBadgeWidget({ const StatusBadgeWidget({
Key? key, super.key,
required this.status, required this.status,
this.showIcon = true, this.showIcon = true,
this.showLabel = true, this.showLabel = true,
this.fontSize = 12, this.fontSize = 12,
}) : super(key: key); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -242,11 +242,11 @@ class StatusAccentBar extends StatelessWidget {
final double height; final double height;
const StatusAccentBar({ const StatusAccentBar({
Key? key, super.key,
required this.status, required this.status,
this.width = 4, this.width = 4,
this.height = 60, this.height = 60,
}) : super(key: key); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View File

@ -1,26 +1,27 @@
import 'package:flutter/foundation.dart';
import 'package:http_interceptor/http_interceptor.dart'; import 'package:http_interceptor/http_interceptor.dart';
class LoggingInterceptor implements InterceptorContract { class LoggingInterceptor implements InterceptorContract {
@override @override
Future<BaseRequest> interceptRequest({required BaseRequest request}) async { Future<BaseRequest> interceptRequest({required BaseRequest request}) async {
print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); debugPrint('----------------------------------------------------');
print('📤 REQUEST: ${request.method} ${request.url}'); debugPrint('REQUEST: ${request.method} ${request.url}');
print('Headers: ${request.headers}'); debugPrint('Headers: ${request.headers}');
if (request is Request) { if (request is Request) {
print('Body: ${request.body}'); debugPrint('Body: ${request.body}');
} }
print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); debugPrint('----------------------------------------------------');
return request; return request;
} }
@override @override
Future<BaseResponse> interceptResponse({required BaseResponse response}) async { Future<BaseResponse> interceptResponse({required BaseResponse response}) async {
print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); debugPrint('----------------------------------------------------');
print('📥 RESPONSE: ${response.statusCode} ${response.request?.url}'); debugPrint('RESPONSE: ${response.statusCode} ${response.request?.url}');
if (response is Response) { if (response is Response) {
print('Body: ${response.body}'); debugPrint('Body: ${response.body}');
} }
print('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); debugPrint('----------------------------------------------------');
return response; return response;
} }