chore: Photoviewer now uses auto routing (#432)

Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
PartyDonut 2025-08-03 13:56:52 +02:00 committed by GitHub
parent 092836328f
commit 7628321e47
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 201 additions and 141 deletions

View file

@ -1,9 +1,10 @@
// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'package:fladder/jellyfin/jellyfin_open_api.enums.swagger.dart';
import 'package:fladder/util/localization_helper.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:dart_mappable/dart_mappable.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'package:fladder/jellyfin/jellyfin_open_api.enums.swagger.dart';
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart' as dto; import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart' as dto;
import 'package:fladder/models/item_base_model.dart'; import 'package:fladder/models/item_base_model.dart';
import 'package:fladder/models/items/images_models.dart'; import 'package:fladder/models/items/images_models.dart';
@ -11,10 +12,9 @@ import 'package:fladder/models/items/item_shared_models.dart';
import 'package:fladder/models/items/overview_model.dart'; import 'package:fladder/models/items/overview_model.dart';
import 'package:fladder/providers/user_provider.dart'; import 'package:fladder/providers/user_provider.dart';
import 'package:fladder/screens/shared/fladder_snackbar.dart'; import 'package:fladder/screens/shared/fladder_snackbar.dart';
import 'package:fladder/util/localization_helper.dart';
import 'package:fladder/util/refresh_state.dart'; import 'package:fladder/util/refresh_state.dart';
import 'package:dart_mappable/dart_mappable.dart';
part 'photos_model.mapper.dart'; part 'photos_model.mapper.dart';
@MappableClass() @MappableClass()

View file

@ -2,10 +2,10 @@ import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:auto_route/auto_route.dart';
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:flutter_riverpod/flutter_riverpod.dart';
import 'package:page_transition/page_transition.dart';
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart'; import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart';
import 'package:fladder/models/collection_types.dart'; import 'package:fladder/models/collection_types.dart';
@ -23,7 +23,7 @@ import 'package:fladder/providers/library_filters_provider.dart';
import 'package:fladder/providers/service_provider.dart'; import 'package:fladder/providers/service_provider.dart';
import 'package:fladder/providers/settings/client_settings_provider.dart'; import 'package:fladder/providers/settings/client_settings_provider.dart';
import 'package:fladder/providers/user_provider.dart'; import 'package:fladder/providers/user_provider.dart';
import 'package:fladder/screens/photo_viewer/photo_viewer_screen.dart'; import 'package:fladder/routes/auto_router.gr.dart';
import 'package:fladder/screens/shared/fladder_snackbar.dart'; import 'package:fladder/screens/shared/fladder_snackbar.dart';
import 'package:fladder/util/item_base_model/play_item_helpers.dart'; import 'package:fladder/util/item_base_model/play_item_helpers.dart';
import 'package:fladder/util/list_extensions.dart'; import 'package:fladder/util/list_extensions.dart';
@ -657,14 +657,10 @@ class LibrarySearchNotifier extends StateNotifier<LibrarySearchModel> {
if (state.fetchingItems == true) { if (state.fetchingItems == true) {
state = state.copyWith(fetchingItems: false); state = state.copyWith(fetchingItems: false);
final newItemList = shuffle ? allItems.shuffled() : allItems; final newItemList = shuffle ? allItems.shuffled() : allItems;
await Navigator.of(context, rootNavigator: true).push( await context.navigateTo(PhotoViewerRoute(
PageTransition( items: newItemList,
child: PhotoViewerScreen( selected: selected?.id,
items: newItemList, ));
indexOfSelected: selected != null ? newItemList.indexOf(selected) : 0,
),
type: PageTransitionType.fade),
);
} }
} else { } else {
fladderSnackbar(context, title: context.localized.libraryFetchNoItemsFound); fladderSnackbar(context, title: context.localized.libraryFetchNoItemsFound);

View file

@ -51,6 +51,7 @@ class AutoRouter extends RootStackRouter {
], ],
), ),
AutoRoute(page: LockRoute.page, path: '/locked'), AutoRoute(page: LockRoute.page, path: '/locked'),
AutoRoute(page: PhotoViewerRoute.page, path: "/album"),
]; ];
} }

View file

