chore: Fix dart deprecation messages

This commit is contained in:
PartyDonut 2025-01-05 13:53:59 +01:00
parent 607dea3de1
commit 39a7537116
81 changed files with 258 additions and 195 deletions

View file

@ -6,7 +6,6 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:collection/collection.dart';
import 'package:dynamic_color/dynamic_color.dart'; import 'package:dynamic_color/dynamic_color.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
@ -276,7 +275,7 @@ class _MainState extends ConsumerState<Main> with WindowListener, WidgetsBinding
dragDevices: { dragDevices: {
...scrollBehaviour.dragDevices, ...scrollBehaviour.dragDevices,
mouseDrag ? PointerDeviceKind.mouse : null, mouseDrag ? PointerDeviceKind.mouse : null,
}.whereNotNull().toSet(), }.nonNulls.toSet(),
), ),
localizationsDelegates: AppLocalizations.localizationsDelegates, localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales, supportedLocales: AppLocalizations.supportedLocales,

View file

@ -62,7 +62,7 @@ class ErrorLogModel {
"\n", "\n",
"\n", "\n",
stackTrace, stackTrace,
].whereNotNull().join(); ].nonNulls.join();
String get clipBoard => [_label, content].toString(); String get clipBoard => [_label, content].toString();

View file

@ -1,14 +1,14 @@
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:collection/collection.dart';
import 'package:fladder/models/items/series_model.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/jellyfin/jellyfin_open_api.enums.swagger.dart'; import 'package:fladder/jellyfin/jellyfin_open_api.enums.swagger.dart';
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart' as jelly; import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart' as jelly;
import 'package:fladder/models/item_base_model.dart'; import 'package:fladder/models/item_base_model.dart';
import 'package:fladder/models/items/item_shared_models.dart'; import 'package:fladder/models/items/item_shared_models.dart';
import 'package:fladder/models/items/series_model.dart';
import 'package:fladder/providers/image_provider.dart'; import 'package:fladder/providers/image_provider.dart';
class EditItemsProvider { class EditItemsProvider {
@ -118,7 +118,7 @@ class ItemEditingModel {
"OfficialRating": { "OfficialRating": {
for (String element in (editorInfo?.parentalRatingOptions?.map((e) => e.name).toSet() for (String element in (editorInfo?.parentalRatingOptions?.map((e) => e.name).toSet()
?..add(json?["OfficialRating"] as String?)) ?..add(json?["OfficialRating"] as String?))
?.whereNotNull() ?.nonNulls
.toList() ?? .toList() ??
[]) [])
element: (editedJson?["OfficialRating"] as String?) == element element: (editedJson?["OfficialRating"] as String?) == element
@ -126,7 +126,7 @@ class ItemEditingModel {
"CustomRating": { "CustomRating": {
for (String element in (editorInfo?.parentalRatingOptions?.map((e) => e.name).toSet() for (String element in (editorInfo?.parentalRatingOptions?.map((e) => e.name).toSet()
?..add(json?["CustomRating"] as String?)) ?..add(json?["CustomRating"] as String?))
?.whereNotNull() ?.nonNulls
.toList() ?? .toList() ??
[]) [])
element: (editedJson?["CustomRating"] as String?) == element element: (editedJson?["CustomRating"] as String?) == element

View file

@ -243,7 +243,7 @@ class AudioStreamModel extends StreamModel {
} }
String get title => String get title =>
[name, language, codec, channelLayout].whereNotNull().where((element) => element.isNotEmpty).join(' - '); [name, language, codec, channelLayout].nonNulls.where((element) => element.isNotEmpty).join(' - ');
AudioStreamModel.no({ AudioStreamModel.no({
super.name = 'Off', super.name = 'Off',

View file

@ -132,7 +132,7 @@ class PlaybackModelHelper {
trickPlay: syncedItem.trickPlayModel, trickPlay: syncedItem.trickPlayModel,
mediaSegments: syncedItem.mediaSegments, mediaSegments: syncedItem.mediaSegments,
media: Media(url: syncedItem.videoFile.path), media: Media(url: syncedItem.videoFile.path),
queue: itemQueue.whereNotNull().toList(), queue: itemQueue.nonNulls.toList(),
syncedQueue: children, syncedQueue: children,
mediaStreams: item.streamModel ?? syncedItemModel.streamModel, mediaStreams: item.streamModel ?? syncedItemModel.streamModel,
); );

View file

@ -1,4 +1,3 @@
// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'dart:convert'; import 'dart:convert';
import 'dart:math' as math; import 'dart:math' as math;
@ -9,6 +8,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/providers/settings/subtitle_settings_provider.dart'; import 'package:fladder/providers/settings/subtitle_settings_provider.dart';
import 'package:fladder/providers/settings/video_player_settings_provider.dart'; import 'package:fladder/providers/settings/video_player_settings_provider.dart';
import 'package:fladder/util/color_extensions.dart';
class SubtitleSettingsModel { class SubtitleSettingsModel {
final double fontSize; final double fontSize;
@ -58,11 +58,11 @@ class SubtitleSettingsModel {
? [ ? [
Shadow( Shadow(
blurRadius: 16, blurRadius: 16,
color: Colors.black.withOpacity(shadow), color: Colors.black.withValues(alpha: shadow),
), ),
Shadow( Shadow(
blurRadius: 8, blurRadius: 8,
color: Colors.black.withOpacity(shadow), color: Colors.black.withValues(alpha: shadow),
), ),
] ]
: null, : null,
@ -92,10 +92,10 @@ class SubtitleSettingsModel {
'fontSize': fontSize, 'fontSize': fontSize,
'fontWeight': fontWeight.value, 'fontWeight': fontWeight.value,
'verticalOffset': verticalOffset, 'verticalOffset': verticalOffset,
'color': color.value, 'color': color.toMap,
'outlineColor': outlineColor.value, 'outlineColor': outlineColor.toMap,
'outlineSize': outlineSize, 'outlineSize': outlineSize,
'backGroundColor': backGroundColor.value, 'backGroundColor': backGroundColor.toMap,
'shadow': shadow, 'shadow': shadow,
}; };
} }
@ -109,10 +109,10 @@ class SubtitleSettingsModel {
fontSize: map['fontSize'] as double?, fontSize: map['fontSize'] as double?,
fontWeight: FontWeight.values.firstWhereOrNull((element) => element.index == map['fontWeight'] as int?), fontWeight: FontWeight.values.firstWhereOrNull((element) => element.index == map['fontWeight'] as int?),
verticalOffset: map['verticalOffset'] as double?, verticalOffset: map['verticalOffset'] as double?,
color: map['color'] != null ? Color(map['color'] as int) : null, color: colorFromJson(map['color']),
outlineColor: map['outlineColor'] != null ? Color(map['outlineColor'] as int) : null, outlineColor: colorFromJson(map['outlineColor']),
outlineSize: map['outlineSize'] as double?, outlineSize: map['outlineSize'] as double?,
backGroundColor: map['backGroundColor'] != null ? Color(map['backGroundColor'] as int) : null, backGroundColor: colorFromJson(map['backGroundColor']),
shadow: map['shadow'] as double?, shadow: map['shadow'] as double?,
); );
} }

View file

@ -26,7 +26,7 @@ class BookProviderModel {
ImagesData? get cover => parentModel?.getPosters ?? book?.getPosters; ImagesData? get cover => parentModel?.getPosters ?? book?.getPosters;
List<BookModel> get allBooks { List<BookModel> get allBooks {
if (chapters.isEmpty) return [book].whereNotNull().toList(); if (chapters.isEmpty) return [book].nonNulls.toList();
return chapters; return chapters;
} }
@ -141,7 +141,7 @@ class BookDetailsProviderNotifier extends StateNotifier<BookProviderModel> {
state = state.copyWith( state = state.copyWith(
parentModel: !parentIsView ? () => parentResponse.bodyOrThrow : null, parentModel: !parentIsView ? () => parentResponse.bodyOrThrow : null,
chapters: (siblingsResponse?.body?.items ?? [openedBook]).whereType<BookModel>().whereNotNull().toList(), chapters: (siblingsResponse?.body?.items ?? [openedBook]).whereType<BookModel>().nonNulls.toList(),
); );
return response; return response;

View file

@ -80,7 +80,7 @@ class EpisodeDetailsProvider extends StateNotifier<EpisodeDetailModel> {
.map( .map(
(e) => e.createItemModel(ref), (e) => e.createItemModel(ref),
) )
.whereNotNull() .nonNulls
.whereType<EpisodeModel>() .whereType<EpisodeModel>()
.toList(); .toList();
state = state.copyWith( state = state.copyWith(

View file

@ -1,5 +1,4 @@
import 'package:chopper/chopper.dart'; import 'package:chopper/chopper.dart';
import 'package:collection/collection.dart';
import 'package:fladder/models/item_base_model.dart'; import 'package:fladder/models/item_base_model.dart';
import 'package:fladder/providers/service_provider.dart'; import 'package:fladder/providers/service_provider.dart';
import 'package:fladder/providers/sync_provider.dart'; import 'package:fladder/providers/sync_provider.dart';
@ -68,7 +67,7 @@ class SeriesDetailViewNotifier extends StateNotifier<SeriesModel?> {
.map( .map(
(e) => e.createItemModel(ref), (e) => e.createItemModel(ref),
) )
.whereNotNull() .nonNulls
.toList(); .toList();
state = seriesModel.copyWith( state = seriesModel.copyWith(
availableEpisodes: allChildren.whereType<EpisodeModel>().toList(), availableEpisodes: allChildren.whereType<EpisodeModel>().toList(),

View file

@ -120,10 +120,10 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
newLastIndices[viewModel.id] = (lastIndices ?? 0) + libraryItems.items.length; newLastIndices[viewModel.id] = (lastIndices ?? 0) + libraryItems.items.length;
} }
return libraryItems; return libraryItems;
}).whereNotNull(), }).nonNulls,
); );
List<ItemBaseModel> newPosters = results.whereNotNull().expand((element) => element.items).toList(); List<ItemBaseModel> newPosters = results.nonNulls.expand((element) => element.items).toList();
if (state.views.included.length > 1) { if (state.views.included.length > 1) {
if (state.sortingOption == SortingOptions.random) { if (state.sortingOption == SortingOptions.random) {
newPosters = newPosters.random(); newPosters = newPosters.random();
@ -220,7 +220,7 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
var tempState = state.copyWith(); var tempState = state.copyWith();
final genres = mappedList final genres = mappedList
.expand((element) => element?.genres ?? <NameGuidPair>[]) .expand((element) => element?.genres ?? <NameGuidPair>[])
.whereNotNull() .nonNulls
.sorted((a, b) => a.name!.toLowerCase().compareTo(b.name!.toLowerCase())); .sorted((a, b) => a.name!.toLowerCase().compareTo(b.name!.toLowerCase()));
final tags = mappedList final tags = mappedList
.expand((element) => element?.tags ?? <String>[]) .expand((element) => element?.tags ?? <String>[])
@ -437,7 +437,7 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
final response = await api.collectionsCollectionIdItemsDelete( final response = await api.collectionsCollectionIdItemsDelete(
collectionId: state.nestedCurrentItem?.id, ids: state.selectedPosters.map((e) => e.id).toList()); collectionId: state.nestedCurrentItem?.id, ids: state.selectedPosters.map((e) => e.id).toList());
if (response.isSuccessful) { if (response.isSuccessful) {
removeFromPosters([state.nestedCurrentItem?.id].whereNotNull().toList()); removeFromPosters([state.nestedCurrentItem?.id].nonNulls.toList());
} }
return response; return response;
} }
@ -445,9 +445,9 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
Future<Response> removeSelectedFromPlaylist() async { Future<Response> removeSelectedFromPlaylist() async {
final response = await api.playlistsPlaylistIdItemsDelete( final response = await api.playlistsPlaylistIdItemsDelete(
playlistId: state.nestedCurrentItem?.id, playlistId: state.nestedCurrentItem?.id,
entryIds: state.selectedPosters.map((e) => e.playlistId).whereNotNull().toList()); entryIds: state.selectedPosters.map((e) => e.playlistId).nonNulls.toList());
if (response.isSuccessful) { if (response.isSuccessful) {
removeFromPosters([state.nestedCurrentItem?.id].whereNotNull().toList()); removeFromPosters([state.nestedCurrentItem?.id].nonNulls.toList());
} }
return response; return response;
} }
@ -463,7 +463,7 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
Future<Response> removeFromPlaylist({required List<ItemBaseModel> items}) async { Future<Response> removeFromPlaylist({required List<ItemBaseModel> items}) async {
final response = await api.playlistsPlaylistIdItemsDelete( final response = await api.playlistsPlaylistIdItemsDelete(
playlistId: state.nestedCurrentItem?.id, entryIds: items.map((e) => e.playlistId).whereNotNull().toList()); playlistId: state.nestedCurrentItem?.id, entryIds: items.map((e) => e.playlistId).nonNulls.toList());
if (response.isSuccessful) { if (response.isSuccessful) {
removeFromPosters(items.map((e) => e.id).toList()); removeFromPosters(items.map((e) => e.id).toList());
} }
@ -489,7 +489,7 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
void updateUserDataMain(UserData? userData) { void updateUserDataMain(UserData? userData) {
state = state.copyWith( state = state.copyWith(
folderOverwrite: [state.folderOverwrite.lastOrNull?.copyWith(userData: userData)].whereNotNull().toList(), folderOverwrite: [state.folderOverwrite.lastOrNull?.copyWith(userData: userData)].nonNulls.toList(),
); );
} }
@ -529,10 +529,10 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
limit: limit, limit: limit,
); );
return libraryItems; return libraryItems;
}).whereNotNull(), }).nonNulls,
); );
List<ItemBaseModel> newPosters = results.whereNotNull().expand((element) => element.items).toList(); List<ItemBaseModel> newPosters = results.nonNulls.expand((element) => element.items).toList();
if (state.views.included.length > 1) { if (state.views.included.length > 1) {
if (shuffle || state.sortingOption == SortingOptions.random) { if (shuffle || state.sortingOption == SortingOptions.random) {
newPosters = newPosters.random(); newPosters = newPosters.random();

View file

@ -1,7 +1,8 @@
import 'dart:convert'; import 'dart:convert';
import 'package:collection/collection.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:screen_brightness/screen_brightness.dart'; import 'package:screen_brightness/screen_brightness.dart';
@ -124,15 +125,15 @@ class BookViewerSettingsNotifier extends StateNotifier<BookViewerSettingsModel>
screenBrightness: () => value, screenBrightness: () => value,
); );
if (state.screenBrightness != null) { if (state.screenBrightness != null) {
ScreenBrightness().setScreenBrightness(state.screenBrightness!); ScreenBrightness().setSystemScreenBrightness(state.screenBrightness!);
} else { } else {
ScreenBrightness().resetScreenBrightness(); ScreenBrightness().resetApplicationScreenBrightness();
} }
} }
void setSavedBrightness() { void setSavedBrightness() {
if (state.screenBrightness != null) { if (state.screenBrightness != null) {
ScreenBrightness().setScreenBrightness(state.screenBrightness!); ScreenBrightness().setSystemScreenBrightness(state.screenBrightness!);
} }
} }

View file

@ -34,7 +34,7 @@ class SubtitleSettingsNotifier extends StateNotifier<SubtitleSettingsModel> {
void setFontWeight(FontWeight? value) => state = state.copyWith(fontWeight: value); void setFontWeight(FontWeight? value) => state = state.copyWith(fontWeight: value);
SubtitleSettingsModel setBackGroundOpacity(double value) => SubtitleSettingsModel setBackGroundOpacity(double value) =>
state = state.copyWith(backGroundColor: state.backGroundColor.withOpacity(value)); state = state.copyWith(backGroundColor: state.backGroundColor.withValues(alpha: value));
SubtitleSettingsModel setShadowIntensity(double value) => state = state.copyWith(shadow: value); SubtitleSettingsModel setShadowIntensity(double value) => state = state.copyWith(shadow: value);
} }

View file

@ -33,15 +33,15 @@ class VideoPlayerSettingsProviderNotifier extends StateNotifier<VideoPlayerSetti
screenBrightness: value, screenBrightness: value,
); );
if (state.screenBrightness != null) { if (state.screenBrightness != null) {
ScreenBrightness().setScreenBrightness(state.screenBrightness!); ScreenBrightness().setSystemScreenBrightness(state.screenBrightness!);
} else { } else {
ScreenBrightness().resetScreenBrightness(); ScreenBrightness().resetApplicationScreenBrightness();
} }
} }
void setSavedBrightness() { void setSavedBrightness() {
if (state.screenBrightness != null) { if (state.screenBrightness != null) {
ScreenBrightness().setScreenBrightness(state.screenBrightness!); ScreenBrightness().setSystemScreenBrightness(state.screenBrightness!);
} }
} }

