mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-07 21:48:14 -08:00
chore: Fix dart deprecation messages
This commit is contained in:
parent
607dea3de1
commit
39a7537116
81 changed files with 258 additions and 195 deletions
|
|
@ -6,7 +6,6 @@ import 'package:flutter/foundation.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:dynamic_color/dynamic_color.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
|
@ -276,7 +275,7 @@ class _MainState extends ConsumerState<Main> with WindowListener, WidgetsBinding
|
|||
dragDevices: {
|
||||
...scrollBehaviour.dragDevices,
|
||||
mouseDrag ? PointerDeviceKind.mouse : null,
|
||||
}.whereNotNull().toSet(),
|
||||
}.nonNulls.toSet(),
|
||||
),
|
||||
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
||||
supportedLocales: AppLocalizations.supportedLocales,
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ class ErrorLogModel {
|
|||
"\n",
|
||||
"\n",
|
||||
stackTrace,
|
||||
].whereNotNull().join();
|
||||
].nonNulls.join();
|
||||
|
||||
String get clipBoard => [_label, content].toString();
|
||||
|
||||
|
|
|
|||
|
|
@ -1,14 +1,14 @@
|
|||
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_riverpod/flutter_riverpod.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/models/item_base_model.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';
|
||||
|
||||
class EditItemsProvider {
|
||||
|
|
@ -118,7 +118,7 @@ class ItemEditingModel {
|
|||
"OfficialRating": {
|
||||
for (String element in (editorInfo?.parentalRatingOptions?.map((e) => e.name).toSet()
|
||||
?..add(json?["OfficialRating"] as String?))
|
||||
?.whereNotNull()
|
||||
?.nonNulls
|
||||
.toList() ??
|
||||
[])
|
||||
element: (editedJson?["OfficialRating"] as String?) == element
|
||||
|
|
@ -126,7 +126,7 @@ class ItemEditingModel {
|
|||
"CustomRating": {
|
||||
for (String element in (editorInfo?.parentalRatingOptions?.map((e) => e.name).toSet()
|
||||
?..add(json?["CustomRating"] as String?))
|
||||
?.whereNotNull()
|
||||
?.nonNulls
|
||||
.toList() ??
|
||||
[])
|
||||
element: (editedJson?["CustomRating"] as String?) == element
|
||||
|
|
|
|||
|
|
@ -243,7 +243,7 @@ class AudioStreamModel extends StreamModel {
|
|||
}
|
||||
|
||||
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({
|
||||
super.name = 'Off',
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ class PlaybackModelHelper {
|
|||
trickPlay: syncedItem.trickPlayModel,
|
||||
mediaSegments: syncedItem.mediaSegments,
|
||||
media: Media(url: syncedItem.videoFile.path),
|
||||
queue: itemQueue.whereNotNull().toList(),
|
||||
queue: itemQueue.nonNulls.toList(),
|
||||
syncedQueue: children,
|
||||
mediaStreams: item.streamModel ?? syncedItemModel.streamModel,
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
// ignore_for_file: public_member_api_docs, sort_constructors_first
|
||||
import 'dart:convert';
|
||||
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/video_player_settings_provider.dart';
|
||||
import 'package:fladder/util/color_extensions.dart';
|
||||
|
||||
class SubtitleSettingsModel {
|
||||
final double fontSize;
|
||||
|
|
@ -58,11 +58,11 @@ class SubtitleSettingsModel {
|
|||
? [
|
||||
Shadow(
|
||||
blurRadius: 16,
|
||||
color: Colors.black.withOpacity(shadow),
|
||||
color: Colors.black.withValues(alpha: shadow),
|
||||
),
|
||||
Shadow(
|
||||
blurRadius: 8,
|
||||
color: Colors.black.withOpacity(shadow),
|
||||
color: Colors.black.withValues(alpha: shadow),
|
||||
),
|
||||
]
|
||||
: null,
|
||||
|
|
@ -92,10 +92,10 @@ class SubtitleSettingsModel {
|
|||
'fontSize': fontSize,
|
||||
'fontWeight': fontWeight.value,
|
||||
'verticalOffset': verticalOffset,
|
||||
'color': color.value,
|
||||
'outlineColor': outlineColor.value,
|
||||
'color': color.toMap,
|
||||
'outlineColor': outlineColor.toMap,
|
||||
'outlineSize': outlineSize,
|
||||
'backGroundColor': backGroundColor.value,
|
||||
'backGroundColor': backGroundColor.toMap,
|
||||
'shadow': shadow,
|
||||
};
|
||||
}
|
||||
|
|
@ -109,10 +109,10 @@ class SubtitleSettingsModel {
|
|||
fontSize: map['fontSize'] as double?,
|
||||
fontWeight: FontWeight.values.firstWhereOrNull((element) => element.index == map['fontWeight'] as int?),
|
||||
verticalOffset: map['verticalOffset'] as double?,
|
||||
color: map['color'] != null ? Color(map['color'] as int) : null,
|
||||
outlineColor: map['outlineColor'] != null ? Color(map['outlineColor'] as int) : null,
|
||||
color: colorFromJson(map['color']),
|
||||
outlineColor: colorFromJson(map['outlineColor']),
|
||||
outlineSize: map['outlineSize'] as double?,
|
||||
backGroundColor: map['backGroundColor'] != null ? Color(map['backGroundColor'] as int) : null,
|
||||
backGroundColor: colorFromJson(map['backGroundColor']),
|
||||
shadow: map['shadow'] as double?,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ class BookProviderModel {
|
|||
ImagesData? get cover => parentModel?.getPosters ?? book?.getPosters;
|
||||
|
||||
List<BookModel> get allBooks {
|
||||
if (chapters.isEmpty) return [book].whereNotNull().toList();
|
||||
if (chapters.isEmpty) return [book].nonNulls.toList();
|
||||
return chapters;
|
||||
}
|
||||
|
||||
|
|
@ -141,7 +141,7 @@ class BookDetailsProviderNotifier extends StateNotifier<BookProviderModel> {
|
|||
|
||||
state = state.copyWith(
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ class EpisodeDetailsProvider extends StateNotifier<EpisodeDetailModel> {
|
|||
.map(
|
||||
(e) => e.createItemModel(ref),
|
||||
)
|
||||
.whereNotNull()
|
||||
.nonNulls
|
||||
.whereType<EpisodeModel>()
|
||||
.toList();
|
||||
state = state.copyWith(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import 'package:chopper/chopper.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:fladder/models/item_base_model.dart';
|
||||
import 'package:fladder/providers/service_provider.dart';
|
||||
import 'package:fladder/providers/sync_provider.dart';
|
||||
|
|
@ -68,7 +67,7 @@ class SeriesDetailViewNotifier extends StateNotifier<SeriesModel?> {
|
|||
.map(
|
||||
(e) => e.createItemModel(ref),
|
||||
)
|
||||
.whereNotNull()
|
||||
.nonNulls
|
||||
.toList();
|
||||
state = seriesModel.copyWith(
|
||||
availableEpisodes: allChildren.whereType<EpisodeModel>().toList(),
|
||||
|
|
|
|||
|
|
@ -120,10 +120,10 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
|
|||
newLastIndices[viewModel.id] = (lastIndices ?? 0) + libraryItems.items.length;
|
||||
}
|
||||
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.sortingOption == SortingOptions.random) {
|
||||
newPosters = newPosters.random();
|
||||
|
|
@ -220,7 +220,7 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
|
|||
var tempState = state.copyWith();
|
||||
final genres = mappedList
|
||||
.expand((element) => element?.genres ?? <NameGuidPair>[])
|
||||
.whereNotNull()
|
||||
.nonNulls
|
||||
.sorted((a, b) => a.name!.toLowerCase().compareTo(b.name!.toLowerCase()));
|
||||
final tags = mappedList
|
||||
.expand((element) => element?.tags ?? <String>[])
|
||||
|
|
@ -437,7 +437,7 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
|
|||
final response = await api.collectionsCollectionIdItemsDelete(
|
||||
collectionId: state.nestedCurrentItem?.id, ids: state.selectedPosters.map((e) => e.id).toList());
|
||||
if (response.isSuccessful) {
|
||||
removeFromPosters([state.nestedCurrentItem?.id].whereNotNull().toList());
|
||||
removeFromPosters([state.nestedCurrentItem?.id].nonNulls.toList());
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
|
@ -445,9 +445,9 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
|
|||
Future<Response> removeSelectedFromPlaylist() async {
|
||||
final response = await api.playlistsPlaylistIdItemsDelete(
|
||||
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) {
|
||||
removeFromPosters([state.nestedCurrentItem?.id].whereNotNull().toList());
|
||||
removeFromPosters([state.nestedCurrentItem?.id].nonNulls.toList());
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
|
@ -463,7 +463,7 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
|
|||
|
||||
Future<Response> removeFromPlaylist({required List<ItemBaseModel> items}) async {
|
||||
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) {
|
||||
removeFromPosters(items.map((e) => e.id).toList());
|
||||
}
|
||||
|
|
@ -489,7 +489,7 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
|
|||
|
||||
void updateUserDataMain(UserData? userData) {
|
||||
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,
|
||||
);
|
||||
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 (shuffle || state.sortingOption == SortingOptions.random) {
|
||||
newPosters = newPosters.random();
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:screen_brightness/screen_brightness.dart';
|
||||
|
||||
|
|
@ -124,15 +125,15 @@ class BookViewerSettingsNotifier extends StateNotifier<BookViewerSettingsModel>
|
|||
screenBrightness: () => value,
|
||||
);
|
||||
if (state.screenBrightness != null) {
|
||||
ScreenBrightness().setScreenBrightness(state.screenBrightness!);
|
||||
ScreenBrightness().setSystemScreenBrightness(state.screenBrightness!);
|
||||
} else {
|
||||
ScreenBrightness().resetScreenBrightness();
|
||||
ScreenBrightness().resetApplicationScreenBrightness();
|
||||
}
|
||||
}
|
||||
|
||||
void setSavedBrightness() {
|
||||
if (state.screenBrightness != null) {
|
||||
ScreenBrightness().setScreenBrightness(state.screenBrightness!);
|
||||
ScreenBrightness().setSystemScreenBrightness(state.screenBrightness!);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ class SubtitleSettingsNotifier extends StateNotifier<SubtitleSettingsModel> {
|
|||
void setFontWeight(FontWeight? value) => state = state.copyWith(fontWeight: 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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,15 +33,15 @@ class VideoPlayerSettingsProviderNotifier extends StateNotifier<VideoPlayerSetti
|
|||
screenBrightness: value,
|
||||
);
|
||||
if (state.screenBrightness != null) {
|
||||
ScreenBrightness().setScreenBrightness(state.screenBrightness!);
|
||||
ScreenBrightness().setSystemScreenBrightness(state.screenBrightness!);
|
||||
} else {
|
||||
ScreenBrightness().resetScreenBrightness();
|
||||
ScreenBrightness().resetApplicationScreenBrightness();
|
||||
}
|
||||
}
|
||||
|
||||
void setSavedBrightness() {
|
||||
if (state.screenBrightness != null) {
|
||||
ScreenBrightness().setScreenBrightness(state.screenBrightness!);
|
||||
ScreenBrightness().setSystemScreenBrightness(state.screenBrightness!);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
import 'package:background_downloader/background_downloader.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
part 'background_download_provider.g.dart';
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
FileDownloader backgroundDownloader(BackgroundDownloaderRef ref) {
|
||||
FileDownloader backgroundDownloader(Ref ref) {
|
||||
return FileDownloader()
|
||||
..trackTasks()
|
||||
..configureNotification(
|
||||
|
|
|
|||
|
|
@ -359,7 +359,7 @@ class SyncNotifier extends StateNotifier<SyncSettingsModel> {
|
|||
return data.copyWith(
|
||||
primary: () => primary,
|
||||
logo: () => logo,
|
||||
backDrop: () => backdrops.whereNotNull().toList(),
|
||||
backDrop: () => backdrops.nonNulls.toList(),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -381,7 +381,7 @@ class SyncNotifier extends StateNotifier<SyncSettingsModel> {
|
|||
imageUrl: path.joinAll(["Chapters", fileName]),
|
||||
);
|
||||
}).toList();
|
||||
return saveChapters.whereNotNull().toList();
|
||||
return saveChapters.nonNulls.toList();
|
||||
}
|
||||
|
||||
Future<ImageData?> urlDataToFileData(ImageData? data, Directory directory, String fileName) async {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:chopper/chopper.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
import 'package:fladder/jellyfin/enum_models.dart';
|
||||
|
|
@ -14,7 +15,7 @@ import 'package:fladder/providers/sync_provider.dart';
|
|||
part 'user_provider.g.dart';
|
||||
|
||||
@riverpod
|
||||
bool showSyncButtonProvider(ShowSyncButtonProviderRef ref) {
|
||||
bool showSyncButtonProvider(Ref ref) {
|
||||
final userCanSync = ref.watch(userProvider.select((value) => value?.canDownload ?? false));
|
||||
final hasSyncedItems = ref.watch(syncProvider.select((value) => value.items.isNotEmpty));
|
||||
return userCanSync || hasSyncedItems;
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ class _DetailsScreenState extends ConsumerState<DetailsScreen> {
|
|||
tag: widget.id,
|
||||
child: Container(
|
||||
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
|
||||
child: Transform.translate(
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ class _BookViewerControlsState extends ConsumerState<BookViewerControls> {
|
|||
@override
|
||||
void dispose() {
|
||||
WakelockPlus.disable();
|
||||
ScreenBrightness().resetScreenBrightness();
|
||||
ScreenBrightness().resetApplicationScreenBrightness();
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge, overlays: []);
|
||||
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
|
||||
statusBarColor: Colors.transparent,
|
||||
|
|
@ -150,9 +150,9 @@ class _BookViewerControlsState extends ConsumerState<BookViewerControls> {
|
|||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
colors: [
|
||||
overlayColor.withOpacity(1),
|
||||
overlayColor.withOpacity(0.65),
|
||||
overlayColor.withOpacity(0),
|
||||
overlayColor.withValues(alpha: 1),
|
||||
overlayColor.withValues(alpha: 0.65),
|
||||
overlayColor.withValues(alpha: 0),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
@ -198,9 +198,9 @@ class _BookViewerControlsState extends ConsumerState<BookViewerControls> {
|
|||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
colors: [
|
||||
overlayColor.withOpacity(0),
|
||||
overlayColor.withOpacity(0.65),
|
||||
overlayColor.withOpacity(1),
|
||||
overlayColor.withValues(alpha: 0),
|
||||
overlayColor.withValues(alpha: 0.65),
|
||||
overlayColor.withValues(alpha: 1),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
@ -236,7 +236,7 @@ class _BookViewerControlsState extends ConsumerState<BookViewerControls> {
|
|||
Flexible(
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.black.withOpacity(0.7),
|
||||
color: Colors.black.withValues(alpha: 0.7),
|
||||
borderRadius: BorderRadius.circular(60),
|
||||
),
|
||||
child: Padding(
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ class CrashScreen extends ConsumerWidget {
|
|||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
Card(
|
||||
color: e.color.withOpacity(0.1),
|
||||
color: e.color.withValues(alpha: 0.1),
|
||||
margin: const EdgeInsets.symmetric(vertical: 12),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8),
|
||||
|
|
@ -90,7 +90,7 @@ class CrashScreen extends ConsumerWidget {
|
|||
children: [
|
||||
Expanded(
|
||||
child: Card(
|
||||
color: e.color.withOpacity(0.2),
|
||||
color: e.color.withValues(alpha: 0.2),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(4.0),
|
||||
child: Text(
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ import 'dart:async';
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:auto_route/auto_route.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import 'package:fladder/jellyfin/jellyfin_open_api.enums.swagger.dart';
|
||||
|
|
@ -179,7 +178,7 @@ class _DashboardScreenState extends ConsumerState<DashboardScreen> {
|
|||
posters: view.recentlyAdded,
|
||||
),
|
||||
)),
|
||||
].whereNotNull().toList().addInBetween(const SliverToBoxAdapter(child: SizedBox(height: 16))),
|
||||
].nonNulls.toList().addInBetween(const SliverToBoxAdapter(child: SizedBox(height: 16))),
|
||||
const DefautlSliverBottomPadding(),
|
||||
],
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
backDrops: details.cover,
|
||||
content: (padding) => details.book != null
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
class LabelTitleItem extends ConsumerWidget {
|
||||
|
|
@ -32,7 +31,7 @@ class LabelTitleItem extends ConsumerWidget {
|
|||
label!,
|
||||
)
|
||||
: content!,
|
||||
].whereNotNull().toList(),
|
||||
].nonNulls.toList(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ class EmptyItem extends ConsumerWidget {
|
|||
shape: RoundedRectangleBorder(
|
||||
side: BorderSide(
|
||||
width: 1.0,
|
||||
color: Colors.white.withOpacity(0.10),
|
||||
color: Colors.white.withValues(alpha: 0.10),
|
||||
),
|
||||
borderRadius: FladderTheme.defaultShape.borderRadius,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -1,4 +1,9 @@
|
|||
import 'package:flutter/material.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/providers/items/person_details_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/widget_extensions.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 {
|
||||
final Person person;
|
||||
|
|
@ -37,6 +39,7 @@ class _PersonDetailScreenState extends ConsumerState<PersonDetailScreen> {
|
|||
backDrops: [...?details?.movies, ...?details?.series].random().firstOrNull?.images,
|
||||
content: (padding) => Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
SizedBox(height: MediaQuery.of(context).size.height / 6),
|
||||
Padding(
|
||||
|
|
@ -89,10 +92,6 @@ class _PersonDetailScreenState extends ConsumerState<PersonDetailScreen> {
|
|||
Text("Birthday: ${DateFormat.yMEd().format(details?.dateOfBirth ?? DateTime.now()).toString()}"),
|
||||
if (details?.age != null) Text("Age: ${details?.age}"),
|
||||
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)
|
||||
PosterRow(contentPadding: padding, posters: details?.movies ?? [], label: "Movies"),
|
||||
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),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:auto_route/auto_route.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:ficonsax/ficonsax.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
|
|
@ -76,7 +75,7 @@ class HomeScreen extends ConsumerWidget {
|
|||
child: AutoRouter(
|
||||
builder: (context, child) {
|
||||
return NavigationScaffold(
|
||||
destinations: destinations.whereNotNull().toList(),
|
||||
destinations: destinations.nonNulls.toList(),
|
||||
currentRouteName: context.router.current.name,
|
||||
nestedChild: child,
|
||||
);
|
||||
|
|
|
|||
|
|
@ -515,7 +515,7 @@ class _LibrarySearchScreenState extends ConsumerState<LibrarySearchScreen> {
|
|||
),
|
||||
if (librarySearchResults.fetchingItems) ...[
|
||||
Container(
|
||||
color: Colors.black.withOpacity(0.1),
|
||||
color: Colors.black.withValues(alpha: 0.1),
|
||||
),
|
||||
Center(
|
||||
child: Container(
|
||||
|
|
|
|||
|
|
@ -71,7 +71,9 @@ class LibrarySavedFiltersDialogue extends ConsumerWidget {
|
|||
tooltip: context.localized.defaultFilterForLibrary,
|
||||
style: ButtonStyle(
|
||||
backgroundColor: WidgetStatePropertyAll(
|
||||
filter.isFavourite ? Colors.yellowAccent.shade700.withOpacity(0.5) : null,
|
||||
filter.isFavourite
|
||||
? Colors.yellowAccent.shade700.withValues(alpha: 0.5)
|
||||
: null,
|
||||
),
|
||||
),
|
||||
onPressed: () =>
|
||||
|
|
@ -107,6 +109,8 @@ class LibrarySavedFiltersDialogue extends ConsumerWidget {
|
|||
style: ButtonStyle(
|
||||
backgroundColor:
|
||||
WidgetStatePropertyAll(Theme.of(context).colorScheme.errorContainer),
|
||||
iconColor:
|
||||
WidgetStatePropertyAll(Theme.of(context).colorScheme.onErrorContainer),
|
||||
foregroundColor:
|
||||
WidgetStatePropertyAll(Theme.of(context).colorScheme.onErrorContainer),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@ class LoginEditUser extends ConsumerWidget {
|
|||
child: ElevatedButton.icon(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.red,
|
||||
iconColor: Colors.white,
|
||||
foregroundColor: Colors.white,
|
||||
),
|
||||
onPressed: () async {
|
||||
|
|
|
|||
|
|
@ -136,10 +136,10 @@ class _PhotoViewerControllsState extends ConsumerState<PhotoViewerControls> with
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final gradient = [
|
||||
Colors.black.withOpacity(0.6),
|
||||
Colors.black.withOpacity(0.3),
|
||||
Colors.black.withOpacity(0.1),
|
||||
Colors.black.withOpacity(0.0),
|
||||
Colors.black.withValues(alpha: 0.6),
|
||||
Colors.black.withValues(alpha: 0.3),
|
||||
Colors.black.withValues(alpha: 0.1),
|
||||
Colors.black.withValues(alpha: 0.0),
|
||||
];
|
||||
|
||||
final padding = MediaQuery.of(context).padding;
|
||||
|
|
@ -188,9 +188,12 @@ class _PhotoViewerControllsState extends ConsumerState<PhotoViewerControls> with
|
|||
.textTheme
|
||||
.titleMedium
|
||||
?.copyWith(fontWeight: FontWeight.bold, shadows: [
|
||||
BoxShadow(blurRadius: 1, spreadRadius: 1, color: Colors.black.withOpacity(0.7)),
|
||||
BoxShadow(blurRadius: 4, spreadRadius: 4, color: Colors.black.withOpacity(0.4)),
|
||||
BoxShadow(blurRadius: 20, spreadRadius: 6, color: Colors.black.withOpacity(0.2)),
|
||||
BoxShadow(
|
||||
blurRadius: 1, spreadRadius: 1, color: Colors.black.withValues(alpha: 0.7)),
|
||||
BoxShadow(
|
||||
blurRadius: 4, spreadRadius: 4, color: Colors.black.withValues(alpha: 0.4)),
|
||||
BoxShadow(
|
||||
blurRadius: 20, spreadRadius: 6, color: Colors.black.withValues(alpha: 0.2)),
|
||||
]),
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -384,8 +384,8 @@ class _PhotoViewerScreenState extends ConsumerState<PhotoViewerScreen> with Widg
|
|||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
colors: [
|
||||
Colors.black.withOpacity(0.5),
|
||||
Colors.black.withOpacity(0),
|
||||
Colors.black.withValues(alpha: 0.5),
|
||||
Colors.black.withValues(alpha: 0),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -226,7 +226,8 @@ class _SimpleVideoPlayerState extends ConsumerState<SimpleVideoPlayer> with Wind
|
|||
icon: Icon(
|
||||
player.lastState.playing ? IconsaxBold.pause_circle : IconsaxBold.play_circle,
|
||||
shadows: [
|
||||
BoxShadow(blurRadius: 16, spreadRadius: 2, color: Colors.black.withOpacity(0.15))
|
||||
BoxShadow(
|
||||
blurRadius: 16, spreadRadius: 2, color: Colors.black.withValues(alpha: 0.15))
|
||||
],
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ class SettingsListTile extends StatelessWidget {
|
|||
child: AnimatedContainer(
|
||||
duration: const Duration(milliseconds: 125),
|
||||
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),
|
||||
),
|
||||
child: Padding(
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ class _SettingsScreenState extends ConsumerState<SettingsScreen> {
|
|||
padding: const EdgeInsets.all(16.0),
|
||||
child: IconButton.filledTonal(
|
||||
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(),
|
||||
icon: Padding(
|
||||
|
|
@ -188,6 +188,7 @@ class _SettingsScreenState extends ConsumerState<SettingsScreen> {
|
|||
),
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom().copyWith(
|
||||
iconColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onErrorContainer),
|
||||
foregroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onErrorContainer),
|
||||
backgroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.errorContainer),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ Future<void> showDefaultAlertDialog(
|
|||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Theme.of(context).colorScheme.errorContainer,
|
||||
foregroundColor: Theme.of(context).colorScheme.onErrorContainer,
|
||||
iconColor: Theme.of(context).colorScheme.onErrorContainer,
|
||||
),
|
||||
onPressed: () => accept.call(context),
|
||||
child: Text(acceptTitle ?? "Accept"),
|
||||
|
|
@ -61,6 +62,7 @@ Future<void> showDefaultActionDialog(
|
|||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Theme.of(context).colorScheme.primaryContainer,
|
||||
foregroundColor: Theme.of(context).colorScheme.onPrimaryContainer,
|
||||
iconColor: Theme.of(context).colorScheme.onPrimaryContainer,
|
||||
),
|
||||
onPressed: () => accept.call(context),
|
||||
child: Text(acceptTitle ?? "Accept"),
|
||||
|
|
|
|||
|
|
@ -33,12 +33,13 @@ class _DefaultTitleBarState extends ConsumerState<DefaultTitleBar> with WindowLi
|
|||
final brightness = widget.brightness ?? Theme.of(context).brightness;
|
||||
final shadows = brightness == Brightness.dark
|
||||
? [
|
||||
BoxShadow(blurRadius: 1, spreadRadius: 1, color: Theme.of(context).colorScheme.surface.withOpacity(1)),
|
||||
BoxShadow(blurRadius: 8, spreadRadius: 2, color: Colors.black.withOpacity(0.2)),
|
||||
BoxShadow(blurRadius: 3, spreadRadius: 2, color: Colors.black.withOpacity(0.3)),
|
||||
BoxShadow(
|
||||
blurRadius: 1, spreadRadius: 1, color: Theme.of(context).colorScheme.surface.withValues(alpha: 1)),
|
||||
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>[];
|
||||
final iconColor = Theme.of(context).colorScheme.onSurface.withOpacity(0.65);
|
||||
final iconColor = Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.65);
|
||||
return SizedBox(
|
||||
height: widget.height,
|
||||
child: switch (AdaptiveLayout.of(context).platform) {
|
||||
|
|
@ -47,7 +48,7 @@ class _DefaultTitleBarState extends ConsumerState<DefaultTitleBar> with WindowLi
|
|||
children: [
|
||||
Expanded(
|
||||
child: Container(
|
||||
color: Colors.black.withOpacity(0),
|
||||
color: Colors.black.withValues(alpha: 0),
|
||||
child: DragToMoveArea(
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
|
|
@ -77,8 +78,8 @@ class _DefaultTitleBarState extends ConsumerState<DefaultTitleBar> with WindowLi
|
|||
return IconButton(
|
||||
style: IconButton.styleFrom(
|
||||
hoverColor: brightness == Brightness.light
|
||||
? Colors.black.withOpacity(0.1)
|
||||
: Colors.white.withOpacity(0.2),
|
||||
? Colors.black.withValues(alpha: 0.1)
|
||||
: Colors.white.withValues(alpha: 0.2),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2))),
|
||||
onPressed: () async {
|
||||
if (isMinimized) {
|
||||
|
|
@ -110,8 +111,8 @@ class _DefaultTitleBarState extends ConsumerState<DefaultTitleBar> with WindowLi
|
|||
return IconButton(
|
||||
style: IconButton.styleFrom(
|
||||
hoverColor: brightness == Brightness.light
|
||||
? Colors.black.withOpacity(0.1)
|
||||
: Colors.white.withOpacity(0.2),
|
||||
? Colors.black.withValues(alpha: 0.1)
|
||||
: Colors.white.withValues(alpha: 0.2),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2)),
|
||||
),
|
||||
onPressed: () async {
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ class _DetailScaffoldState extends ConsumerState<DetailScaffold> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
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 minHeight = 450.0.clamp(0, MediaQuery.sizeOf(context).height).toDouble();
|
||||
final maxHeight = MediaQuery.sizeOf(context).height - 10;
|
||||
|
|
@ -114,7 +114,7 @@ class _DetailScaffoldState extends ConsumerState<DetailScaffold> {
|
|||
Colors.white,
|
||||
Colors.white,
|
||||
Colors.white,
|
||||
Colors.white.withOpacity(0),
|
||||
Colors.white.withValues(alpha: 0),
|
||||
],
|
||||
).createShader(bounds),
|
||||
child: ConstrainedBox(
|
||||
|
|
@ -145,10 +145,10 @@ class _DetailScaffoldState extends ConsumerState<DetailScaffold> {
|
|||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
colors: [
|
||||
Theme.of(context).colorScheme.surface.withOpacity(0),
|
||||
Theme.of(context).colorScheme.surface.withOpacity(0.10),
|
||||
Theme.of(context).colorScheme.surface.withOpacity(0.35),
|
||||
Theme.of(context).colorScheme.surface.withOpacity(0.85),
|
||||
Theme.of(context).colorScheme.surface.withValues(alpha: 0),
|
||||
Theme.of(context).colorScheme.surface.withValues(alpha: 0.10),
|
||||
Theme.of(context).colorScheme.surface.withValues(alpha: 0.35),
|
||||
Theme.of(context).colorScheme.surface.withValues(alpha: 0.85),
|
||||
Theme.of(context).colorScheme.surface,
|
||||
],
|
||||
),
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ class _FilePickerBarState extends ConsumerState<FilePickerBar> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
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;
|
||||
return DropTarget(
|
||||
enable: !inputField,
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ class FlatButton extends ConsumerWidget {
|
|||
onDoubleTap: onDoubleTap,
|
||||
onSecondaryTapDown: onSecondaryTapDown,
|
||||
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,
|
||||
splashFactory: InkSparkle.splashFactory,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ class IntInputField extends ConsumerWidget {
|
|||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
return Card(
|
||||
color: Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.25),
|
||||
color: Theme.of(context).colorScheme.secondaryContainer.withValues(alpha: 0.25),
|
||||
elevation: 0,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 6),
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ class _CarouselBannerState extends ConsumerState<CarouselBanner> {
|
|||
begin: Alignment.bottomLeft,
|
||||
end: Alignment.topCenter,
|
||||
colors: [
|
||||
ThemesData.of(context).dark.colorScheme.primaryContainer.withOpacity(0.85),
|
||||
ThemesData.of(context).dark.colorScheme.primaryContainer.withValues(alpha: 0.85),
|
||||
Colors.transparent,
|
||||
],
|
||||
),
|
||||
|
|
@ -144,7 +144,7 @@ class _CarouselBannerState extends ConsumerState<CarouselBanner> {
|
|||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: Colors.white.withOpacity(0.1),
|
||||
color: Colors.white.withValues(alpha: 0.1),
|
||||
width: 1.0,
|
||||
),
|
||||
borderRadius: border),
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ class ChapterRow extends ConsumerWidget {
|
|||
child: Card(
|
||||
elevation: 0,
|
||||
shadowColor: Colors.transparent,
|
||||
color: Theme.of(context).cardColor.withOpacity(0.4),
|
||||
color: Theme.of(context).cardColor.withValues(alpha: 0.4),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(5),
|
||||
child: Text(
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ class ChipButton extends ConsumerWidget {
|
|||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
return Card(
|
||||
color: Theme.of(context).colorScheme.onSurface.withOpacity(0.15),
|
||||
color: Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.15),
|
||||
shadowColor: Colors.transparent,
|
||||
child: FlatButton(
|
||||
onTap: onPressed,
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ class MediaHeader extends ConsumerWidget {
|
|||
child: Material(
|
||||
elevation: 30,
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(150)),
|
||||
shadowColor: Colors.black.withOpacity(0.3),
|
||||
shadowColor: Colors.black.withValues(alpha: 0.3),
|
||||
color: Colors.transparent,
|
||||
child: ConstrainedBox(
|
||||
constraints: BoxConstraints(
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@ class MediaPlayButton extends ConsumerWidget {
|
|||
ButtonStyle(
|
||||
backgroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.primary),
|
||||
foregroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onPrimary),
|
||||
iconColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onPrimary),
|
||||
),
|
||||
Theme.of(context).colorScheme.onPrimary,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ class _PosterImageState extends ConsumerState<PosterImage> {
|
|||
shape: RoundedRectangleBorder(
|
||||
side: BorderSide(
|
||||
width: 1.0,
|
||||
color: Colors.white.withOpacity(0.10),
|
||||
color: Colors.white.withValues(alpha: 0.10),
|
||||
),
|
||||
borderRadius: FladderTheme.defaultShape.borderRadius,
|
||||
),
|
||||
|
|
@ -133,7 +133,7 @@ class _PosterImageState extends ConsumerState<PosterImage> {
|
|||
if (widget.selected == true)
|
||||
Container(
|
||||
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),
|
||||
borderRadius: FladderTheme.defaultShape.borderRadius,
|
||||
),
|
||||
|
|
@ -191,7 +191,7 @@ class _PosterImageState extends ConsumerState<PosterImage> {
|
|||
shadowColor: Colors.transparent,
|
||||
child: LinearProgressIndicator(
|
||||
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,
|
||||
borderRadius: BorderRadius.circular(2),
|
||||
),
|
||||
|
|
@ -213,7 +213,7 @@ class _PosterImageState extends ConsumerState<PosterImage> {
|
|||
//Hover color overlay
|
||||
Container(
|
||||
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),
|
||||
borderRadius: FladderTheme.defaultShape.borderRadius,
|
||||
)),
|
||||
|
|
|
|||
|
|
@ -231,7 +231,7 @@ class EpisodePoster extends ConsumerWidget {
|
|||
alignment: Alignment.bottomCenter,
|
||||
child: LinearProgressIndicator(
|
||||
minHeight: 6,
|
||||
backgroundColor: Colors.black.withOpacity(0.75),
|
||||
backgroundColor: Colors.black.withValues(alpha: 0.75),
|
||||
value: episode.userData.progress / 100,
|
||||
),
|
||||
),
|
||||
|
|
@ -260,7 +260,7 @@ class EpisodePoster extends ConsumerWidget {
|
|||
Icons.more_vert,
|
||||
color: Colors.white,
|
||||
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: 32.0),
|
||||
const Shadow(color: Colors.black, blurRadius: 64.0),
|
||||
|
|
|
|||
|
|
@ -44,11 +44,12 @@ class _ExpandingOverviewState extends ConsumerState<ExpandingOverview> {
|
|||
stops: const [0, 1],
|
||||
colors: [
|
||||
color,
|
||||
color.withOpacity(!canExpand
|
||||
? 1
|
||||
: expanded
|
||||
color.withValues(
|
||||
alpha: !canExpand
|
||||
? 1
|
||||
: 0),
|
||||
: expanded
|
||||
? 1
|
||||
: 0),
|
||||
],
|
||||
).createShader(bounds),
|
||||
child: HtmlWidget(
|
||||
|
|
|
|||
|
|
@ -141,12 +141,13 @@ class _MediaBannerState extends ConsumerState<MediaBanner> {
|
|||
foregroundDecoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
border: Border.all(
|
||||
color: Colors.white.withOpacity(0.10), strokeAlign: BorderSide.strokeAlignInside),
|
||||
color: Colors.white.withValues(alpha: 0.10),
|
||||
strokeAlign: BorderSide.strokeAlignInside),
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.bottomLeft,
|
||||
end: Alignment.topCenter,
|
||||
colors: [
|
||||
overlayColor.withOpacity(0.85),
|
||||
overlayColor.withValues(alpha: 0.85),
|
||||
Colors.transparent,
|
||||
],
|
||||
),
|
||||
|
|
@ -238,7 +239,7 @@ class _MediaBannerState extends ConsumerState<MediaBanner> {
|
|||
maxLines: 2,
|
||||
style: Theme.of(context).textTheme.titleMedium?.copyWith(
|
||||
shadows: shadows,
|
||||
color: Colors.white.withOpacity(0.75),
|
||||
color: Colors.white.withValues(alpha: 0.75),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ class PosterListItem extends ConsumerWidget {
|
|||
height: 75 * ref.read(clientSettingsProvider.select((value) => value.posterSize)),
|
||||
child: Container(
|
||||
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),
|
||||
),
|
||||
child: FlatButton(
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ class SeasonPoster extends ConsumerWidget {
|
|||
padding: const EdgeInsets.all(4),
|
||||
child: Container(
|
||||
child: Card(
|
||||
color: Theme.of(context).colorScheme.surface.withOpacity(0.65),
|
||||
color: Theme.of(context).colorScheme.surface.withValues(alpha: 0.65),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12),
|
||||
child: Text(
|
||||
|
|
@ -159,7 +159,7 @@ class SeasonPoster extends ConsumerWidget {
|
|||
Icons.more_vert,
|
||||
color: Colors.white,
|
||||
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: 32.0),
|
||||
const Shadow(color: Colors.black, blurRadius: 64.0),
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ class _OutlinedTextFieldState extends ConsumerState<OutlinedTextField> {
|
|||
|
||||
Color getColor() {
|
||||
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
|
||||
|
|
@ -112,31 +112,31 @@ class _OutlinedTextFieldState extends ConsumerState<OutlinedTextField> {
|
|||
decoration: InputDecoration(
|
||||
border: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Theme.of(context).colorScheme.primary.withOpacity(0),
|
||||
color: Theme.of(context).colorScheme.primary.withValues(alpha: 0),
|
||||
width: widget.borderWidth,
|
||||
),
|
||||
),
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Theme.of(context).colorScheme.primary.withOpacity(0),
|
||||
color: Theme.of(context).colorScheme.primary.withValues(alpha: 0),
|
||||
width: widget.borderWidth,
|
||||
),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Theme.of(context).colorScheme.primary.withOpacity(0),
|
||||
color: Theme.of(context).colorScheme.primary.withValues(alpha: 0),
|
||||
width: widget.borderWidth,
|
||||
),
|
||||
),
|
||||
errorBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Theme.of(context).colorScheme.primary.withOpacity(0),
|
||||
color: Theme.of(context).colorScheme.primary.withValues(alpha: 0),
|
||||
width: widget.borderWidth,
|
||||
),
|
||||
),
|
||||
focusedErrorBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Theme.of(context).colorScheme.primary.withOpacity(0),
|
||||
color: Theme.of(context).colorScheme.primary.withValues(alpha: 0),
|
||||
width: widget.borderWidth,
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ class _SyncItemDetailsState extends ConsumerState<SyncItemDetails> {
|
|||
CircularProgressIndicator(
|
||||
value: combinedStream.progress,
|
||||
strokeWidth: 8,
|
||||
backgroundColor: Theme.of(context).colorScheme.surface.withOpacity(0.5),
|
||||
backgroundColor: Theme.of(context).colorScheme.surface.withValues(alpha: 0.5),
|
||||
strokeCap: StrokeCap.round,
|
||||
color: combinedStream.status.color(context),
|
||||
),
|
||||
|
|
@ -212,6 +212,7 @@ class _SyncItemDetailsState extends ConsumerState<SyncItemDetails> {
|
|||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Theme.of(context).colorScheme.errorContainer,
|
||||
foregroundColor: Theme.of(context).colorScheme.onErrorContainer,
|
||||
iconColor: Theme.of(context).colorScheme.onErrorContainer,
|
||||
),
|
||||
onPressed: () {
|
||||
showDefaultAlertDialog(
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ class SyncListItemState extends ConsumerState<SyncListItem> {
|
|||
syncedItem: syncedItem,
|
||||
child: Card(
|
||||
elevation: 1,
|
||||
color: Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.2),
|
||||
color: Theme.of(context).colorScheme.secondaryContainer.withValues(alpha: 0.2),
|
||||
shadowColor: Colors.transparent,
|
||||
child: Dismissible(
|
||||
background: Container(
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ class SyncLabel extends ConsumerWidget {
|
|||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: status.color.withOpacity(0.15),
|
||||
color: status.color.withValues(alpha: 0.15),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
child: Padding(
|
||||
|
|
@ -109,7 +109,8 @@ class SyncSubtitle extends ConsumerWidget {
|
|||
final children = syncItem.nestedChildren(ref);
|
||||
final syncStatus = ref.watch(syncStatusesProvider(syncItem)).value ?? SyncStatus.partially;
|
||||
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(
|
||||
color: const Color.fromARGB(0, 208, 130, 130),
|
||||
textStyle:
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ class SyncStatusOverlay extends ConsumerWidget {
|
|||
child: Card(
|
||||
elevation: 0,
|
||||
semanticContainer: false,
|
||||
color: Colors.black.withOpacity(0.6),
|
||||
color: Colors.black.withValues(alpha: 0.6),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
|
|
@ -44,7 +44,7 @@ class SyncStatusOverlay extends ConsumerWidget {
|
|||
child: Card(
|
||||
elevation: 0,
|
||||
semanticContainer: false,
|
||||
color: Colors.black.withOpacity(0.6),
|
||||
color: Colors.black.withValues(alpha: 0.6),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ class _VideoPlayerNextWrapperState extends ConsumerState<VideoPlayerNextWrapper>
|
|||
|
||||
Future<void> clearOverlaySettings() async {
|
||||
if (AdaptiveLayout.of(context).inputDevice != InputDevice.pointer) {
|
||||
ScreenBrightness().resetScreenBrightness();
|
||||
ScreenBrightness().resetApplicationScreenBrightness();
|
||||
} else {
|
||||
closeFullScreen();
|
||||
}
|
||||
|
|
@ -161,7 +161,7 @@ class _VideoPlayerNextWrapperState extends ConsumerState<VideoPlayerNextWrapper>
|
|||
child: Stack(
|
||||
children: [
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.surfaceContainerLowest.withOpacity(0.2),
|
||||
color: Theme.of(context).colorScheme.surfaceContainerLowest.withValues(alpha: 0.2),
|
||||
),
|
||||
if (nextUp != null)
|
||||
AnimatedAlign(
|
||||
|
|
|
|||
|
|
@ -393,7 +393,7 @@ Future<void> showSubSelection(BuildContext context) {
|
|||
final selected = playbackModel.mediaStreams?.defaultSubStreamIndex == subModel.index;
|
||||
return ListTile(
|
||||
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
|
||||
? Opacity(opacity: 0.6, child: Text(subModel.language.capitalize()))
|
||||
: null,
|
||||
|
|
@ -434,7 +434,7 @@ Future<void> showAudioSelection(BuildContext context) {
|
|||
final selected = playbackModel.mediaStreams?.defaultAudioStreamIndex == audioStream.index;
|
||||
return ListTile(
|
||||
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
|
||||
? Opacity(opacity: 0.6, child: Text(audioStream.language.capitalize()))
|
||||
: null,
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ class _VideoPlayerSeekIndicatorState extends ConsumerState<VideoPlayerSeekIndica
|
|||
child: Center(
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.black.withOpacity(0.85),
|
||||
color: Colors.black.withValues(alpha: 0.85),
|
||||
borderRadius: BorderRadius.circular(16),
|
||||
),
|
||||
child: Padding(
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ import 'dart:math' as math;
|
|||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import 'package:fladder/models/items/chapters_model.dart';
|
||||
|
|
@ -163,8 +162,8 @@ class _ChapterProgressSliderState extends ConsumerState<VideoProgressBar> {
|
|||
.clamp(1, constraints.maxWidth),
|
||||
height: sliderHeight,
|
||||
child: GappedContainerShape(
|
||||
activeColor: Theme.of(context).colorScheme.primary.withOpacity(0.5),
|
||||
inActiveColor: Theme.of(context).colorScheme.primary.withOpacity(0.5),
|
||||
activeColor: Theme.of(context).colorScheme.primary.withValues(alpha: 0.5),
|
||||
inActiveColor: Theme.of(context).colorScheme.primary.withValues(alpha: 0.5),
|
||||
thumbPosition: bufferFraction,
|
||||
),
|
||||
),
|
||||
|
|
@ -196,7 +195,7 @@ class _ChapterProgressSliderState extends ConsumerState<VideoProgressBar> {
|
|||
shape: BoxShape.circle,
|
||||
color: activePosition
|
||||
? 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,
|
||||
width: sliderHeight - (activePosition ? 2 : 4),
|
||||
|
|
@ -204,7 +203,7 @@ class _ChapterProgressSliderState extends ConsumerState<VideoProgressBar> {
|
|||
),
|
||||
);
|
||||
},
|
||||
).whereNotNull(),
|
||||
).nonNulls,
|
||||
},
|
||||
],
|
||||
),
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ Future<void> showSubtitleControls({
|
|||
}) async {
|
||||
await showDialog(
|
||||
context: context,
|
||||
barrierColor: Colors.black.withOpacity(0.1),
|
||||
barrierColor: Colors.black.withValues(alpha: 0.1),
|
||||
builder: (context) => AlertDialog(
|
||||
backgroundColor: Colors.transparent,
|
||||
elevation: 0,
|
||||
|
|
@ -60,7 +60,7 @@ class _VideoSubtitleControlsState extends ConsumerState<VideoSubtitleControls> {
|
|||
duration: const Duration(milliseconds: 250),
|
||||
decoration: BoxDecoration(
|
||||
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(
|
||||
padding: const EdgeInsets.all(16),
|
||||
|
|
@ -220,8 +220,8 @@ class _VideoSubtitleControlsState extends ConsumerState<VideoSubtitleControls> {
|
|||
const Icon(Icons.border_color_rounded),
|
||||
...[Colors.white, Colors.yellow, Colors.black, Colors.grey, Colors.transparent].map(
|
||||
(e) => FlatButton(
|
||||
onTap: () =>
|
||||
provider.setOutlineColor(e == Colors.transparent ? e : e.withOpacity(0.85)),
|
||||
onTap: () => provider
|
||||
.setOutlineColor(e == Colors.transparent ? e : e.withValues(alpha: 0.85)),
|
||||
borderRadiusGeometry: BorderRadius.circular(5),
|
||||
clipBehavior: Clip.antiAlias,
|
||||
child: Container(
|
||||
|
|
@ -284,7 +284,7 @@ class _VideoSubtitleControlsState extends ConsumerState<VideoSubtitleControls> {
|
|||
divisions: 20,
|
||||
onChangeStart: (value) => setOpacity(const Key('backGroundOpacity')),
|
||||
onChangeEnd: (value) => setOpacity(null),
|
||||
value: subSettings.backGroundColor.opacity.clamp(0, 1),
|
||||
value: subSettings.backGroundColor.a.clamp(0, 1),
|
||||
onChanged: (value) => provider.setBackGroundOpacity(value),
|
||||
),
|
||||
),
|
||||
|
|
@ -293,7 +293,7 @@ class _VideoSubtitleControlsState extends ConsumerState<VideoSubtitleControls> {
|
|||
minWidth: 35,
|
||||
),
|
||||
child: Text(
|
||||
subSettings.backGroundColor.opacity.toStringAsFixed(2),
|
||||
subSettings.backGroundColor.a.toStringAsFixed(2),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter/services.dart';
|
||||
|
||||
import 'package:async/async.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:ficonsax/ficonsax.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:screen_brightness/screen_brightness.dart';
|
||||
|
|
@ -219,8 +218,8 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
|
|||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
colors: [
|
||||
Colors.black.withOpacity(0.8),
|
||||
Colors.black.withOpacity(0),
|
||||
Colors.black.withValues(alpha: 0.8),
|
||||
Colors.black.withValues(alpha: 0),
|
||||
],
|
||||
)),
|
||||
child: Padding(
|
||||
|
|
@ -276,8 +275,8 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
|
|||
begin: Alignment.bottomCenter,
|
||||
end: Alignment.topCenter,
|
||||
colors: [
|
||||
Colors.black.withOpacity(0.8),
|
||||
Colors.black.withOpacity(0),
|
||||
Colors.black.withValues(alpha: 0.8),
|
||||
Colors.black.withValues(alpha: 0),
|
||||
],
|
||||
)),
|
||||
child: Padding(
|
||||
|
|
@ -425,7 +424,7 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
|
|||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
details.whereNotNull().join(' - '),
|
||||
details.nonNulls.join(' - '),
|
||||
style: Theme.of(context).textTheme.titleMedium?.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
shadows: [
|
||||
|
|
@ -506,7 +505,7 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
|
|||
textAlign: TextAlign.center,
|
||||
decoration: BoxDecoration(
|
||||
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,
|
||||
child: IconButton(
|
||||
|
|
@ -533,7 +532,7 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
|
|||
textAlign: TextAlign.center,
|
||||
decoration: BoxDecoration(
|
||||
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,
|
||||
child: IconButton(
|
||||
|
|
@ -625,7 +624,7 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
|
|||
Future<void> clearOverlaySettings() async {
|
||||
toggleOverlay(value: true);
|
||||
if (AdaptiveLayout.of(context).inputDevice != InputDevice.pointer) {
|
||||
ScreenBrightness().resetScreenBrightness();
|
||||
ScreenBrightness().resetApplicationScreenBrightness();
|
||||
} else {
|
||||
disableFullScreen();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ class FladderTheme {
|
|||
),
|
||||
buttonTheme: ButtonThemeData(shape: defaultShape),
|
||||
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,
|
||||
),
|
||||
popupMenuTheme: PopupMenuThemeData(
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ class AbsorbEvents extends ConsumerWidget {
|
|||
onDoubleTap: () {},
|
||||
onTap: () {},
|
||||
onLongPress: () {},
|
||||
child: Container(color: Colors.black.withOpacity(0), child: child),
|
||||
child: Container(color: Colors.black.withValues(alpha: 0), child: child),
|
||||
);
|
||||
} else {
|
||||
return child;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,37 @@ import 'package:flutter/material.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 {
|
||||
String label(BuildContext context) => switch (this) {
|
||||
DynamicSchemeVariant.tonalSpot => context.localized.schemeSettingsTonalSpot,
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ class DebugBanner extends ConsumerWidget {
|
|||
padding: const EdgeInsets.all(4.0),
|
||||
child: Card(
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)),
|
||||
color: Colors.purpleAccent.withOpacity(0.8),
|
||||
color: Colors.purpleAccent.withValues(alpha: 0.8),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2),
|
||||
child: Text(
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
class FloatingActionButtonAnimated extends ConsumerWidget {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
import 'package:collection/collection.dart';
|
||||
|
||||
extension DurationExtensions on Duration? {
|
||||
String? get humanize {
|
||||
if (this == null) return null;
|
||||
|
|
@ -7,7 +5,7 @@ extension DurationExtensions on Duration? {
|
|||
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 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;
|
||||
}
|
||||
|
||||
|
|
@ -18,7 +16,7 @@ extension DurationExtensions on Duration? {
|
|||
final minutes = (duration.inMinutes % 60).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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
|
||||
|
||||
|
|
@ -69,9 +70,12 @@ class _KeyedListViewState extends ConsumerState<KeyedListView> {
|
|||
style: TextButton.styleFrom(
|
||||
padding: EdgeInsets.zero,
|
||||
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
|
||||
? Theme.of(context).colorScheme.onSecondary
|
||||
: Theme.of(context).colorScheme.onSurface.withOpacity(0.35),
|
||||
: Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.35),
|
||||
),
|
||||
onPressed: () {
|
||||
itemScrollController.scrollTo(
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ class _MouseParkingState extends ConsumerState<MouseParking> {
|
|||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
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(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
import 'package:collection/collection.dart';
|
||||
|
||||
import 'package:fladder/models/items/item_shared_models.dart';
|
||||
|
||||
extension StringExtensions on String {
|
||||
|
|
@ -64,6 +62,6 @@ extension GenreExtensions on List<GenreItems> {
|
|||
|
||||
extension StringListExtension on List<String?> {
|
||||
String get detailsTitle {
|
||||
return whereNotNull().join(" ● ");
|
||||
return nonNulls.join(" ● ");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ class FladderAppBar extends StatelessWidget implements PreferredSize {
|
|||
} else {
|
||||
return AppBar(
|
||||
toolbarHeight: 0,
|
||||
backgroundColor: Theme.of(context).colorScheme.surface.withOpacity(0),
|
||||
backgroundColor: Theme.of(context).colorScheme.surface.withValues(alpha: 0),
|
||||
scrolledUnderElevation: 0,
|
||||
elevation: 0,
|
||||
systemOverlayStyle: const SystemUiOverlayStyle(),
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ class _CurrentlyPlayingBarState extends ConsumerState<FloatingPlayerBar> {
|
|||
opacity: showExpandButton ? 1 : 0,
|
||||
duration: const Duration(milliseconds: 125),
|
||||
child: Container(
|
||||
color: Colors.black.withOpacity(0.6),
|
||||
color: Colors.black.withValues(alpha: 0.6),
|
||||
child: FlatButton(
|
||||
onTap: () async => openFullScreenPlayer(),
|
||||
child: const Icon(Icons.keyboard_arrow_up_rounded),
|
||||
|
|
@ -191,7 +191,7 @@ class _CurrentlyPlayingBarState extends ConsumerState<FloatingPlayerBar> {
|
|||
),
|
||||
LinearProgressIndicator(
|
||||
minHeight: 6,
|
||||
backgroundColor: Colors.black.withOpacity(0.25),
|
||||
backgroundColor: Colors.black.withValues(alpha: 0.25),
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
value: progress.clamp(0, 1),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import 'package:fladder/util/widget_extensions.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import 'package:fladder/util/widget_extensions.dart';
|
||||
|
||||
class NavigationButton extends ConsumerStatefulWidget {
|
||||
final String? label;
|
||||
final Widget selectedIcon;
|
||||
|
|
@ -58,10 +60,15 @@ class _NavigationButtonState extends ConsumerState<NavigationButton> {
|
|||
elevation: const WidgetStatePropertyAll(0),
|
||||
padding: const WidgetStatePropertyAll(EdgeInsets.zero),
|
||||
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) {
|
||||
return widget.selected
|
||||
? 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,
|
||||
child: AnimatedContainer(
|
||||
|
|
@ -94,7 +101,7 @@ class _NavigationButtonState extends ConsumerState<NavigationButton> {
|
|||
width: widget.selected ? 14 : 0,
|
||||
decoration: BoxDecoration(
|
||||
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),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:chopper/chopper.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import 'package:fladder/models/item_base_model.dart';
|
||||
import 'package:fladder/providers/api_provider.dart';
|
||||
import 'package:fladder/util/localization_helper.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 {
|
||||
Response<dynamic>? response;
|
||||
|
|
@ -23,6 +25,7 @@ Future<Response<dynamic>?> showDeleteDialog(BuildContext context, ItemBaseModel
|
|||
style: FilledButton.styleFrom(
|
||||
backgroundColor: Theme.of(context).colorScheme.errorContainer,
|
||||
foregroundColor: Theme.of(context).colorScheme.onErrorContainer,
|
||||
iconColor: Theme.of(context).colorScheme.onErrorContainer,
|
||||
),
|
||||
onPressed: () async {
|
||||
response = await ref.read(jellyApiProvider).deleteItem(item.id);
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ class AnimatedVisibilityIconState extends State<AnimatedVisibilityIcon> {
|
|||
child: AnimatedContainer(
|
||||
duration: const Duration(milliseconds: 300),
|
||||
decoration: BoxDecoration(
|
||||
color: (_currentFilledState ? widget.filledColor : widget.outlinedColor)?.withOpacity(0.2),
|
||||
color: (_currentFilledState ? widget.filledColor : widget.outlinedColor)?.withValues(alpha: 0.2),
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: Padding(
|
||||
|
|
|
|||
|
|
@ -20,9 +20,9 @@ IconData getBackIcon(BuildContext context) {
|
|||
}
|
||||
|
||||
final _shadows = [
|
||||
BoxShadow(blurRadius: 1, spreadRadius: 1, color: Colors.black.withOpacity(0.2)),
|
||||
BoxShadow(blurRadius: 4, spreadRadius: 4, color: Colors.black.withOpacity(0.1)),
|
||||
BoxShadow(blurRadius: 16, spreadRadius: 6, 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.withValues(alpha: 0.1)),
|
||||
BoxShadow(blurRadius: 16, spreadRadius: 6, color: Colors.black.withValues(alpha: 0.2)),
|
||||
];
|
||||
|
||||
class ElevatedIconButton extends ConsumerWidget {
|
||||
|
|
@ -36,7 +36,7 @@ class ElevatedIconButton extends ConsumerWidget {
|
|||
return IconButton(
|
||||
onPressed: onPressed,
|
||||
style: IconButtonTheme.of(context).style?.copyWith(
|
||||
backgroundColor: WidgetStatePropertyAll(color?.withOpacity(0.15)),
|
||||
backgroundColor: WidgetStatePropertyAll(color?.withValues(alpha: 0.15)),
|
||||
),
|
||||
color: color,
|
||||
icon: Icon(
|
||||
|
|
|
|||
|
|
@ -295,13 +295,13 @@ class _CarouselViewState extends State<FladderCarousel> {
|
|||
overlayColor: widget.overlayColor ??
|
||||
WidgetStateProperty.resolveWith((Set<WidgetState> states) {
|
||||
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)) {
|
||||
return theme.colorScheme.onSurface.withOpacity(0.08);
|
||||
return theme.colorScheme.onSurface.withValues(alpha: 0.08);
|
||||
}
|
||||
if (states.contains(WidgetState.focused)) {
|
||||
return theme.colorScheme.onSurface.withOpacity(0.1);
|
||||
return theme.colorScheme.onSurface.withValues(alpha: 0.1);
|
||||
}
|
||||
return null;
|
||||
}),
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ class FladderScrollbar extends ConsumerWidget {
|
|||
borderRadius: BorderRadius.circular(5),
|
||||
color: info.isDragging
|
||||
? 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),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -95,6 +95,7 @@ class ItemActionButton extends ItemAction {
|
|||
minimumSize: const WidgetStatePropertyAll(Size(50, 50)),
|
||||
elevation: const WidgetStatePropertyAll(0),
|
||||
foregroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onSurface),
|
||||
iconColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onSurface),
|
||||
),
|
||||
onPressed: () {
|
||||
if (shouldPop) {
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ Future<void> showModalSideSheet(
|
|||
context: context,
|
||||
transitionDuration: transitionDuration ?? const Duration(milliseconds: 200),
|
||||
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',
|
||||
useRootNavigator: false,
|
||||
transitionBuilder: (context, animation, secondaryAnimation, child) {
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
import 'dart:async';
|
||||
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/util/refresh_state.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
class SelectableIconButton extends ConsumerStatefulWidget {
|
||||
final FutureOr<dynamic> Function() onPressed;
|
||||
|
|
@ -36,6 +38,7 @@ class _SelectableIconButtonState extends ConsumerState<SelectableIconButton> {
|
|||
child: ElevatedButton(
|
||||
style: ButtonStyle(
|
||||
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,
|
||||
padding: const WidgetStatePropertyAll(EdgeInsets.zero),
|
||||
),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue