fix: timeline service uninitialised across routes (#19544)

This commit is contained in:
shenlong
2025-07-01 20:53:20 +05:30
committed by GitHub
parent f59b0bab5a
commit 15be3437bf
9 changed files with 95 additions and 139 deletions
@@ -1,20 +1,18 @@
import 'package:flutter/material.dart';
import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/multiselect.provider.dart';
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/services/action.service.dart';
import 'package:immich_mobile/services/timeline.service.dart';
import 'package:logging/logging.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
final actionProvider = NotifierProvider<ActionNotifier, void>(
ActionNotifier.new,
dependencies: [
actionServiceProvider,
multiSelectProvider,
timelineServiceProvider,
multiselectProvider,
],
);
@@ -32,7 +30,7 @@ class ActionResult {
class ActionNotifier extends Notifier<void> {
final Logger _logger = Logger('ActionNotifier');
late final ActionService _service;
late ActionService _service;
ActionNotifier() : super();
@@ -15,9 +15,17 @@ final timelineArgsProvider = Provider.autoDispose<TimelineArgs>(
throw UnimplementedError('Will be overridden through a ProviderScope.'),
);
final timelineServiceProvider = Provider.autoDispose<TimelineService>(
(ref) =>
throw UnimplementedError('Will be overridden through a ProviderScope.'),
final timelineServiceProvider = Provider<TimelineService>(
(ref) {
final timelineUsers = ref.watch(timelineUsersProvider).valueOrNull ?? [];
final timelineService =
ref.watch(timelineFactoryProvider).main(timelineUsers);
ref.onDispose(timelineService.dispose);
return timelineService;
},
// Empty dependencies to inform the framework that this provider
// might be used in a ProviderScope
dependencies: [],
);
final timelineFactoryProvider = Provider<TimelineFactory>(
@@ -47,12 +47,10 @@ class MultiSelectState {
}
class MultiSelectNotifier extends Notifier<MultiSelectState> {
late final TimelineService _timelineService;
TimelineService get _timelineService => ref.read(timelineServiceProvider);
@override
MultiSelectState build() {
_timelineService = ref.read(timelineServiceProvider);
return const MultiSelectState(selectedAssets: {});
}
@@ -145,5 +143,5 @@ final bucketSelectionProvider = Provider.family<bool, List<BaseAsset>>(
// Check if all assets in the bucket are selected
return bucketAssets.every((asset) => selectedAssets.contains(asset));
},
dependencies: [multiSelectProvider],
dependencies: [multiSelectProvider, timelineServiceProvider],
);