View file

@ -1,10 +1,11 @@
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'background_download_provider.g.dart'; part 'background_download_provider.g.dart';
@Riverpod(keepAlive: true) @Riverpod(keepAlive: true)
FileDownloader backgroundDownloader(BackgroundDownloaderRef ref) { FileDownloader backgroundDownloader(Ref ref) {
return FileDownloader() return FileDownloader()
..trackTasks() ..trackTasks()
..configureNotification( ..configureNotification(

View file

@ -359,7 +359,7 @@ class SyncNotifier extends StateNotifier<SyncSettingsModel> {
return data.copyWith( return data.copyWith(
primary: () => primary, primary: () => primary,
logo: () => logo, logo: () => logo,
backDrop: () => backdrops.whereNotNull().toList(), backDrop: () => backdrops.nonNulls.toList(),
); );
} }
@ -381,7 +381,7 @@ class SyncNotifier extends StateNotifier<SyncSettingsModel> {
imageUrl: path.joinAll(["Chapters", fileName]), imageUrl: path.joinAll(["Chapters", fileName]),
); );
}).toList(); }).toList();
return saveChapters.whereNotNull().toList(); return saveChapters.nonNulls.toList();
} }
Future<ImageData?> urlDataToFileData(ImageData? data, Directory directory, String fileName) async { Future<ImageData?> urlDataToFileData(ImageData? data, Directory directory, String fileName) async {

View file

@ -1,5 +1,6 @@
import 'package:chopper/chopper.dart'; import 'package:chopper/chopper.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:fladder/jellyfin/enum_models.dart'; import 'package:fladder/jellyfin/enum_models.dart';
@ -14,7 +15,7 @@ import 'package:fladder/providers/sync_provider.dart';
part 'user_provider.g.dart'; part 'user_provider.g.dart';
@riverpod @riverpod
bool showSyncButtonProvider(ShowSyncButtonProviderRef ref) { bool showSyncButtonProvider(Ref ref) {
final userCanSync = ref.watch(userProvider.select((value) => value?.canDownload ?? false)); final userCanSync = ref.watch(userProvider.select((value) => value?.canDownload ?? false));
final hasSyncedItems = ref.watch(syncProvider.select((value) => value.items.isNotEmpty)); final hasSyncedItems = ref.watch(syncProvider.select((value) => value.items.isNotEmpty));
return userCanSync || hasSyncedItems; return userCanSync || hasSyncedItems;

View file

@ -69,7 +69,7 @@ class _DetailsScreenState extends ConsumerState<DetailsScreen> {
tag: widget.id, tag: widget.id,
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface.withOpacity(1.0), color: Theme.of(context).colorScheme.surface.withValues(alpha: 1.0),
), ),
//Small offset to match detailscaffold //Small offset to match detailscaffold
child: Transform.translate( child: Transform.translate(

View file

@ -81,7 +81,7 @@ class _BookViewerControlsState extends ConsumerState<BookViewerControls> {
@override @override
void dispose() { void dispose() {
WakelockPlus.disable(); WakelockPlus.disable();
ScreenBrightness().resetScreenBrightness(); ScreenBrightness().resetApplicationScreenBrightness();
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge, overlays: []); SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge, overlays: []);
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
statusBarColor: Colors.transparent, statusBarColor: Colors.transparent,
@ -150,9 +150,9 @@ class _BookViewerControlsState extends ConsumerState<BookViewerControls> {
begin: Alignment.topCenter, begin: Alignment.topCenter,
end: Alignment.bottomCenter, end: Alignment.bottomCenter,
colors: [ colors: [
overlayColor.withOpacity(1), overlayColor.withValues(alpha: 1),
overlayColor.withOpacity(0.65), overlayColor.withValues(alpha: 0.65),
overlayColor.withOpacity(0), overlayColor.withValues(alpha: 0),
], ],
), ),
), ),
@ -198,9 +198,9 @@ class _BookViewerControlsState extends ConsumerState<BookViewerControls> {
begin: Alignment.topCenter, begin: Alignment.topCenter,
end: Alignment.bottomCenter, end: Alignment.bottomCenter,
colors: [ colors: [
overlayColor.withOpacity(0), overlayColor.withValues(alpha: 0),
overlayColor.withOpacity(0.65), overlayColor.withValues(alpha: 0.65),
overlayColor.withOpacity(1), overlayColor.withValues(alpha: 1),
], ],
), ),
), ),
@ -236,7 +236,7 @@ class _BookViewerControlsState extends ConsumerState<BookViewerControls> {
Flexible( Flexible(
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.black.withOpacity(0.7), color: Colors.black.withValues(alpha: 0.7),
borderRadius: BorderRadius.circular(60), borderRadius: BorderRadius.circular(60),
), ),
child: Padding( child: Padding(

View file

@ -78,7 +78,7 @@ class CrashScreen extends ConsumerWidget {
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
Card( Card(
color: e.color.withOpacity(0.1), color: e.color.withValues(alpha: 0.1),
margin: const EdgeInsets.symmetric(vertical: 12), margin: const EdgeInsets.symmetric(vertical: 12),
child: Padding( child: Padding(
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
@ -90,7 +90,7 @@ class CrashScreen extends ConsumerWidget {
children: [ children: [
Expanded( Expanded(
child: Card( child: Card(
color: e.color.withOpacity(0.2), color: e.color.withValues(alpha: 0.2),
child: Padding( child: Padding(
padding: const EdgeInsets.all(4.0), padding: const EdgeInsets.all(4.0),
child: Text( child: Text(

View file

@ -3,7 +3,6 @@ import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/jellyfin/jellyfin_open_api.enums.swagger.dart'; import 'package:fladder/jellyfin/jellyfin_open_api.enums.swagger.dart';
@ -179,7 +178,7 @@ class _DashboardScreenState extends ConsumerState<DashboardScreen> {
posters: view.recentlyAdded, posters: view.recentlyAdded,
), ),
)), )),
].whereNotNull().toList().addInBetween(const SliverToBoxAdapter(child: SizedBox(height: 16))), ].nonNulls.toList().addInBetween(const SliverToBoxAdapter(child: SizedBox(height: 16))),
const DefautlSliverBottomPadding(), const DefautlSliverBottomPadding(),
], ],
), ),

View file

@ -56,7 +56,7 @@ class _BookDetailScreenState extends ConsumerState<BookDetailScreen> {
} }
}, },
), ),
backgroundColor: Theme.of(context).colorScheme.surface.withOpacity(0.8), backgroundColor: Theme.of(context).colorScheme.surface.withValues(alpha: 0.8),
onRefresh: () async => await ref.read(provider.notifier).fetchDetails(widget.item), onRefresh: () async => await ref.read(provider.notifier).fetchDetails(widget.item),
backDrops: details.cover, backDrops: details.cover,
content: (padding) => details.book != null content: (padding) => details.book != null

View file

@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
class LabelTitleItem extends ConsumerWidget { class LabelTitleItem extends ConsumerWidget {
@ -32,7 +31,7 @@ class LabelTitleItem extends ConsumerWidget {
label!, label!,
) )
: content!, : content!,
].whereNotNull().toList(), ].nonNulls.toList(),
), ),
); );
} }

