Fix race condition when mixing stream and raw access with pref controller

This commit is contained in:
Ming Ming 2023-12-14 00:49:12 +08:00
parent c1e8f28001
commit f848f612ea
9 changed files with 21 additions and 18 deletions

View file

@ -218,8 +218,9 @@ class HomeSearchSuggestionBloc
_log.warning("[_onEventPreloadData] Failed while ListTag", e);
}
try {
final persons =
await ListPerson(_c)(account, accountPrefController.raw).last;
final persons = await ListPerson(_c)(
account, accountPrefController.personProvider.value)
.last;
product.addAll(persons.map((t) => _PersonSearcheable(t)));
_log.info("[_onEventPreloadData] Loaded ${persons.length} people");
} catch (e) {

View file

@ -114,7 +114,8 @@ class SearchLandingBloc
}
Future<List<Person>> _queryPeople(SearchLandingBlocQuery ev) =>
ListPerson(_c.withLocalRepo())(ev.account, ev.accountPrefController.raw)
ListPerson(_c.withLocalRepo())(
ev.account, ev.accountPrefController.personProvider.value)
.last;
Future<LocationGroupResult> _queryLocations(SearchLandingBlocQuery ev) =>

View file

@ -54,8 +54,6 @@ class AccountPrefController {
value: value,
);
AccountPref get raw => _accountPref;
Future<void> _set<T>({
required BehaviorSubject<T> controller,
required Future<bool> Function(AccountPref pref, T value) setter,

View file

@ -62,7 +62,9 @@ class PersonsController {
var lastData = _personStreamContorller.value.copyWith(hasNext: true);
_personStreamContorller.add(lastData);
final completer = Completer();
ListPerson(_c.withLocalRepo())(account, accountPrefController.raw).listen(
ListPerson(_c.withLocalRepo())(
account, accountPrefController.personProvider.value)
.listen(
(results) {
lastData = PersonStreamEvent(
data: results,

View file

@ -3,7 +3,6 @@ import 'package:nc_photos/account.dart';
import 'package:nc_photos/di_container.dart';
import 'package:nc_photos/entity/album.dart';
import 'package:nc_photos/entity/file_descriptor.dart';
import 'package:nc_photos/entity/pref.dart';
import 'package:nc_photos/remote_storage_util.dart' as remote_storage_util;
import 'package:nc_photos/use_case/list_potential_shared_album.dart';
import 'package:nc_photos/use_case/move.dart';
@ -22,11 +21,11 @@ class ImportPotentialSharedAlbum {
DiContainer.has(c, DiType.albumRepo) &&
DiContainer.has(c, DiType.fileRepo);
Future<List<Album>> call(Account account, AccountPref accountPref) async {
Future<List<Album>> call(Account account, String shareFolder) async {
_log.info("[call] $account");
final products = <Album>[];
final files =
await ListPotentialSharedAlbum(_c.fileRepo)(account, accountPref);
await ListPotentialSharedAlbum(_c.fileRepo)(account, shareFolder);
for (final f in files) {
// check if the file is actually an album
try {

View file

@ -4,7 +4,6 @@ import 'package:nc_photos/account.dart';
import 'package:nc_photos/entity/file.dart';
import 'package:nc_photos/entity/file_descriptor.dart';
import 'package:nc_photos/entity/file_util.dart' as file_util;
import 'package:nc_photos/entity/pref.dart';
import 'package:nc_photos/use_case/ls.dart';
import 'package:np_codegen/np_codegen.dart';
@ -17,12 +16,12 @@ part 'list_potential_shared_album.g.dart';
class ListPotentialSharedAlbum {
ListPotentialSharedAlbum(this.fileRepo);
Future<List<File>> call(Account account, AccountPref accountPref) async {
Future<List<File>> call(Account account, String shareFolder) async {
final results = <File>[];
final ls = await Ls(fileRepo)(
account,
File(
path: file_util.unstripPath(account, accountPref.getShareFolderOr()),
path: file_util.unstripPath(account, shareFolder),
),
);
for (final f in ls) {

View file

@ -5,7 +5,6 @@ import 'package:nc_photos/account.dart';
import 'package:nc_photos/di_container.dart';
import 'package:nc_photos/entity/person.dart';
import 'package:nc_photos/entity/person/builder.dart';
import 'package:nc_photos/entity/pref.dart';
import 'package:nc_photos/use_case/face_recognition_person/list_face_recognition_person.dart';
import 'package:nc_photos/use_case/recognize_face/list_recognize_face.dart';
import 'package:nc_photos/use_case/recognize_face/list_recognize_face_item.dart';
@ -17,9 +16,7 @@ part 'list_person.g.dart';
class ListPerson {
const ListPerson(this._c);
Stream<List<Person>> call(Account account, AccountPref accountPref) async* {
final provider =
PersonProvider.fromValue(accountPref.getPersonProviderOr());
Stream<List<Person>> call(Account account, PersonProvider provider) async* {
_log.info("[call] Current provider: $provider");
switch (provider) {
case PersonProvider.none:

View file

@ -185,7 +185,13 @@ class _HomeState extends State<Home> with TickerProviderStateMixin {
);
try {
return await ImportPotentialSharedAlbum(c)(
widget.account, AccountPref.of(widget.account));
widget.account,
context
.read<AccountController>()
.accountPrefController
.shareFolder
.value,
);
} catch (e, stacktrace) {
_log.shout(
"[_importPotentialSharedAlbum] Failed while ImportPotentialSharedAlbum",

View file

@ -70,7 +70,7 @@ class _Bloc extends Bloc<_Event, _State> {
);
try {
return await ImportPotentialSharedAlbum(c)(
account, accountPrefController.raw);
account, accountPrefController.shareFolder.value);
} catch (e, stackTrace) {
_log.shout(
"[_importPotentialSharedAlbum] Failed while ImportPotentialSharedAlbum",