@ -8,11 +8,13 @@
// coverage:ignore-file // coverage:ignore-file
// ignore_for_file: no_leading_underscores_for_library_prefixes // ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:auto_route/auto_route.dart' as _i17; import 'dart:async' as _i23;
import 'package:fladder/models/item_base_model.dart' as _i18;
import 'package:fladder/models/items/photos_model.dart' as _i21; import 'package:auto_route/auto_route.dart' as _i18;
import 'package:fladder/models/item_base_model.dart' as _i19;
import 'package:fladder/models/items/photos_model.dart' as _i22;
import 'package:fladder/models/library_search/library_search_options.dart' import 'package:fladder/models/library_search/library_search_options.dart'
as _i20; as _i21;
import 'package:fladder/routes/nested_details_screen.dart' as _i4; import 'package:fladder/routes/nested_details_screen.dart' as _i4;
import 'package:fladder/screens/dashboard/dashboard_screen.dart' as _i3; import 'package:fladder/screens/dashboard/dashboard_screen.dart' as _i3;
import 'package:fladder/screens/favourites/favourites_screen.dart' as _i5; import 'package:fladder/screens/favourites/favourites_screen.dart' as _i5;
@ -22,22 +24,23 @@ import 'package:fladder/screens/library_search/library_search_screen.dart'
as _i8; as _i8;
import 'package:fladder/screens/login/lock_screen.dart' as _i9; import 'package:fladder/screens/login/lock_screen.dart' as _i9;
import 'package:fladder/screens/login/login_screen.dart' as _i10; import 'package:fladder/screens/login/login_screen.dart' as _i10;
import 'package:fladder/screens/photo_viewer/photo_viewer_screen.dart' as _i11;
import 'package:fladder/screens/settings/about_settings_page.dart' as _i1; import 'package:fladder/screens/settings/about_settings_page.dart' as _i1;
import 'package:fladder/screens/settings/client_settings_page.dart' as _i2; import 'package:fladder/screens/settings/client_settings_page.dart' as _i2;
import 'package:fladder/screens/settings/player_settings_page.dart' as _i11; import 'package:fladder/screens/settings/player_settings_page.dart' as _i12;
import 'package:fladder/screens/settings/security_settings_page.dart' as _i12; import 'package:fladder/screens/settings/security_settings_page.dart' as _i13;
import 'package:fladder/screens/settings/settings_screen.dart' as _i13; import 'package:fladder/screens/settings/settings_screen.dart' as _i14;
import 'package:fladder/screens/settings/settings_selection_screen.dart' import 'package:fladder/screens/settings/settings_selection_screen.dart'
as _i14; as _i15;
import 'package:fladder/screens/splash_screen.dart' as _i15; import 'package:fladder/screens/splash_screen.dart' as _i16;
import 'package:fladder/screens/syncing/synced_screen.dart' as _i16; import 'package:fladder/screens/syncing/synced_screen.dart' as _i17;
import 'package:flutter/foundation.dart' as _i19; import 'package:flutter/foundation.dart' as _i20;
import 'package:flutter/material.dart' as _i22; import 'package:flutter/material.dart' as _i24;
/// generated route for /// generated route for
/// [_i1.AboutSettingsPage] /// [_i1.AboutSettingsPage]
class AboutSettingsRoute extends _i17.PageRouteInfo<void> { class AboutSettingsRoute extends _i18.PageRouteInfo<void> {
const AboutSettingsRoute({List<_i17.PageRouteInfo>? children}) const AboutSettingsRoute({List<_i18.PageRouteInfo>? children})
: super( : super(
AboutSettingsRoute.name, AboutSettingsRoute.name,
initialChildren: children, initialChildren: children,
@ -45,7 +48,7 @@ class AboutSettingsRoute extends _i17.PageRouteInfo<void> {
static const String name = 'AboutSettingsRoute'; static const String name = 'AboutSettingsRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i1.AboutSettingsPage(); return const _i1.AboutSettingsPage();
@ -55,8 +58,8 @@ class AboutSettingsRoute extends _i17.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i2.ClientSettingsPage] /// [_i2.ClientSettingsPage]
class ClientSettingsRoute extends _i17.PageRouteInfo<void> { class ClientSettingsRoute extends _i18.PageRouteInfo<void> {
const ClientSettingsRoute({List<_i17.PageRouteInfo>? children}) const ClientSettingsRoute({List<_i18.PageRouteInfo>? children})
: super( : super(
ClientSettingsRoute.name, ClientSettingsRoute.name,
initialChildren: children, initialChildren: children,
@ -64,7 +67,7 @@ class ClientSettingsRoute extends _i17.PageRouteInfo<void> {
static const String name = 'ClientSettingsRoute'; static const String name = 'ClientSettingsRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i2.ClientSettingsPage(); return const _i2.ClientSettingsPage();
@ -74,8 +77,8 @@ class ClientSettingsRoute extends _i17.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i3.DashboardScreen] /// [_i3.DashboardScreen]
class DashboardRoute extends _i17.PageRouteInfo<void> { class DashboardRoute extends _i18.PageRouteInfo<void> {
const DashboardRoute({List<_i17.PageRouteInfo>? children}) const DashboardRoute({List<_i18.PageRouteInfo>? children})
: super( : super(
DashboardRoute.name, DashboardRoute.name,
initialChildren: children, initialChildren: children,
@ -83,7 +86,7 @@ class DashboardRoute extends _i17.PageRouteInfo<void> {
static const String name = 'DashboardRoute'; static const String name = 'DashboardRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i3.DashboardScreen(); return const _i3.DashboardScreen();
@ -93,12 +96,12 @@ class DashboardRoute extends _i17.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i4.DetailsScreen] /// [_i4.DetailsScreen]
class DetailsRoute extends _i17.PageRouteInfo<DetailsRouteArgs> { class DetailsRoute extends _i18.PageRouteInfo<DetailsRouteArgs> {
DetailsRoute({ DetailsRoute({
String id = '', String id = '',
_i18.ItemBaseModel? item, _i19.ItemBaseModel? item,
_i19.Key? key, _i20.Key? key,
List<_i17.PageRouteInfo>? children, List<_i18.PageRouteInfo>? children,
}) : super( }) : super(
DetailsRoute.name, DetailsRoute.name,
args: DetailsRouteArgs( args: DetailsRouteArgs(
@ -112,7 +115,7 @@ class DetailsRoute extends _i17.PageRouteInfo<DetailsRouteArgs> {
static const String name = 'DetailsRoute'; static const String name = 'DetailsRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
final queryParams = data.queryParams; final queryParams = data.queryParams;
@ -140,9 +143,9 @@ class DetailsRouteArgs {
final String id; final String id;
final _i18.ItemBaseModel? item; final _i19.ItemBaseModel? item;
final _i19.Key? key; final _i20.Key? key;
@override @override
String toString() { String toString() {
@ -152,8 +155,8 @@ class DetailsRouteArgs {
/// generated route for /// generated route for
/// [_i5.FavouritesScreen] /// [_i5.FavouritesScreen]
class FavouritesRoute extends _i17.PageRouteInfo<void> { class FavouritesRoute extends _i18.PageRouteInfo<void> {
const FavouritesRoute({List<_i17.PageRouteInfo>? children}) const FavouritesRoute({List<_i18.PageRouteInfo>? children})
: super( : super(
FavouritesRoute.name, FavouritesRoute.name,
initialChildren: children, initialChildren: children,
@ -161,7 +164,7 @@ class FavouritesRoute extends _i17.PageRouteInfo<void> {
static const String name = 'FavouritesRoute'; static const String name = 'FavouritesRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i5.FavouritesScreen(); return const _i5.FavouritesScreen();
@ -171,8 +174,8 @@ class FavouritesRoute extends _i17.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i6.HomeScreen] /// [_i6.HomeScreen]
class HomeRoute extends _i17.PageRouteInfo<void> { class HomeRoute extends _i18.PageRouteInfo<void> {
const HomeRoute({List<_i17.PageRouteInfo>? children}) const HomeRoute({List<_i18.PageRouteInfo>? children})
: super( : super(
HomeRoute.name, HomeRoute.name,
initialChildren: children, initialChildren: children,
@ -180,7 +183,7 @@ class HomeRoute extends _i17.PageRouteInfo<void> {
static const String name = 'HomeRoute'; static const String name = 'HomeRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i6.HomeScreen(); return const _i6.HomeScreen();
@ -190,8 +193,8 @@ class HomeRoute extends _i17.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i7.LibraryScreen] /// [_i7.LibraryScreen]
class LibraryRoute extends _i17.PageRouteInfo<void> { class LibraryRoute extends _i18.PageRouteInfo<void> {
const LibraryRoute({List<_i17.PageRouteInfo>? children}) const LibraryRoute({List<_i18.PageRouteInfo>? children})
: super( : super(
LibraryRoute.name, LibraryRoute.name,
initialChildren: children, initialChildren: children,
@ -199,7 +202,7 @@ class LibraryRoute extends _i17.PageRouteInfo<void> {
static const String name = 'LibraryRoute'; static const String name = 'LibraryRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i7.LibraryScreen(); return const _i7.LibraryScreen();
@ -209,16 +212,16 @@ class LibraryRoute extends _i17.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i8.LibrarySearchScreen] /// [_i8.LibrarySearchScreen]
class LibrarySearchRoute extends _i17.PageRouteInfo<LibrarySearchRouteArgs> { class LibrarySearchRoute extends _i18.PageRouteInfo<LibrarySearchRouteArgs> {
LibrarySearchRoute({ LibrarySearchRoute({
String? viewModelId, String? viewModelId,
List<String>? folderId, List<String>? folderId,
bool? favourites, bool? favourites,
_i20.SortingOrder? sortOrder, _i21.SortingOrder? sortOrder,
_i20.SortingOptions? sortingOptions, _i21.SortingOptions? sortingOptions,
_i21.PhotoModel? photoToView, _i22.PhotoModel? photoToView,
_i19.Key? key, _i20.Key? key,
List<_i17.PageRouteInfo>? children, List<_i18.PageRouteInfo>? children,
}) : super( }) : super(
LibrarySearchRoute.name, LibrarySearchRoute.name,
args: LibrarySearchRouteArgs( args: LibrarySearchRouteArgs(
@ -242,7 +245,7 @@ class LibrarySearchRoute extends _i17.PageRouteInfo<LibrarySearchRouteArgs> {
static const String name = 'LibrarySearchRoute'; static const String name = 'LibrarySearchRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
final queryParams = data.queryParams; final queryParams = data.queryParams;
@ -284,13 +287,13 @@ class LibrarySearchRouteArgs {
final bool? favourites; final bool? favourites;
final _i20.SortingOrder? sortOrder; final _i21.SortingOrder? sortOrder;
final _i20.SortingOptions? sortingOptions; final _i21.SortingOptions? sortingOptions;
final _i21.PhotoModel? photoToView; final _i22.PhotoModel? photoToView;
final _i19.Key? key; final _i20.Key? key;
@override @override
String toString() { String toString() {
@ -300,8 +303,8 @@ class LibrarySearchRouteArgs {
/// generated route for /// generated route for
/// [_i9.LockScreen] /// [_i9.LockScreen]
class LockRoute extends _i17.PageRouteInfo<void> { class LockRoute extends _i18.PageRouteInfo<void> {
const LockRoute({List<_i17.PageRouteInfo>? children}) const LockRoute({List<_i18.PageRouteInfo>? children})
: super( : super(
LockRoute.name, LockRoute.name,
initialChildren: children, initialChildren: children,
@ -309,7 +312,7 @@ class LockRoute extends _i17.PageRouteInfo<void> {
static const String name = 'LockRoute'; static const String name = 'LockRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i9.LockScreen(); return const _i9.LockScreen();
@ -319,8 +322,8 @@ class LockRoute extends _i17.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i10.LoginScreen] /// [_i10.LoginScreen]
class LoginRoute extends _i17.PageRouteInfo<void> { class LoginRoute extends _i18.PageRouteInfo<void> {
const LoginRoute({List<_i17.PageRouteInfo>? children}) const LoginRoute({List<_i18.PageRouteInfo>? children})
: super( : super(
LoginRoute.name, LoginRoute.name,
initialChildren: children, initialChildren: children,
@ -328,7 +331,7 @@ class LoginRoute extends _i17.PageRouteInfo<void> {
static const String name = 'LoginRoute'; static const String name = 'LoginRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i10.LoginScreen(); return const _i10.LoginScreen();
@ -337,9 +340,71 @@ class LoginRoute extends _i17.PageRouteInfo<void> {
} }
/// generated route for /// generated route for
/// [_i11.PlayerSettingsPage] /// [_i11.PhotoViewerScreen]
class PlayerSettingsRoute extends _i17.PageRouteInfo<void> { class PhotoViewerRoute extends _i18.PageRouteInfo<PhotoViewerRouteArgs> {
const PlayerSettingsRoute({List<_i17.PageRouteInfo>? children}) PhotoViewerRoute({
List<_i22.PhotoModel>? items,
String? selected,
_i23.Future<List<_i22.PhotoModel>>? loadingItems,
_i24.Key? key,
List<_i18.PageRouteInfo>? children,
}) : super(
PhotoViewerRoute.name,
args: PhotoViewerRouteArgs(
items: items,
selected: selected,
loadingItems: loadingItems,
key: key,
),
rawQueryParams: {'selectedId': selected},
initialChildren: children,
);
static const String name = 'PhotoViewerRoute';
static _i18.PageInfo page = _i18.PageInfo(
name,
builder: (data) {
final queryParams = data.queryParams;
final args = data.argsAs<PhotoViewerRouteArgs>(
orElse: () => PhotoViewerRouteArgs(
selected: queryParams.optString('selectedId')));
return _i11.PhotoViewerScreen(
items: args.items,
selected: args.selected,
loadingItems: args.loadingItems,
key: args.key,
);
},
);
}
class PhotoViewerRouteArgs {
const PhotoViewerRouteArgs({
this.items,
this.selected,
this.loadingItems,
this.key,
});
final List<_i22.PhotoModel>? items;
final String? selected;
final _i23.Future<List<_i22.PhotoModel>>? loadingItems;
final _i24.Key? key;
@override
String toString() {
return 'PhotoViewerRouteArgs{items: $items, selected: $selected, loadingItems: $loadingItems, key: $key}';
}
}
/// generated route for
/// [_i12.PlayerSettingsPage]
class PlayerSettingsRoute extends _i18.PageRouteInfo<void> {
const PlayerSettingsRoute({List<_i18.PageRouteInfo>? children})
: super( : super(
PlayerSettingsRoute.name, PlayerSettingsRoute.name,
initialChildren: children, initialChildren: children,
@ -347,18 +412,18 @@ class PlayerSettingsRoute extends _i17.PageRouteInfo<void> {
static const String name = 'PlayerSettingsRoute'; static const String name = 'PlayerSettingsRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i11.PlayerSettingsPage(); return const _i12.PlayerSettingsPage();
}, },
); );
} }
/// generated route for /// generated route for
/// [_i12.SecuritySettingsPage] /// [_i13.SecuritySettingsPage]
class SecuritySettingsRoute extends _i17.PageRouteInfo<void> { class SecuritySettingsRoute extends _i18.PageRouteInfo<void> {
const SecuritySettingsRoute({List<_i17.PageRouteInfo>? children}) const SecuritySettingsRoute({List<_i18.PageRouteInfo>? children})
: super( : super(
SecuritySettingsRoute.name, SecuritySettingsRoute.name,
initialChildren: children, initialChildren: children,
@ -366,18 +431,18 @@ class SecuritySettingsRoute extends _i17.PageRouteInfo<void> {
static const String name = 'SecuritySettingsRoute'; static const String name = 'SecuritySettingsRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i12.SecuritySettingsPage(); return const _i13.SecuritySettingsPage();
}, },
); );
} }
/// generated route for /// generated route for
/// [_i13.SettingsScreen] /// [_i14.SettingsScreen]
class SettingsRoute extends _i17.PageRouteInfo<void> { class SettingsRoute extends _i18.PageRouteInfo<void> {
const SettingsRoute({List<_i17.PageRouteInfo>? children}) const SettingsRoute({List<_i18.PageRouteInfo>? children})
: super( : super(
SettingsRoute.name, SettingsRoute.name,
initialChildren: children, initialChildren: children,
@ -385,18 +450,18 @@ class SettingsRoute extends _i17.PageRouteInfo<void> {
static const String name = 'SettingsRoute'; static const String name = 'SettingsRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i13.SettingsScreen(); return const _i14.SettingsScreen();
}, },
); );
} }
/// generated route for /// generated route for
/// [_i14.SettingsSelectionScreen] /// [_i15.SettingsSelectionScreen]
class SettingsSelectionRoute extends _i17.PageRouteInfo<void> { class SettingsSelectionRoute extends _i18.PageRouteInfo<void> {
const SettingsSelectionRoute({List<_i17.PageRouteInfo>? children}) const SettingsSelectionRoute({List<_i18.PageRouteInfo>? children})
: super( : super(
SettingsSelectionRoute.name, SettingsSelectionRoute.name,
initialChildren: children, initialChildren: children,
@ -404,21 +469,21 @@ class SettingsSelectionRoute extends _i17.PageRouteInfo<void> {
static const String name = 'SettingsSelectionRoute'; static const String name = 'SettingsSelectionRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i14.SettingsSelectionScreen(); return const _i15.SettingsSelectionScreen();
}, },
); );
} }
/// generated route for /// generated route for
/// [_i15.SplashScreen] /// [_i16.SplashScreen]
class SplashRoute extends _i17.PageRouteInfo<SplashRouteArgs> { class SplashRoute extends _i18.PageRouteInfo<SplashRouteArgs> {
SplashRoute({ SplashRoute({
dynamic Function(bool)? loggedIn, dynamic Function(bool)? loggedIn,
_i22.Key? key, _i24.Key? key,
List<_i17.PageRouteInfo>? children, List<_i18.PageRouteInfo>? children,
}) : super( }) : super(
SplashRoute.name, SplashRoute.name,
args: SplashRouteArgs( args: SplashRouteArgs(
@ -430,12 +495,12 @@ class SplashRoute extends _i17.PageRouteInfo<SplashRouteArgs> {
static const String name = 'SplashRoute'; static const String name = 'SplashRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
final args = final args =
data.argsAs<SplashRouteArgs>(orElse: () => const SplashRouteArgs()); data.argsAs<SplashRouteArgs>(orElse: () => const SplashRouteArgs());
return _i15.SplashScreen( return _i16.SplashScreen(
loggedIn: args.loggedIn, loggedIn: args.loggedIn,
key: args.key, key: args.key,
); );
@ -451,7 +516,7 @@ class SplashRouteArgs {
final dynamic Function(bool)? loggedIn; final dynamic Function(bool)? loggedIn;
final _i22.Key? key; final _i24.Key? key;
@override @override
String toString() { String toString() {
@ -460,12 +525,12 @@ class SplashRouteArgs {
} }
/// generated route for /// generated route for
/// [_i16.SyncedScreen] /// [_i17.SyncedScreen]
class SyncedRoute extends _i17.PageRouteInfo<SyncedRouteArgs> { class SyncedRoute extends _i18.PageRouteInfo<SyncedRouteArgs> {
SyncedRoute({ SyncedRoute({
_i22.ScrollController? navigationScrollController, _i24.ScrollController? navigationScrollController,
_i19.Key? key, _i20.Key? key,
List<_i17.PageRouteInfo>? children, List<_i18.PageRouteInfo>? children,
}) : super( }) : super(
SyncedRoute.name, SyncedRoute.name,
args: SyncedRouteArgs( args: SyncedRouteArgs(
@ -477,12 +542,12 @@ class SyncedRoute extends _i17.PageRouteInfo<SyncedRouteArgs> {
static const String name = 'SyncedRoute'; static const String name = 'SyncedRoute';
static _i17.PageInfo page = _i17.PageInfo( static _i18.PageInfo page = _i18.PageInfo(
name, name,
builder: (data) { builder: (data) {
final args = final args =
data.argsAs<SyncedRouteArgs>(orElse: () => const SyncedRouteArgs()); data.argsAs<SyncedRouteArgs>(orElse: () => const SyncedRouteArgs());
return _i16.SyncedScreen( return _i17.SyncedScreen(
navigationScrollController: args.navigationScrollController, navigationScrollController: args.navigationScrollController,
key: args.key, key: args.key,
); );
@ -496,9 +561,9 @@ class SyncedRouteArgs {
this.key, this.key,
}); });
final _i22.ScrollController? navigationScrollController; final _i24.ScrollController? navigationScrollController;
final _i19.Key? key; final _i20.Key? key;
@override @override
String toString() { String toString() {

View file

@ -1,12 +1,14 @@
import 'package:flutter/material.dart';
import 'package:auto_route/auto_route.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/models/items/photos_model.dart'; import 'package:fladder/models/items/photos_model.dart';
import 'package:fladder/providers/items/folder_details_provider.dart'; import 'package:fladder/providers/items/folder_details_provider.dart';
import 'package:fladder/screens/photo_viewer/photo_viewer_screen.dart'; import 'package:fladder/routes/auto_router.gr.dart';
import 'package:fladder/screens/shared/media/poster_grid.dart'; import 'package:fladder/screens/shared/media/poster_grid.dart';
import 'package:fladder/widgets/shared/pull_to_refresh.dart'; import 'package:fladder/widgets/shared/pull_to_refresh.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:page_transition/page_transition.dart';
class FolderDetailScreen extends ConsumerWidget { class FolderDetailScreen extends ConsumerWidget {
final ItemBaseModel item; final ItemBaseModel item;
@ -33,12 +35,10 @@ class FolderDetailScreen extends ConsumerWidget {
switch (item) { switch (item) {
case PhotoModel photoModel: case PhotoModel photoModel:
final photoItems = details?.items.whereType<PhotoModel>().toList(); final photoItems = details?.items.whereType<PhotoModel>().toList();
await Navigator.of(context, rootNavigator: true).push(PageTransition( await context.navigateTo(PhotoViewerRoute(
child: PhotoViewerScreen( items: photoItems,
items: photoItems, selected: photoModel.id,
indexOfSelected: photoItems?.indexOf(photoModel) ?? 0, ));
),
type: PageTransitionType.fade));
break; break;
default: default:
if (context.mounted) { if (context.mounted) {

View file

@ -2,13 +2,13 @@ import 'dart:ui';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:auto_route/auto_route.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:flutter_sticky_header/flutter_sticky_header.dart'; import 'package:flutter_sticky_header/flutter_sticky_header.dart';
import 'package:iconsax_plus/iconsax_plus.dart'; import 'package:iconsax_plus/iconsax_plus.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:page_transition/page_transition.dart';
import 'package:sliver_tools/sliver_tools.dart'; import 'package:sliver_tools/sliver_tools.dart';
import 'package:fladder/models/boxset_model.dart'; import 'package:fladder/models/boxset_model.dart';
@ -18,7 +18,7 @@ import 'package:fladder/models/library_search/library_search_options.dart';
import 'package:fladder/models/playlist_model.dart'; import 'package:fladder/models/playlist_model.dart';
import 'package:fladder/providers/library_search_provider.dart'; import 'package:fladder/providers/library_search_provider.dart';
import 'package:fladder/providers/settings/client_settings_provider.dart'; import 'package:fladder/providers/settings/client_settings_provider.dart';
import 'package:fladder/screens/photo_viewer/photo_viewer_screen.dart'; import 'package:fladder/routes/auto_router.gr.dart';
import 'package:fladder/screens/shared/media/poster_list_item.dart'; import 'package:fladder/screens/shared/media/poster_list_item.dart';
import 'package:fladder/screens/shared/media/poster_widget.dart'; import 'package:fladder/screens/shared/media/poster_widget.dart';
import 'package:fladder/util/adaptive_layout/adaptive_layout.dart'; import 'package:fladder/util/adaptive_layout/adaptive_layout.dart';
@ -336,15 +336,11 @@ class LibraryViews extends ConsumerWidget {
case PhotoModel _: case PhotoModel _:
final photoList = items.whereType<PhotoModel>().toList(); final photoList = items.whereType<PhotoModel>().toList();
if (context.mounted) { if (context.mounted) {
await Navigator.of(context, rootNavigator: true).push( await context.router.push(PhotoViewerRoute(
PageTransition( items: photoList,
child: PhotoViewerScreen( loadingItems: ref.read(librarySearchProvider(key).notifier).fetchGallery(),
items: photoList, selected: item.id,
loadingItems: ref.read(librarySearchProvider(key).notifier).fetchGallery(), ));
indexOfSelected: photoList.indexWhere((element) => element.id == item.id),
),
type: PageTransitionType.fade),
);
} }
if (context.mounted) context.refreshData(); if (context.mounted) context.refreshData();
break; break;

View file

@ -130,7 +130,9 @@ class _PhotoViewerControllsState extends ConsumerState<PhotoViewerControls> with
@override @override
void dispose() { void dispose() {
timerController.dispose(); timerController.dispose();
fullScreenHelper.closeFullScreen(ref); if (context.mounted) {
fullScreenHelper.closeFullScreen(ref);
}
windowManager.removeListener(this); windowManager.removeListener(this);
super.dispose(); super.dispose();
} }

View file

@ -3,11 +3,12 @@ import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:auto_route/annotations.dart';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:extended_image/extended_image.dart'; import 'package:extended_image/extended_image.dart';
import 'package:iconsax_plus/iconsax_plus.dart';
import 'package:flutter_blurhash/flutter_blurhash.dart'; import 'package:flutter_blurhash/flutter_blurhash.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:iconsax_plus/iconsax_plus.dart';
import 'package:fladder/models/item_base_model.dart'; import 'package:fladder/models/item_base_model.dart';
import 'package:fladder/models/items/photos_model.dart'; import 'package:fladder/models/items/photos_model.dart';
@ -29,13 +30,14 @@ import 'package:fladder/widgets/shared/hover_widget.dart';
import 'package:fladder/widgets/shared/item_actions.dart'; import 'package:fladder/widgets/shared/item_actions.dart';
import 'package:fladder/widgets/shared/modal_bottom_sheet.dart'; import 'package:fladder/widgets/shared/modal_bottom_sheet.dart';
@RoutePage()
class PhotoViewerScreen extends ConsumerStatefulWidget { class PhotoViewerScreen extends ConsumerStatefulWidget {
final List<PhotoModel>? items; final List<PhotoModel>? items;
final int indexOfSelected; final String? selected;
final Future<List<PhotoModel>>? loadingItems; final Future<List<PhotoModel>>? loadingItems;
const PhotoViewerScreen({ const PhotoViewerScreen({
this.items, this.items,
this.indexOfSelected = 0, @QueryParam("selectedId") this.selected,
this.loadingItems, this.loadingItems,
super.key, super.key,
}); });
@ -46,9 +48,9 @@ class PhotoViewerScreen extends ConsumerStatefulWidget {
class _PhotoViewerScreenState extends ConsumerState<PhotoViewerScreen> with WidgetsBindingObserver { class _PhotoViewerScreenState extends ConsumerState<PhotoViewerScreen> with WidgetsBindingObserver {
late List<PhotoModel> photos = widget.items ?? []; late List<PhotoModel> photos = widget.items ?? [];
late final ExtendedPageController controller = ExtendedPageController(initialPage: widget.indexOfSelected); late int currentPage = photos.indexWhere((value) => value.id == widget.selected).clamp(0, photos.length - 1);
late final ExtendedPageController controller = ExtendedPageController(initialPage: currentPage);
double currentScale = 1.0; double currentScale = 1.0;
late int currentPage = widget.indexOfSelected.clamp(0, photos.length - 1);
bool showInterface = true; bool showInterface = true;
bool toolbarHover = false; bool toolbarHover = false;
@ -78,7 +80,7 @@ class _PhotoViewerScreenState extends ConsumerState<PhotoViewerScreen> with Widg
WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance.addObserver(this);
WidgetsBinding.instance.addPostFrameCallback( WidgetsBinding.instance.addPostFrameCallback(
(timeStamp) async { (timeStamp) async {
cacheNeighbors(widget.indexOfSelected, 2); cacheNeighbors(currentPage, 2);
if (widget.loadingItems != null) { if (widget.loadingItems != null) {
setState(() { setState(() {
loadingItems = true; loadingItems = true;

View file

@ -1,6 +1,7 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:auto_route/auto_route.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
@ -13,8 +14,8 @@ import 'package:fladder/providers/api_provider.dart';
import 'package:fladder/providers/book_viewer_provider.dart'; import 'package:fladder/providers/book_viewer_provider.dart';
import 'package:fladder/providers/items/book_details_provider.dart'; import 'package:fladder/providers/items/book_details_provider.dart';
import 'package:fladder/providers/video_player_provider.dart'; import 'package:fladder/providers/video_player_provider.dart';
import 'package:fladder/routes/auto_router.gr.dart';
import 'package:fladder/screens/book_viewer/book_viewer_screen.dart'; import 'package:fladder/screens/book_viewer/book_viewer_screen.dart';
import 'package:fladder/screens/photo_viewer/photo_viewer_screen.dart';
import 'package:fladder/screens/shared/fladder_snackbar.dart'; import 'package:fladder/screens/shared/fladder_snackbar.dart';
import 'package:fladder/screens/video_player/video_player.dart'; import 'package:fladder/screens/video_player/video_player.dart';
import 'package:fladder/util/adaptive_layout/adaptive_layout.dart'; import 'package:fladder/util/adaptive_layout/adaptive_layout.dart';
@ -170,13 +171,10 @@ extension PhotoAlbumExtension on PhotoAlbumModel? {
return; return;
} }
await Navigator.of(context, rootNavigator: true).push( await context.navigateTo(PhotoViewerRoute(
MaterialPageRoute( items: photos.toList(),
builder: (context) => PhotoViewerScreen( ));
items: photos.toList(),
),
),
);
if (context.mounted) { if (context.mounted) {
await context.refreshData(); await context.refreshData();
} }