View file

@ -50,7 +50,7 @@ class EmptyItem extends ConsumerWidget {
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
side: BorderSide( side: BorderSide(
width: 1.0, width: 1.0,
color: Colors.white.withOpacity(0.10), color: Colors.white.withValues(alpha: 0.10),
), ),
borderRadius: FladderTheme.defaultShape.borderRadius, borderRadius: FladderTheme.defaultShape.borderRadius,
), ),

View file

@ -1,4 +1,9 @@
import 'package:flutter/material.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:intl/intl.dart';
import 'package:fladder/models/items/item_shared_models.dart'; import 'package:fladder/models/items/item_shared_models.dart';
import 'package:fladder/providers/items/person_details_provider.dart'; import 'package:fladder/providers/items/person_details_provider.dart';
import 'package:fladder/providers/user_provider.dart'; import 'package:fladder/providers/user_provider.dart';
@ -11,9 +16,6 @@ import 'package:fladder/util/list_extensions.dart';
import 'package:fladder/util/string_extensions.dart'; import 'package:fladder/util/string_extensions.dart';
import 'package:fladder/util/widget_extensions.dart'; import 'package:fladder/util/widget_extensions.dart';
import 'package:fladder/widgets/shared/selectable_icon_button.dart'; import 'package:fladder/widgets/shared/selectable_icon_button.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:intl/intl.dart';
class PersonDetailScreen extends ConsumerStatefulWidget { class PersonDetailScreen extends ConsumerStatefulWidget {
final Person person; final Person person;
@ -37,6 +39,7 @@ class _PersonDetailScreenState extends ConsumerState<PersonDetailScreen> {
backDrops: [...?details?.movies, ...?details?.series].random().firstOrNull?.images, backDrops: [...?details?.movies, ...?details?.series].random().firstOrNull?.images,
content: (padding) => Column( content: (padding) => Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
SizedBox(height: MediaQuery.of(context).size.height / 6), SizedBox(height: MediaQuery.of(context).size.height / 6),
Padding( Padding(
@ -89,10 +92,6 @@ class _PersonDetailScreenState extends ConsumerState<PersonDetailScreen> {
Text("Birthday: ${DateFormat.yMEd().format(details?.dateOfBirth ?? DateTime.now()).toString()}"), Text("Birthday: ${DateFormat.yMEd().format(details?.dateOfBirth ?? DateTime.now()).toString()}"),
if (details?.age != null) Text("Age: ${details?.age}"), if (details?.age != null) Text("Age: ${details?.age}"),
if (details?.birthPlace.isEmpty == false) Text("Born in ${details?.birthPlace.join(",")}"), if (details?.birthPlace.isEmpty == false) Text("Born in ${details?.birthPlace.join(",")}"),
if (details?.overview.externalUrls?.isNotEmpty ?? false)
ExternalUrlsRow(
urls: details?.overview.externalUrls,
).padding(padding),
], ],
), ),
], ],
@ -102,7 +101,11 @@ class _PersonDetailScreenState extends ConsumerState<PersonDetailScreen> {
if (details?.movies.isNotEmpty ?? false) if (details?.movies.isNotEmpty ?? false)
PosterRow(contentPadding: padding, posters: details?.movies ?? [], label: "Movies"), PosterRow(contentPadding: padding, posters: details?.movies ?? [], label: "Movies"),
if (details?.series.isNotEmpty ?? false) if (details?.series.isNotEmpty ?? false)
PosterRow(contentPadding: padding, posters: details?.series ?? [], label: "Series") PosterRow(contentPadding: padding, posters: details?.series ?? [], label: "Series"),
if (details?.overview.externalUrls?.isNotEmpty ?? false)
ExternalUrlsRow(
urls: details?.overview.externalUrls,
).padding(padding),
], ],
), ),
); );

View file

@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:collection/collection.dart';
import 'package:ficonsax/ficonsax.dart'; import 'package:ficonsax/ficonsax.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
@ -76,7 +75,7 @@ class HomeScreen extends ConsumerWidget {
child: AutoRouter( child: AutoRouter(
builder: (context, child) { builder: (context, child) {
return NavigationScaffold( return NavigationScaffold(
destinations: destinations.whereNotNull().toList(), destinations: destinations.nonNulls.toList(),
currentRouteName: context.router.current.name, currentRouteName: context.router.current.name,
nestedChild: child, nestedChild: child,
); );

View file

@ -515,7 +515,7 @@ class _LibrarySearchScreenState extends ConsumerState<LibrarySearchScreen> {
), ),
if (librarySearchResults.fetchingItems) ...[ if (librarySearchResults.fetchingItems) ...[
Container( Container(
color: Colors.black.withOpacity(0.1), color: Colors.black.withValues(alpha: 0.1),
), ),
Center( Center(
child: Container( child: Container(

View file

@ -71,7 +71,9 @@ class LibrarySavedFiltersDialogue extends ConsumerWidget {
tooltip: context.localized.defaultFilterForLibrary, tooltip: context.localized.defaultFilterForLibrary,
style: ButtonStyle( style: ButtonStyle(
backgroundColor: WidgetStatePropertyAll( backgroundColor: WidgetStatePropertyAll(
filter.isFavourite ? Colors.yellowAccent.shade700.withOpacity(0.5) : null, filter.isFavourite
? Colors.yellowAccent.shade700.withValues(alpha: 0.5)
: null,
), ),
), ),
onPressed: () => onPressed: () =>
@ -107,6 +109,8 @@ class LibrarySavedFiltersDialogue extends ConsumerWidget {
style: ButtonStyle( style: ButtonStyle(
backgroundColor: backgroundColor:
WidgetStatePropertyAll(Theme.of(context).colorScheme.errorContainer), WidgetStatePropertyAll(Theme.of(context).colorScheme.errorContainer),
iconColor:
WidgetStatePropertyAll(Theme.of(context).colorScheme.onErrorContainer),
foregroundColor: foregroundColor:
WidgetStatePropertyAll(Theme.of(context).colorScheme.onErrorContainer), WidgetStatePropertyAll(Theme.of(context).colorScheme.onErrorContainer),
), ),

View file

@ -80,6 +80,7 @@ class LoginEditUser extends ConsumerWidget {
child: ElevatedButton.icon( child: ElevatedButton.icon(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: Colors.red, backgroundColor: Colors.red,
iconColor: Colors.white,
foregroundColor: Colors.white, foregroundColor: Colors.white,
), ),
onPressed: () async { onPressed: () async {

View file

@ -136,10 +136,10 @@ class _PhotoViewerControllsState extends ConsumerState<PhotoViewerControls> with
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final gradient = [ final gradient = [
Colors.black.withOpacity(0.6), Colors.black.withValues(alpha: 0.6),
Colors.black.withOpacity(0.3), Colors.black.withValues(alpha: 0.3),
Colors.black.withOpacity(0.1), Colors.black.withValues(alpha: 0.1),
Colors.black.withOpacity(0.0), Colors.black.withValues(alpha: 0.0),
]; ];
final padding = MediaQuery.of(context).padding; final padding = MediaQuery.of(context).padding;
@ -188,9 +188,12 @@ class _PhotoViewerControllsState extends ConsumerState<PhotoViewerControls> with
.textTheme .textTheme
.titleMedium .titleMedium
?.copyWith(fontWeight: FontWeight.bold, shadows: [ ?.copyWith(fontWeight: FontWeight.bold, shadows: [
BoxShadow(blurRadius: 1, spreadRadius: 1, color: Colors.black.withOpacity(0.7)), BoxShadow(
BoxShadow(blurRadius: 4, spreadRadius: 4, color: Colors.black.withOpacity(0.4)), blurRadius: 1, spreadRadius: 1, color: Colors.black.withValues(alpha: 0.7)),
BoxShadow(blurRadius: 20, spreadRadius: 6, color: Colors.black.withOpacity(0.2)), BoxShadow(
blurRadius: 4, spreadRadius: 4, color: Colors.black.withValues(alpha: 0.4)),
BoxShadow(
blurRadius: 20, spreadRadius: 6, color: Colors.black.withValues(alpha: 0.2)),
]), ]),
), ),
), ),

View file

@ -384,8 +384,8 @@ class _PhotoViewerScreenState extends ConsumerState<PhotoViewerScreen> with Widg
begin: Alignment.topCenter, begin: Alignment.topCenter,
end: Alignment.bottomCenter, end: Alignment.bottomCenter,
colors: [ colors: [
Colors.black.withOpacity(0.5), Colors.black.withValues(alpha: 0.5),
Colors.black.withOpacity(0), Colors.black.withValues(alpha: 0),
], ],
), ),
), ),

View file

@ -226,7 +226,8 @@ class _SimpleVideoPlayerState extends ConsumerState<SimpleVideoPlayer> with Wind
icon: Icon( icon: Icon(
player.lastState.playing ? IconsaxBold.pause_circle : IconsaxBold.play_circle, player.lastState.playing ? IconsaxBold.pause_circle : IconsaxBold.play_circle,
shadows: [ shadows: [
BoxShadow(blurRadius: 16, spreadRadius: 2, color: Colors.black.withOpacity(0.15)) BoxShadow(
blurRadius: 16, spreadRadius: 2, color: Colors.black.withValues(alpha: 0.15))
], ],
), ),
) )

View file

@ -47,7 +47,7 @@ class SettingsListTile extends StatelessWidget {
child: AnimatedContainer( child: AnimatedContainer(
duration: const Duration(milliseconds: 125), duration: const Duration(milliseconds: 125),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Theme.of(context).colorScheme.primaryContainer.withOpacity(selected ? 1 : 0), color: Theme.of(context).colorScheme.primaryContainer.withValues(alpha: selected ? 1 : 0),
borderRadius: BorderRadius.circular(selected ? 5 : 20), borderRadius: BorderRadius.circular(selected ? 5 : 20),
), ),
child: Padding( child: Padding(

View file

@ -95,7 +95,7 @@ class _SettingsScreenState extends ConsumerState<SettingsScreen> {
padding: const EdgeInsets.all(16.0), padding: const EdgeInsets.all(16.0),
child: IconButton.filledTonal( child: IconButton.filledTonal(
style: IconButton.styleFrom( style: IconButton.styleFrom(
backgroundColor: Theme.of(context).colorScheme.surface.withOpacity(0.8), backgroundColor: Theme.of(context).colorScheme.surface.withValues(alpha: 0.8),
), ),
onPressed: () => context.router.popBack(), onPressed: () => context.router.popBack(),
icon: Padding( icon: Padding(
@ -188,6 +188,7 @@ class _SettingsScreenState extends ConsumerState<SettingsScreen> {
), ),
ElevatedButton( ElevatedButton(
style: ElevatedButton.styleFrom().copyWith( style: ElevatedButton.styleFrom().copyWith(
iconColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onErrorContainer),
foregroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onErrorContainer), foregroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onErrorContainer),
backgroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.errorContainer), backgroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.errorContainer),
), ),

View file

@ -27,6 +27,7 @@ Future<void> showDefaultAlertDialog(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: Theme.of(context).colorScheme.errorContainer, backgroundColor: Theme.of(context).colorScheme.errorContainer,
foregroundColor: Theme.of(context).colorScheme.onErrorContainer, foregroundColor: Theme.of(context).colorScheme.onErrorContainer,
iconColor: Theme.of(context).colorScheme.onErrorContainer,
), ),
onPressed: () => accept.call(context), onPressed: () => accept.call(context),
child: Text(acceptTitle ?? "Accept"), child: Text(acceptTitle ?? "Accept"),
@ -61,6 +62,7 @@ Future<void> showDefaultActionDialog(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: Theme.of(context).colorScheme.primaryContainer, backgroundColor: Theme.of(context).colorScheme.primaryContainer,
foregroundColor: Theme.of(context).colorScheme.onPrimaryContainer, foregroundColor: Theme.of(context).colorScheme.onPrimaryContainer,
iconColor: Theme.of(context).colorScheme.onPrimaryContainer,
), ),
onPressed: () => accept.call(context), onPressed: () => accept.call(context),
child: Text(acceptTitle ?? "Accept"), child: Text(acceptTitle ?? "Accept"),

View file

@ -33,12 +33,13 @@ class _DefaultTitleBarState extends ConsumerState<DefaultTitleBar> with WindowLi
final brightness = widget.brightness ?? Theme.of(context).brightness; final brightness = widget.brightness ?? Theme.of(context).brightness;
final shadows = brightness == Brightness.dark final shadows = brightness == Brightness.dark
? [ ? [
BoxShadow(blurRadius: 1, spreadRadius: 1, color: Theme.of(context).colorScheme.surface.withOpacity(1)), BoxShadow(
BoxShadow(blurRadius: 8, spreadRadius: 2, color: Colors.black.withOpacity(0.2)), blurRadius: 1, spreadRadius: 1, color: Theme.of(context).colorScheme.surface.withValues(alpha: 1)),
BoxShadow(blurRadius: 3, spreadRadius: 2, color: Colors.black.withOpacity(0.3)), BoxShadow(blurRadius: 8, spreadRadius: 2, color: Colors.black.withValues(alpha: 0.2)),
BoxShadow(blurRadius: 3, spreadRadius: 2, color: Colors.black.withValues(alpha: 0.3)),
] ]
: <BoxShadow>[]; : <BoxShadow>[];
final iconColor = Theme.of(context).colorScheme.onSurface.withOpacity(0.65); final iconColor = Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.65);
return SizedBox( return SizedBox(
height: widget.height, height: widget.height,
child: switch (AdaptiveLayout.of(context).platform) { child: switch (AdaptiveLayout.of(context).platform) {
@ -47,7 +48,7 @@ class _DefaultTitleBarState extends ConsumerState<DefaultTitleBar> with WindowLi
children: [ children: [
Expanded( Expanded(
child: Container( child: Container(
color: Colors.black.withOpacity(0), color: Colors.black.withValues(alpha: 0),
child: DragToMoveArea( child: DragToMoveArea(
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
@ -77,8 +78,8 @@ class _DefaultTitleBarState extends ConsumerState<DefaultTitleBar> with WindowLi
return IconButton( return IconButton(
style: IconButton.styleFrom( style: IconButton.styleFrom(
hoverColor: brightness == Brightness.light hoverColor: brightness == Brightness.light
? Colors.black.withOpacity(0.1) ? Colors.black.withValues(alpha: 0.1)
: Colors.white.withOpacity(0.2), : Colors.white.withValues(alpha: 0.2),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2))), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2))),
onPressed: () async { onPressed: () async {
if (isMinimized) { if (isMinimized) {
@ -110,8 +111,8 @@ class _DefaultTitleBarState extends ConsumerState<DefaultTitleBar> with WindowLi
return IconButton( return IconButton(
style: IconButton.styleFrom( style: IconButton.styleFrom(
hoverColor: brightness == Brightness.light hoverColor: brightness == Brightness.light
? Colors.black.withOpacity(0.1) ? Colors.black.withValues(alpha: 0.1)
: Colors.white.withOpacity(0.2), : Colors.white.withValues(alpha: 0.2),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2)),
), ),
onPressed: () async { onPressed: () async {

View file

@ -62,7 +62,7 @@ class _DetailScaffoldState extends ConsumerState<DetailScaffold> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final padding = EdgeInsets.symmetric(horizontal: MediaQuery.sizeOf(context).width / 25); final padding = EdgeInsets.symmetric(horizontal: MediaQuery.sizeOf(context).width / 25);
final backGroundColor = Theme.of(context).colorScheme.surface.withOpacity(0.8); final backGroundColor = Theme.of(context).colorScheme.surface.withValues(alpha: 0.8);
final playerState = ref.watch(mediaPlaybackProvider.select((value) => value.state)); final playerState = ref.watch(mediaPlaybackProvider.select((value) => value.state));
final minHeight = 450.0.clamp(0, MediaQuery.sizeOf(context).height).toDouble(); final minHeight = 450.0.clamp(0, MediaQuery.sizeOf(context).height).toDouble();
final maxHeight = MediaQuery.sizeOf(context).height - 10; final maxHeight = MediaQuery.sizeOf(context).height - 10;
@ -114,7 +114,7 @@ class _DetailScaffoldState extends ConsumerState<DetailScaffold> {
Colors.white, Colors.white,
Colors.white, Colors.white,
Colors.white, Colors.white,
Colors.white.withOpacity(0), Colors.white.withValues(alpha: 0),
], ],
).createShader(bounds), ).createShader(bounds),
child: ConstrainedBox( child: ConstrainedBox(
@ -145,10 +145,10 @@ class _DetailScaffoldState extends ConsumerState<DetailScaffold> {
begin: Alignment.topCenter, begin: Alignment.topCenter,
end: Alignment.bottomCenter, end: Alignment.bottomCenter,
colors: [ colors: [
Theme.of(context).colorScheme.surface.withOpacity(0), Theme.of(context).colorScheme.surface.withValues(alpha: 0),
Theme.of(context).colorScheme.surface.withOpacity(0.10), Theme.of(context).colorScheme.surface.withValues(alpha: 0.10),
Theme.of(context).colorScheme.surface.withOpacity(0.35), Theme.of(context).colorScheme.surface.withValues(alpha: 0.35),
Theme.of(context).colorScheme.surface.withOpacity(0.85), Theme.of(context).colorScheme.surface.withValues(alpha: 0.85),
Theme.of(context).colorScheme.surface, Theme.of(context).colorScheme.surface,
], ],
), ),

View file

@ -59,7 +59,7 @@ class _FilePickerBarState extends ConsumerState<FilePickerBar> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final offColor = Theme.of(context).colorScheme.secondaryContainer; final offColor = Theme.of(context).colorScheme.secondaryContainer;
final onColor = Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.7); final onColor = Theme.of(context).colorScheme.secondaryContainer.withValues(alpha: 0.7);
final contentColor = Theme.of(context).colorScheme.onSecondaryContainer; final contentColor = Theme.of(context).colorScheme.onSecondaryContainer;
return DropTarget( return DropTarget(
enable: !inputField, enable: !inputField,

View file

@ -47,7 +47,7 @@ class FlatButton extends ConsumerWidget {
onDoubleTap: onDoubleTap, onDoubleTap: onDoubleTap,
onSecondaryTapDown: onSecondaryTapDown, onSecondaryTapDown: onSecondaryTapDown,
borderRadius: borderRadiusGeometry ?? BorderRadius.circular(10), borderRadius: borderRadiusGeometry ?? BorderRadius.circular(10),
splashColor: splashColor ?? Theme.of(context).colorScheme.primary.withOpacity(0.5), splashColor: splashColor ?? Theme.of(context).colorScheme.primary.withValues(alpha: 0.5),
hoverColor: showFeedback ? null : Colors.transparent, hoverColor: showFeedback ? null : Colors.transparent,
splashFactory: InkSparkle.splashFactory, splashFactory: InkSparkle.splashFactory,
), ),

View file

@ -20,7 +20,7 @@ class IntInputField extends ConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
return Card( return Card(
color: Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.25), color: Theme.of(context).colorScheme.secondaryContainer.withValues(alpha: 0.25),
elevation: 0, elevation: 0,
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 6), padding: const EdgeInsets.symmetric(horizontal: 6),

View file

@ -69,7 +69,7 @@ class _CarouselBannerState extends ConsumerState<CarouselBanner> {
begin: Alignment.bottomLeft, begin: Alignment.bottomLeft,
end: Alignment.topCenter, end: Alignment.topCenter,
colors: [ colors: [
ThemesData.of(context).dark.colorScheme.primaryContainer.withOpacity(0.85), ThemesData.of(context).dark.colorScheme.primaryContainer.withValues(alpha: 0.85),
Colors.transparent, Colors.transparent,
], ],
), ),
@ -144,7 +144,7 @@ class _CarouselBannerState extends ConsumerState<CarouselBanner> {
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border.all( border: Border.all(
color: Colors.white.withOpacity(0.1), color: Colors.white.withValues(alpha: 0.1),
width: 1.0, width: 1.0,
), ),
borderRadius: border), borderRadius: border),

View file

@ -52,7 +52,7 @@ class ChapterRow extends ConsumerWidget {
child: Card( child: Card(
elevation: 0, elevation: 0,
shadowColor: Colors.transparent, shadowColor: Colors.transparent,
color: Theme.of(context).cardColor.withOpacity(0.4), color: Theme.of(context).cardColor.withValues(alpha: 0.4),
child: Padding( child: Padding(
padding: const EdgeInsets.all(5), padding: const EdgeInsets.all(5),
child: Text( child: Text(

View file

@ -12,7 +12,7 @@ class ChipButton extends ConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
return Card( return Card(
color: Theme.of(context).colorScheme.onSurface.withOpacity(0.15), color: Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.15),
shadowColor: Colors.transparent, shadowColor: Colors.transparent,
child: FlatButton( child: FlatButton(
onTap: onPressed, onTap: onPressed,

View file

@ -35,7 +35,7 @@ class MediaHeader extends ConsumerWidget {
child: Material( child: Material(
elevation: 30, elevation: 30,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(150)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(150)),
shadowColor: Colors.black.withOpacity(0.3), shadowColor: Colors.black.withValues(alpha: 0.3),
color: Colors.transparent, color: Colors.transparent,
child: ConstrainedBox( child: ConstrainedBox(
constraints: BoxConstraints( constraints: BoxConstraints(

View file

@ -67,6 +67,7 @@ class MediaPlayButton extends ConsumerWidget {
ButtonStyle( ButtonStyle(
backgroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.primary), backgroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.primary),
foregroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onPrimary), foregroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onPrimary),
iconColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onPrimary),
), ),
Theme.of(context).colorScheme.onPrimary, Theme.of(context).colorScheme.onPrimary,
), ),

View file

@ -99,7 +99,7 @@ class _PosterImageState extends ConsumerState<PosterImage> {
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
side: BorderSide( side: BorderSide(
width: 1.0, width: 1.0,
color: Colors.white.withOpacity(0.10), color: Colors.white.withValues(alpha: 0.10),
), ),
borderRadius: FladderTheme.defaultShape.borderRadius, borderRadius: FladderTheme.defaultShape.borderRadius,
), ),
@ -133,7 +133,7 @@ class _PosterImageState extends ConsumerState<PosterImage> {
if (widget.selected == true) if (widget.selected == true)
Container( Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.black.withOpacity(0.15), color: Colors.black.withValues(alpha: 0.15),
border: Border.all(width: 3, color: Theme.of(context).colorScheme.primary), border: Border.all(width: 3, color: Theme.of(context).colorScheme.primary),
borderRadius: FladderTheme.defaultShape.borderRadius, borderRadius: FladderTheme.defaultShape.borderRadius,
), ),
@ -191,7 +191,7 @@ class _PosterImageState extends ConsumerState<PosterImage> {
shadowColor: Colors.transparent, shadowColor: Colors.transparent,
child: LinearProgressIndicator( child: LinearProgressIndicator(
minHeight: 7.5, minHeight: 7.5,
backgroundColor: Theme.of(context).colorScheme.onPrimary.withOpacity(0.5), backgroundColor: Theme.of(context).colorScheme.onPrimary.withValues(alpha: 0.5),
value: poster.userData.progress / 100, value: poster.userData.progress / 100,
borderRadius: BorderRadius.circular(2), borderRadius: BorderRadius.circular(2),
), ),
@ -213,7 +213,7 @@ class _PosterImageState extends ConsumerState<PosterImage> {
//Hover color overlay //Hover color overlay
Container( Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.black.withOpacity(0.55), color: Colors.black.withValues(alpha: 0.55),
border: Border.all(width: 3, color: Theme.of(context).colorScheme.primary), border: Border.all(width: 3, color: Theme.of(context).colorScheme.primary),
borderRadius: FladderTheme.defaultShape.borderRadius, borderRadius: FladderTheme.defaultShape.borderRadius,
)), )),

View file

@ -231,7 +231,7 @@ class EpisodePoster extends ConsumerWidget {
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
child: LinearProgressIndicator( child: LinearProgressIndicator(
minHeight: 6, minHeight: 6,
backgroundColor: Colors.black.withOpacity(0.75), backgroundColor: Colors.black.withValues(alpha: 0.75),
value: episode.userData.progress / 100, value: episode.userData.progress / 100,
), ),
), ),
@ -260,7 +260,7 @@ class EpisodePoster extends ConsumerWidget {
Icons.more_vert, Icons.more_vert,
color: Colors.white, color: Colors.white,
shadows: [ shadows: [
Shadow(color: Colors.black.withOpacity(0.45), blurRadius: 8.0), Shadow(color: Colors.black.withValues(alpha: 0.45), blurRadius: 8.0),
const Shadow(color: Colors.black, blurRadius: 16.0), const Shadow(color: Colors.black, blurRadius: 16.0),
const Shadow(color: Colors.black, blurRadius: 32.0), const Shadow(color: Colors.black, blurRadius: 32.0),
const Shadow(color: Colors.black, blurRadius: 64.0), const Shadow(color: Colors.black, blurRadius: 64.0),

View file

@ -44,11 +44,12 @@ class _ExpandingOverviewState extends ConsumerState<ExpandingOverview> {
stops: const [0, 1], stops: const [0, 1],
colors: [ colors: [
color, color,
color.withOpacity(!canExpand color.withValues(
? 1 alpha: !canExpand
: expanded
? 1 ? 1
: 0), : expanded
? 1
: 0),
], ],
).createShader(bounds), ).createShader(bounds),
child: HtmlWidget( child: HtmlWidget(

View file

@ -141,12 +141,13 @@ class _MediaBannerState extends ConsumerState<MediaBanner> {
foregroundDecoration: BoxDecoration( foregroundDecoration: BoxDecoration(
borderRadius: BorderRadius.circular(14), borderRadius: BorderRadius.circular(14),
border: Border.all( border: Border.all(
color: Colors.white.withOpacity(0.10), strokeAlign: BorderSide.strokeAlignInside), color: Colors.white.withValues(alpha: 0.10),
strokeAlign: BorderSide.strokeAlignInside),
gradient: LinearGradient( gradient: LinearGradient(
begin: Alignment.bottomLeft, begin: Alignment.bottomLeft,
end: Alignment.topCenter, end: Alignment.topCenter,
colors: [ colors: [
overlayColor.withOpacity(0.85), overlayColor.withValues(alpha: 0.85),
Colors.transparent, Colors.transparent,
], ],
), ),
@ -238,7 +239,7 @@ class _MediaBannerState extends ConsumerState<MediaBanner> {
maxLines: 2, maxLines: 2,
style: Theme.of(context).textTheme.titleMedium?.copyWith( style: Theme.of(context).textTheme.titleMedium?.copyWith(
shadows: shadows, shadows: shadows,
color: Colors.white.withOpacity(0.75), color: Colors.white.withValues(alpha: 0.75),
), ),
), ),
), ),

View file

@ -61,7 +61,7 @@ class PosterListItem extends ConsumerWidget {
height: 75 * ref.read(clientSettingsProvider.select((value) => value.posterSize)), height: 75 * ref.read(clientSettingsProvider.select((value) => value.posterSize)),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Theme.of(context).colorScheme.primary.withOpacity(selected == true ? 0.25 : 0), color: Theme.of(context).colorScheme.primary.withValues(alpha: selected == true ? 0.25 : 0),
borderRadius: BorderRadius.circular(6), borderRadius: BorderRadius.circular(6),
), ),
child: FlatButton( child: FlatButton(

View file

@ -60,7 +60,7 @@ class SeasonPoster extends ConsumerWidget {
padding: const EdgeInsets.all(4), padding: const EdgeInsets.all(4),
child: Container( child: Container(
child: Card( child: Card(
color: Theme.of(context).colorScheme.surface.withOpacity(0.65), color: Theme.of(context).colorScheme.surface.withValues(alpha: 0.65),
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12), padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12),
child: Text( child: Text(
@ -159,7 +159,7 @@ class SeasonPoster extends ConsumerWidget {
Icons.more_vert, Icons.more_vert,
color: Colors.white, color: Colors.white,
shadows: [ shadows: [
Shadow(color: Colors.black.withOpacity(0.45), blurRadius: 8.0), Shadow(color: Colors.black.withValues(alpha: 0.45), blurRadius: 8.0),
const Shadow(color: Colors.black, blurRadius: 16.0), const Shadow(color: Colors.black, blurRadius: 16.0),
const Shadow(color: Colors.black, blurRadius: 32.0), const Shadow(color: Colors.black, blurRadius: 32.0),
const Shadow(color: Colors.black, blurRadius: 64.0), const Shadow(color: Colors.black, blurRadius: 64.0),

View file

@ -63,7 +63,7 @@ class _OutlinedTextFieldState extends ConsumerState<OutlinedTextField> {
Color getColor() { Color getColor() {
if (widget.errorText != null) return Theme.of(context).colorScheme.errorContainer; if (widget.errorText != null) return Theme.of(context).colorScheme.errorContainer;
return Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.25); return Theme.of(context).colorScheme.secondaryContainer.withValues(alpha: 0.25);
} }
@override @override
@ -112,31 +112,31 @@ class _OutlinedTextFieldState extends ConsumerState<OutlinedTextField> {
decoration: InputDecoration( decoration: InputDecoration(
border: OutlineInputBorder( border: OutlineInputBorder(
borderSide: BorderSide( borderSide: BorderSide(
color: Theme.of(context).colorScheme.primary.withOpacity(0), color: Theme.of(context).colorScheme.primary.withValues(alpha: 0),
width: widget.borderWidth, width: widget.borderWidth,
), ),
), ),
enabledBorder: OutlineInputBorder( enabledBorder: OutlineInputBorder(
borderSide: BorderSide( borderSide: BorderSide(
color: Theme.of(context).colorScheme.primary.withOpacity(0), color: Theme.of(context).colorScheme.primary.withValues(alpha: 0),
width: widget.borderWidth, width: widget.borderWidth,
), ),
), ),
focusedBorder: OutlineInputBorder( focusedBorder: OutlineInputBorder(
borderSide: BorderSide( borderSide: BorderSide(
color: Theme.of(context).colorScheme.primary.withOpacity(0), color: Theme.of(context).colorScheme.primary.withValues(alpha: 0),
width: widget.borderWidth, width: widget.borderWidth,
), ),
), ),
errorBorder: OutlineInputBorder( errorBorder: OutlineInputBorder(
borderSide: BorderSide( borderSide: BorderSide(
color: Theme.of(context).colorScheme.primary.withOpacity(0), color: Theme.of(context).colorScheme.primary.withValues(alpha: 0),
width: widget.borderWidth, width: widget.borderWidth,
), ),
), ),
focusedErrorBorder: OutlineInputBorder( focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide( borderSide: BorderSide(
color: Theme.of(context).colorScheme.primary.withOpacity(0), color: Theme.of(context).colorScheme.primary.withValues(alpha: 0),
width: widget.borderWidth, width: widget.borderWidth,
), ),
), ),

View file

@ -153,7 +153,7 @@ class _SyncItemDetailsState extends ConsumerState<SyncItemDetails> {
CircularProgressIndicator( CircularProgressIndicator(
value: combinedStream.progress, value: combinedStream.progress,
strokeWidth: 8, strokeWidth: 8,
backgroundColor: Theme.of(context).colorScheme.surface.withOpacity(0.5), backgroundColor: Theme.of(context).colorScheme.surface.withValues(alpha: 0.5),
strokeCap: StrokeCap.round, strokeCap: StrokeCap.round,
color: combinedStream.status.color(context), color: combinedStream.status.color(context),
), ),
@ -212,6 +212,7 @@ class _SyncItemDetailsState extends ConsumerState<SyncItemDetails> {
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: Theme.of(context).colorScheme.errorContainer, backgroundColor: Theme.of(context).colorScheme.errorContainer,
foregroundColor: Theme.of(context).colorScheme.onErrorContainer, foregroundColor: Theme.of(context).colorScheme.onErrorContainer,
iconColor: Theme.of(context).colorScheme.onErrorContainer,
), ),
onPressed: () { onPressed: () {
showDefaultAlertDialog( showDefaultAlertDialog(

View file

@ -35,7 +35,7 @@ class SyncListItemState extends ConsumerState<SyncListItem> {
syncedItem: syncedItem, syncedItem: syncedItem,
child: Card( child: Card(
elevation: 1, elevation: 1,
color: Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.2), color: Theme.of(context).colorScheme.secondaryContainer.withValues(alpha: 0.2),
shadowColor: Colors.transparent, shadowColor: Colors.transparent,
child: Dismissible( child: Dismissible(
background: Container( background: Container(

View file

@ -24,7 +24,7 @@ class SyncLabel extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: status.color.withOpacity(0.15), color: status.color.withValues(alpha: 0.15),
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
), ),
child: Padding( child: Padding(
@ -109,7 +109,8 @@ class SyncSubtitle extends ConsumerWidget {
final children = syncItem.nestedChildren(ref); final children = syncItem.nestedChildren(ref);
final syncStatus = ref.watch(syncStatusesProvider(syncItem)).value ?? SyncStatus.partially; final syncStatus = ref.watch(syncStatusesProvider(syncItem)).value ?? SyncStatus.partially;
return Container( return Container(
decoration: BoxDecoration(color: syncStatus.color.withOpacity(0.15), borderRadius: BorderRadius.circular(10)), decoration:
BoxDecoration(color: syncStatus.color.withValues(alpha: 0.15), borderRadius: BorderRadius.circular(10)),
child: Material( child: Material(
color: const Color.fromARGB(0, 208, 130, 130), color: const Color.fromARGB(0, 208, 130, 130),
textStyle: textStyle:

View file

@ -22,7 +22,7 @@ class SyncStatusOverlay extends ConsumerWidget {
child: Card( child: Card(
elevation: 0, elevation: 0,
semanticContainer: false, semanticContainer: false,
color: Colors.black.withOpacity(0.6), color: Colors.black.withValues(alpha: 0.6),
child: Row( child: Row(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
@ -44,7 +44,7 @@ class SyncStatusOverlay extends ConsumerWidget {
child: Card( child: Card(
elevation: 0, elevation: 0,
semanticContainer: false, semanticContainer: false,
color: Colors.black.withOpacity(0.6), color: Colors.black.withValues(alpha: 0.6),
child: Row( child: Row(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,

View file

@ -130,7 +130,7 @@ class _VideoPlayerNextWrapperState extends ConsumerState<VideoPlayerNextWrapper>
Future<void> clearOverlaySettings() async { Future<void> clearOverlaySettings() async {
if (AdaptiveLayout.of(context).inputDevice != InputDevice.pointer) { if (AdaptiveLayout.of(context).inputDevice != InputDevice.pointer) {
ScreenBrightness().resetScreenBrightness(); ScreenBrightness().resetApplicationScreenBrightness();
} else { } else {
closeFullScreen(); closeFullScreen();
} }
@ -161,7 +161,7 @@ class _VideoPlayerNextWrapperState extends ConsumerState<VideoPlayerNextWrapper>
child: Stack( child: Stack(
children: [ children: [
Container( Container(
color: Theme.of(context).colorScheme.surfaceContainerLowest.withOpacity(0.2), color: Theme.of(context).colorScheme.surfaceContainerLowest.withValues(alpha: 0.2),
), ),
if (nextUp != null) if (nextUp != null)
AnimatedAlign( AnimatedAlign(

View file

@ -393,7 +393,7 @@ Future<void> showSubSelection(BuildContext context) {
final selected = playbackModel.mediaStreams?.defaultSubStreamIndex == subModel.index; final selected = playbackModel.mediaStreams?.defaultSubStreamIndex == subModel.index;
return ListTile( return ListTile(
title: Text(subModel.label(context)), title: Text(subModel.label(context)),
tileColor: selected ? Theme.of(context).colorScheme.primary.withOpacity(0.3) : null, tileColor: selected ? Theme.of(context).colorScheme.primary.withValues(alpha: 0.3) : null,
subtitle: subModel.language.isNotEmpty subtitle: subModel.language.isNotEmpty
? Opacity(opacity: 0.6, child: Text(subModel.language.capitalize())) ? Opacity(opacity: 0.6, child: Text(subModel.language.capitalize()))
: null, : null,
@ -434,7 +434,7 @@ Future<void> showAudioSelection(BuildContext context) {
final selected = playbackModel.mediaStreams?.defaultAudioStreamIndex == audioStream.index; final selected = playbackModel.mediaStreams?.defaultAudioStreamIndex == audioStream.index;
return ListTile( return ListTile(
title: Text(audioStream.label(context)), title: Text(audioStream.label(context)),
tileColor: selected ? Theme.of(context).colorScheme.primary.withOpacity(0.3) : null, tileColor: selected ? Theme.of(context).colorScheme.primary.withValues(alpha: 0.3) : null,
subtitle: audioStream.language.isNotEmpty subtitle: audioStream.language.isNotEmpty
? Opacity(opacity: 0.6, child: Text(audioStream.language.capitalize())) ? Opacity(opacity: 0.6, child: Text(audioStream.language.capitalize()))
: null, : null,

View file

@ -84,7 +84,7 @@ class _VideoPlayerSeekIndicatorState extends ConsumerState<VideoPlayerSeekIndica
child: Center( child: Center(
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.black.withOpacity(0.85), color: Colors.black.withValues(alpha: 0.85),
borderRadius: BorderRadius.circular(16), borderRadius: BorderRadius.circular(16),
), ),
child: Padding( child: Padding(

View file

@ -2,7 +2,6 @@ import 'dart:math' as math;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/models/items/chapters_model.dart'; import 'package:fladder/models/items/chapters_model.dart';
@ -163,8 +162,8 @@ class _ChapterProgressSliderState extends ConsumerState<VideoProgressBar> {
.clamp(1, constraints.maxWidth), .clamp(1, constraints.maxWidth),
height: sliderHeight, height: sliderHeight,
child: GappedContainerShape( child: GappedContainerShape(
activeColor: Theme.of(context).colorScheme.primary.withOpacity(0.5), activeColor: Theme.of(context).colorScheme.primary.withValues(alpha: 0.5),
inActiveColor: Theme.of(context).colorScheme.primary.withOpacity(0.5), inActiveColor: Theme.of(context).colorScheme.primary.withValues(alpha: 0.5),
thumbPosition: bufferFraction, thumbPosition: bufferFraction,
), ),
), ),
@ -196,7 +195,7 @@ class _ChapterProgressSliderState extends ConsumerState<VideoProgressBar> {
shape: BoxShape.circle, shape: BoxShape.circle,
color: activePosition color: activePosition
? Theme.of(context).colorScheme.onPrimary ? Theme.of(context).colorScheme.onPrimary
: Theme.of(context).colorScheme.onSurface.withOpacity(0.5), : Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.5),
), ),
height: constraints.maxHeight, height: constraints.maxHeight,
width: sliderHeight - (activePosition ? 2 : 4), width: sliderHeight - (activePosition ? 2 : 4),
@ -204,7 +203,7 @@ class _ChapterProgressSliderState extends ConsumerState<VideoProgressBar> {
), ),
); );
}, },
).whereNotNull(), ).nonNulls,
}, },
], ],
), ),

View file

@ -15,7 +15,7 @@ Future<void> showSubtitleControls({
}) async { }) async {
await showDialog( await showDialog(
context: context, context: context,
barrierColor: Colors.black.withOpacity(0.1), barrierColor: Colors.black.withValues(alpha: 0.1),
builder: (context) => AlertDialog( builder: (context) => AlertDialog(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
elevation: 0, elevation: 0,
@ -60,7 +60,7 @@ class _VideoSubtitleControlsState extends ConsumerState<VideoSubtitleControls> {
duration: const Duration(milliseconds: 250), duration: const Duration(milliseconds: 250),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16), borderRadius: BorderRadius.circular(16),
color: controlsHidden ? Theme.of(context).dialogBackgroundColor.withOpacity(0.75) : Colors.transparent, color: controlsHidden ? Theme.of(context).dialogBackgroundColor.withValues(alpha: 0.75) : Colors.transparent,
), ),
child: Padding( child: Padding(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
@ -220,8 +220,8 @@ class _VideoSubtitleControlsState extends ConsumerState<VideoSubtitleControls> {
const Icon(Icons.border_color_rounded), const Icon(Icons.border_color_rounded),
...[Colors.white, Colors.yellow, Colors.black, Colors.grey, Colors.transparent].map( ...[Colors.white, Colors.yellow, Colors.black, Colors.grey, Colors.transparent].map(
(e) => FlatButton( (e) => FlatButton(
onTap: () => onTap: () => provider
provider.setOutlineColor(e == Colors.transparent ? e : e.withOpacity(0.85)), .setOutlineColor(e == Colors.transparent ? e : e.withValues(alpha: 0.85)),
borderRadiusGeometry: BorderRadius.circular(5), borderRadiusGeometry: BorderRadius.circular(5),
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
child: Container( child: Container(
@ -284,7 +284,7 @@ class _VideoSubtitleControlsState extends ConsumerState<VideoSubtitleControls> {
divisions: 20, divisions: 20,
onChangeStart: (value) => setOpacity(const Key('backGroundOpacity')), onChangeStart: (value) => setOpacity(const Key('backGroundOpacity')),
onChangeEnd: (value) => setOpacity(null), onChangeEnd: (value) => setOpacity(null),
value: subSettings.backGroundColor.opacity.clamp(0, 1), value: subSettings.backGroundColor.a.clamp(0, 1),
onChanged: (value) => provider.setBackGroundOpacity(value), onChanged: (value) => provider.setBackGroundOpacity(value),
), ),
), ),
@ -293,7 +293,7 @@ class _VideoSubtitleControlsState extends ConsumerState<VideoSubtitleControls> {
minWidth: 35, minWidth: 35,
), ),
child: Text( child: Text(
subSettings.backGroundColor.opacity.toStringAsFixed(2), subSettings.backGroundColor.a.toStringAsFixed(2),
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),

View file

@ -5,7 +5,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:async/async.dart'; import 'package:async/async.dart';
import 'package:collection/collection.dart';
import 'package:ficonsax/ficonsax.dart'; import 'package:ficonsax/ficonsax.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:screen_brightness/screen_brightness.dart'; import 'package:screen_brightness/screen_brightness.dart';
@ -219,8 +218,8 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
begin: Alignment.topCenter, begin: Alignment.topCenter,
end: Alignment.bottomCenter, end: Alignment.bottomCenter,
colors: [ colors: [
Colors.black.withOpacity(0.8), Colors.black.withValues(alpha: 0.8),
Colors.black.withOpacity(0), Colors.black.withValues(alpha: 0),
], ],
)), )),
child: Padding( child: Padding(
@ -276,8 +275,8 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
begin: Alignment.bottomCenter, begin: Alignment.bottomCenter,
end: Alignment.topCenter, end: Alignment.topCenter,
colors: [ colors: [
Colors.black.withOpacity(0.8), Colors.black.withValues(alpha: 0.8),
Colors.black.withOpacity(0), Colors.black.withValues(alpha: 0),
], ],
)), )),
child: Padding( child: Padding(
@ -425,7 +424,7 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
details.whereNotNull().join(' - '), details.nonNulls.join(' - '),
style: Theme.of(context).textTheme.titleMedium?.copyWith( style: Theme.of(context).textTheme.titleMedium?.copyWith(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
shadows: [ shadows: [
@ -506,7 +505,7 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
textAlign: TextAlign.center, textAlign: TextAlign.center,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
color: Theme.of(context).colorScheme.surface.withOpacity(0.95), color: Theme.of(context).colorScheme.surface.withValues(alpha: 0.95),
), ),
textStyle: Theme.of(context).textTheme.labelLarge, textStyle: Theme.of(context).textTheme.labelLarge,
child: IconButton( child: IconButton(
@ -533,7 +532,7 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
textAlign: TextAlign.center, textAlign: TextAlign.center,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
color: Theme.of(context).colorScheme.surface.withOpacity(0.95), color: Theme.of(context).colorScheme.surface.withValues(alpha: 0.95),
), ),
textStyle: Theme.of(context).textTheme.labelLarge, textStyle: Theme.of(context).textTheme.labelLarge,
child: IconButton( child: IconButton(
@ -625,7 +624,7 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
Future<void> clearOverlaySettings() async { Future<void> clearOverlaySettings() async {
toggleOverlay(value: true); toggleOverlay(value: true);
if (AdaptiveLayout.of(context).inputDevice != InputDevice.pointer) { if (AdaptiveLayout.of(context).inputDevice != InputDevice.pointer) {
ScreenBrightness().resetScreenBrightness(); ScreenBrightness().resetApplicationScreenBrightness();
} else { } else {
disableFullScreen(); disableFullScreen();
} }

View file

@ -114,7 +114,7 @@ class FladderTheme {
), ),
buttonTheme: ButtonThemeData(shape: defaultShape), buttonTheme: ButtonThemeData(shape: defaultShape),
chipTheme: ChipThemeData( chipTheme: ChipThemeData(
side: BorderSide(width: 1, color: scheme?.onSurface.withOpacity(0.05) ?? Colors.white), side: BorderSide(width: 1, color: scheme?.onSurface.withValues(alpha: 0.05) ?? Colors.white),
shape: defaultShape, shape: defaultShape,
), ),
popupMenuTheme: PopupMenuThemeData( popupMenuTheme: PopupMenuThemeData(

View file

@ -13,7 +13,7 @@ class AbsorbEvents extends ConsumerWidget {
onDoubleTap: () {}, onDoubleTap: () {},
onTap: () {}, onTap: () {},
onLongPress: () {}, onLongPress: () {},
child: Container(color: Colors.black.withOpacity(0), child: child), child: Container(color: Colors.black.withValues(alpha: 0), child: child),
); );
} else { } else {
return child; return child;

View file

@ -2,6 +2,37 @@ import 'package:flutter/material.dart';
import 'package:fladder/util/localization_helper.dart'; import 'package:fladder/util/localization_helper.dart';
Color? colorFromJson(dynamic color) {
if (color == null) return null;
if (color is Map<String, dynamic>) {
return Color.from(
alpha: color['alpha'] ?? 1.0,
red: color['red'] ?? 1.0,
green: color['green'] ?? 1.0,
blue: color['blue'] ?? 1.0,
);
}
// Deprecated format (integer value)
if (color is int) {
return Color(color);
}
return null;
}
extension ColorExtensions on Color {
Map<String, dynamic> get toMap {
return {
'alpha': a,
'red': r,
'green': g,
'blue': b,
};
}
}
extension DynamicSchemeVariantExtension on DynamicSchemeVariant { extension DynamicSchemeVariantExtension on DynamicSchemeVariant {
String label(BuildContext context) => switch (this) { String label(BuildContext context) => switch (this) {
DynamicSchemeVariant.tonalSpot => context.localized.schemeSettingsTonalSpot, DynamicSchemeVariant.tonalSpot => context.localized.schemeSettingsTonalSpot,

View file

@ -29,7 +29,7 @@ class DebugBanner extends ConsumerWidget {
padding: const EdgeInsets.all(4.0), padding: const EdgeInsets.all(4.0),
child: Card( child: Card(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)),
color: Colors.purpleAccent.withOpacity(0.8), color: Colors.purpleAccent.withValues(alpha: 0.8),
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2),
child: Text( child: Text(

View file

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
class FloatingActionButtonAnimated extends ConsumerWidget { class FloatingActionButtonAnimated extends ConsumerWidget {

View file

@ -1,5 +1,3 @@
import 'package:collection/collection.dart';
extension DurationExtensions on Duration? { extension DurationExtensions on Duration? {
String? get humanize { String? get humanize {
if (this == null) return null; if (this == null) return null;
@ -7,7 +5,7 @@ extension DurationExtensions on Duration? {
final hours = duration.inHours != 0 ? '${duration.inHours.toString()}h' : null; final hours = duration.inHours != 0 ? '${duration.inHours.toString()}h' : null;
final minutes = duration.inMinutes % 60 != 0 ? '${duration.inMinutes % 60}m'.padLeft(3, '0') : null; final minutes = duration.inMinutes % 60 != 0 ? '${duration.inMinutes % 60}m'.padLeft(3, '0') : null;
final seconds = duration.inSeconds % 60 != 0 ? '${duration.inSeconds % 60}s'.padLeft(3, '0') : null; final seconds = duration.inSeconds % 60 != 0 ? '${duration.inSeconds % 60}s'.padLeft(3, '0') : null;
final result = [hours, minutes, seconds].whereNotNull().map((e) => e).join(' '); final result = [hours, minutes, seconds].nonNulls.map((e) => e).join(' ');
return result.isNotEmpty ? result : null; return result.isNotEmpty ? result : null;
} }
@ -18,7 +16,7 @@ extension DurationExtensions on Duration? {
final minutes = (duration.inMinutes % 60).toString().padLeft(2, '0'); final minutes = (duration.inMinutes % 60).toString().padLeft(2, '0');
final seconds = (duration.inHours == 0 ? duration.inSeconds % 60 : null)?.toString().padLeft(2, '0'); final seconds = (duration.inHours == 0 ? duration.inSeconds % 60 : null)?.toString().padLeft(2, '0');
final result = [hours, minutes, seconds].whereNotNull().map((e) => e).join(':'); final result = [hours, minutes, seconds].nonNulls.map((e) => e).join(':');
return result.isNotEmpty ? result : null; return result.isNotEmpty ? result : null;
} }

View file

@ -1,5 +1,6 @@
import 'package:collection/collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
@ -69,9 +70,12 @@ class _KeyedListViewState extends ConsumerState<KeyedListView> {
style: TextButton.styleFrom( style: TextButton.styleFrom(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
textStyle: Theme.of(context).textTheme.titleSmall?.copyWith(fontWeight: FontWeight.bold), textStyle: Theme.of(context).textTheme.titleSmall?.copyWith(fontWeight: FontWeight.bold),
iconColor: atPosition
? Theme.of(context).colorScheme.onSecondary
: Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.35),
foregroundColor: atPosition foregroundColor: atPosition
? Theme.of(context).colorScheme.onSecondary ? Theme.of(context).colorScheme.onSecondary
: Theme.of(context).colorScheme.onSurface.withOpacity(0.35), : Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.35),
), ),
onPressed: () { onPressed: () {
itemScrollController.scrollTo( itemScrollController.scrollTo(

View file

@ -24,7 +24,7 @@ class _MouseParkingState extends ConsumerState<MouseParking> {
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: const BorderRadius.only(topLeft: Radius.circular(20)), borderRadius: const BorderRadius.only(topLeft: Radius.circular(20)),
color: parked ? Theme.of(context).colorScheme.primary.withOpacity(0.5) : Colors.black12, color: parked ? Theme.of(context).colorScheme.primary.withValues(alpha: 0.5) : Colors.black12,
), ),
child: const Row( child: const Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,

View file

@ -1,5 +1,3 @@
import 'package:collection/collection.dart';
import 'package:fladder/models/items/item_shared_models.dart'; import 'package:fladder/models/items/item_shared_models.dart';
extension StringExtensions on String { extension StringExtensions on String {
@ -64,6 +62,6 @@ extension GenreExtensions on List<GenreItems> {
extension StringListExtension on List<String?> { extension StringListExtension on List<String?> {
String get detailsTitle { String get detailsTitle {
return whereNotNull().join(""); return nonNulls.join("");
} }
} }

View file

@ -43,7 +43,7 @@ class FladderAppBar extends StatelessWidget implements PreferredSize {
} else { } else {
return AppBar( return AppBar(
toolbarHeight: 0, toolbarHeight: 0,
backgroundColor: Theme.of(context).colorScheme.surface.withOpacity(0), backgroundColor: Theme.of(context).colorScheme.surface.withValues(alpha: 0),
scrolledUnderElevation: 0, scrolledUnderElevation: 0,
elevation: 0, elevation: 0,
systemOverlayStyle: const SystemUiOverlayStyle(), systemOverlayStyle: const SystemUiOverlayStyle(),

View file

@ -116,7 +116,7 @@ class _CurrentlyPlayingBarState extends ConsumerState<FloatingPlayerBar> {
opacity: showExpandButton ? 1 : 0, opacity: showExpandButton ? 1 : 0,
duration: const Duration(milliseconds: 125), duration: const Duration(milliseconds: 125),
child: Container( child: Container(
color: Colors.black.withOpacity(0.6), color: Colors.black.withValues(alpha: 0.6),
child: FlatButton( child: FlatButton(
onTap: () async => openFullScreenPlayer(), onTap: () async => openFullScreenPlayer(),
child: const Icon(Icons.keyboard_arrow_up_rounded), child: const Icon(Icons.keyboard_arrow_up_rounded),
@ -191,7 +191,7 @@ class _CurrentlyPlayingBarState extends ConsumerState<FloatingPlayerBar> {
), ),
LinearProgressIndicator( LinearProgressIndicator(
minHeight: 6, minHeight: 6,
backgroundColor: Colors.black.withOpacity(0.25), backgroundColor: Colors.black.withValues(alpha: 0.25),
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
value: progress.clamp(0, 1), value: progress.clamp(0, 1),
), ),

View file

@ -1,7 +1,9 @@
import 'package:fladder/util/widget_extensions.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/util/widget_extensions.dart';
class NavigationButton extends ConsumerStatefulWidget { class NavigationButton extends ConsumerStatefulWidget {
final String? label; final String? label;
final Widget selectedIcon; final Widget selectedIcon;
@ -58,10 +60,15 @@ class _NavigationButtonState extends ConsumerState<NavigationButton> {
elevation: const WidgetStatePropertyAll(0), elevation: const WidgetStatePropertyAll(0),
padding: const WidgetStatePropertyAll(EdgeInsets.zero), padding: const WidgetStatePropertyAll(EdgeInsets.zero),
backgroundColor: const WidgetStatePropertyAll(Colors.transparent), backgroundColor: const WidgetStatePropertyAll(Colors.transparent),
iconColor: WidgetStateProperty.resolveWith((states) {
return widget.selected
? Theme.of(context).colorScheme.primary
: Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.45);
}),
foregroundColor: WidgetStateProperty.resolveWith((states) { foregroundColor: WidgetStateProperty.resolveWith((states) {
return widget.selected return widget.selected
? Theme.of(context).colorScheme.primary ? Theme.of(context).colorScheme.primary
: Theme.of(context).colorScheme.onSurface.withOpacity(0.45); : Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.45);
})), })),
onPressed: widget.onPressed, onPressed: widget.onPressed,
child: AnimatedContainer( child: AnimatedContainer(
@ -94,7 +101,7 @@ class _NavigationButtonState extends ConsumerState<NavigationButton> {
width: widget.selected ? 14 : 0, width: widget.selected ? 14 : 0,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
color: Theme.of(context).colorScheme.primary.withOpacity(widget.selected ? 1 : 0), color: Theme.of(context).colorScheme.primary.withValues(alpha: widget.selected ? 1 : 0),
), ),
), ),
], ],

View file

@ -1,10 +1,12 @@
import 'package:flutter/material.dart';
import 'package:chopper/chopper.dart'; import 'package:chopper/chopper.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/models/item_base_model.dart'; import 'package:fladder/models/item_base_model.dart';
import 'package:fladder/providers/api_provider.dart'; import 'package:fladder/providers/api_provider.dart';
import 'package:fladder/util/localization_helper.dart'; import 'package:fladder/util/localization_helper.dart';
import 'package:fladder/widgets/shared/filled_button_await.dart'; import 'package:fladder/widgets/shared/filled_button_await.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
Future<Response<dynamic>?> showDeleteDialog(BuildContext context, ItemBaseModel item, WidgetRef ref) async { Future<Response<dynamic>?> showDeleteDialog(BuildContext context, ItemBaseModel item, WidgetRef ref) async {
Response<dynamic>? response; Response<dynamic>? response;
@ -23,6 +25,7 @@ Future<Response<dynamic>?> showDeleteDialog(BuildContext context, ItemBaseModel
style: FilledButton.styleFrom( style: FilledButton.styleFrom(
backgroundColor: Theme.of(context).colorScheme.errorContainer, backgroundColor: Theme.of(context).colorScheme.errorContainer,
foregroundColor: Theme.of(context).colorScheme.onErrorContainer, foregroundColor: Theme.of(context).colorScheme.onErrorContainer,
iconColor: Theme.of(context).colorScheme.onErrorContainer,
), ),
onPressed: () async { onPressed: () async {
response = await ref.read(jellyApiProvider).deleteItem(item.id); response = await ref.read(jellyApiProvider).deleteItem(item.id);

View file

@ -72,7 +72,7 @@ class AnimatedVisibilityIconState extends State<AnimatedVisibilityIcon> {
child: AnimatedContainer( child: AnimatedContainer(
duration: const Duration(milliseconds: 300), duration: const Duration(milliseconds: 300),
decoration: BoxDecoration( decoration: BoxDecoration(
color: (_currentFilledState ? widget.filledColor : widget.outlinedColor)?.withOpacity(0.2), color: (_currentFilledState ? widget.filledColor : widget.outlinedColor)?.withValues(alpha: 0.2),
shape: BoxShape.circle, shape: BoxShape.circle,
), ),
child: Padding( child: Padding(

View file

@ -20,9 +20,9 @@ IconData getBackIcon(BuildContext context) {
} }
final _shadows = [ final _shadows = [
BoxShadow(blurRadius: 1, spreadRadius: 1, color: Colors.black.withOpacity(0.2)), BoxShadow(blurRadius: 1, spreadRadius: 1, color: Colors.black.withValues(alpha: 0.2)),
BoxShadow(blurRadius: 4, spreadRadius: 4, color: Colors.black.withOpacity(0.1)), BoxShadow(blurRadius: 4, spreadRadius: 4, color: Colors.black.withValues(alpha: 0.1)),
BoxShadow(blurRadius: 16, spreadRadius: 6, color: Colors.black.withOpacity(0.2)), BoxShadow(blurRadius: 16, spreadRadius: 6, color: Colors.black.withValues(alpha: 0.2)),
]; ];
class ElevatedIconButton extends ConsumerWidget { class ElevatedIconButton extends ConsumerWidget {
@ -36,7 +36,7 @@ class ElevatedIconButton extends ConsumerWidget {
return IconButton( return IconButton(
onPressed: onPressed, onPressed: onPressed,
style: IconButtonTheme.of(context).style?.copyWith( style: IconButtonTheme.of(context).style?.copyWith(
backgroundColor: WidgetStatePropertyAll(color?.withOpacity(0.15)), backgroundColor: WidgetStatePropertyAll(color?.withValues(alpha: 0.15)),
), ),
color: color, color: color,
icon: Icon( icon: Icon(

View file

@ -295,13 +295,13 @@ class _CarouselViewState extends State<FladderCarousel> {
overlayColor: widget.overlayColor ?? overlayColor: widget.overlayColor ??
WidgetStateProperty.resolveWith((Set<WidgetState> states) { WidgetStateProperty.resolveWith((Set<WidgetState> states) {
if (states.contains(WidgetState.pressed)) { if (states.contains(WidgetState.pressed)) {
return theme.colorScheme.onSurface.withOpacity(0.1); return theme.colorScheme.onSurface.withValues(alpha: 0.1);
} }
if (states.contains(WidgetState.hovered)) { if (states.contains(WidgetState.hovered)) {
return theme.colorScheme.onSurface.withOpacity(0.08); return theme.colorScheme.onSurface.withValues(alpha: 0.08);
} }
if (states.contains(WidgetState.focused)) { if (states.contains(WidgetState.focused)) {
return theme.colorScheme.onSurface.withOpacity(0.1); return theme.colorScheme.onSurface.withValues(alpha: 0.1);
} }
return null; return null;
}), }),

View file

@ -28,7 +28,7 @@ class FladderScrollbar extends ConsumerWidget {
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),
color: info.isDragging color: info.isDragging
? Theme.of(context).colorScheme.secondary ? Theme.of(context).colorScheme.secondary
: Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.75), : Theme.of(context).colorScheme.secondaryContainer.withValues(alpha: 0.75),
), ),
duration: const Duration(milliseconds: 250), duration: const Duration(milliseconds: 250),
); );

View file

@ -95,6 +95,7 @@ class ItemActionButton extends ItemAction {
minimumSize: const WidgetStatePropertyAll(Size(50, 50)), minimumSize: const WidgetStatePropertyAll(Size(50, 50)),
elevation: const WidgetStatePropertyAll(0), elevation: const WidgetStatePropertyAll(0),
foregroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onSurface), foregroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onSurface),
iconColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onSurface),
), ),
onPressed: () { onPressed: () {
if (shouldPop) { if (shouldPop) {

View file

@ -16,7 +16,7 @@ Future<void> showModalSideSheet(
context: context, context: context,
transitionDuration: transitionDuration ?? const Duration(milliseconds: 200), transitionDuration: transitionDuration ?? const Duration(milliseconds: 200),
barrierDismissible: barrierDismissible, barrierDismissible: barrierDismissible,
barrierColor: Theme.of(context).colorScheme.scrim.withOpacity(0.3), barrierColor: Theme.of(context).colorScheme.scrim.withValues(alpha: 0.3),
barrierLabel: 'Material 3 side sheet', barrierLabel: 'Material 3 side sheet',
useRootNavigator: false, useRootNavigator: false,
transitionBuilder: (context, animation, secondaryAnimation, child) { transitionBuilder: (context, animation, secondaryAnimation, child) {

View file

@ -1,10 +1,12 @@
import 'dart:async'; import 'dart:async';
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/screens/shared/animated_fade_size.dart'; import 'package:fladder/screens/shared/animated_fade_size.dart';
import 'package:fladder/util/refresh_state.dart'; import 'package:fladder/util/refresh_state.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class SelectableIconButton extends ConsumerStatefulWidget { class SelectableIconButton extends ConsumerStatefulWidget {
final FutureOr<dynamic> Function() onPressed; final FutureOr<dynamic> Function() onPressed;
@ -36,6 +38,7 @@ class _SelectableIconButtonState extends ConsumerState<SelectableIconButton> {
child: ElevatedButton( child: ElevatedButton(
style: ButtonStyle( style: ButtonStyle(
backgroundColor: widget.selected ? WidgetStatePropertyAll(Theme.of(context).colorScheme.primary) : null, backgroundColor: widget.selected ? WidgetStatePropertyAll(Theme.of(context).colorScheme.primary) : null,
iconColor: widget.selected ? WidgetStatePropertyAll(Theme.of(context).colorScheme.onPrimary) : null,
foregroundColor: widget.selected ? WidgetStatePropertyAll(Theme.of(context).colorScheme.onPrimary) : null, foregroundColor: widget.selected ? WidgetStatePropertyAll(Theme.of(context).colorScheme.onPrimary) : null,
padding: const WidgetStatePropertyAll(EdgeInsets.zero), padding: const WidgetStatePropertyAll(EdgeInsets.zero),
), ),