Skip to content

Commit 4b0144f

Browse files
chore(cat-voices): disposing more objects (#2156)
* chore: dispose db * chore: close safe ProposalsCubit * chore: UserService safe check
1 parent 916762b commit 4b0144f

File tree

5 files changed

+45
-25
lines changed

5 files changed

+45
-25
lines changed

catalyst_voices/apps/voices/lib/app/view/app_active_state_listener.dart

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,32 +18,38 @@ class AppActiveStateListener extends StatefulWidget {
1818

1919
class _AppActiveStateListenerState extends State<AppActiveStateListener> {
2020
late final AppLifecycleListener _listener;
21+
UserService? _userService;
2122

2223
@override
23-
void initState() {
24-
super.initState();
25-
_listener = AppLifecycleListener(
26-
onResume: _handleResumed,
27-
onInactive: _handleInactive,
28-
);
24+
Widget build(BuildContext context) {
25+
return widget.child;
2926
}
3027

3128
@override
3229
void dispose() {
30+
_userService = null;
3331
_listener.dispose();
3432
super.dispose();
3533
}
3634

3735
@override
38-
Widget build(BuildContext context) {
39-
return widget.child;
40-
}
36+
void initState() {
37+
super.initState();
4138

42-
Future<void> _handleResumed() async {
43-
Dependencies.instance.get<UserService>().isActive = true;
39+
_userService = Dependencies.instance.isRegistered<UserService>()
40+
? Dependencies.instance.get<UserService>()
41+
: null;
42+
_listener = AppLifecycleListener(
43+
onResume: _handleResumed,
44+
onInactive: _handleInactive,
45+
);
4446
}
4547

4648
Future<void> _handleInactive() async {
47-
Dependencies.instance.get<UserService>().isActive = false;
49+
_userService?.isActive = false;
50+
}
51+
52+
Future<void> _handleResumed() async {
53+
_userService?.isActive = true;
4854
}
4955
}

catalyst_voices/apps/voices/lib/dependency/dependencies.dart

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -299,19 +299,22 @@ final class Dependencies extends DependencyProvider {
299299
registerLazySingleton<FlutterSecureStorage>(FlutterSecureStorage.new);
300300
registerLazySingleton<SharedPreferencesAsync>(SharedPreferencesAsync.new);
301301
registerLazySingleton<UserStorage>(SecureUserStorage.new);
302-
registerLazySingleton<CatalystDatabase>(() {
303-
final config = get<AppConfig>().database;
302+
registerLazySingleton<CatalystDatabase>(
303+
() {
304+
final config = get<AppConfig>().database;
304305

305-
return CatalystDatabase.drift(
306-
config: CatalystDriftDatabaseConfig(
307-
name: config.name,
308-
web: CatalystDriftDatabaseWebConfig(
309-
sqlite3Wasm: Uri.parse(config.webSqlite3Wasm),
310-
driftWorker: Uri.parse(config.webDriftWorker),
306+
return CatalystDatabase.drift(
307+
config: CatalystDriftDatabaseConfig(
308+
name: config.name,
309+
web: CatalystDriftDatabaseWebConfig(
310+
sqlite3Wasm: Uri.parse(config.webSqlite3Wasm),
311+
driftWorker: Uri.parse(config.webDriftWorker),
312+
),
311313
),
312-
),
313-
);
314-
});
314+
);
315+
},
316+
dispose: (database) async => database.close(),
317+
);
315318
registerLazySingleton<AuthTokenCache>(() {
316319
return LocalAuthTokenCache(
317320
sharedPreferences: get<SharedPreferencesAsync>(),

catalyst_voices/packages/internal/catalyst_voices_blocs/lib/src/proposals/proposals_cubit.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,17 @@ final class ProposalsCubit extends Cubit<ProposalsState> {
3939
(index) => CampaignCategoryDetailsViewModel.dummy(id: '$index'),
4040
);
4141

42-
emit(state.copyWith(categories: categories));
42+
if (!isClosed) {
43+
emit(state.copyWith(categories: categories));
44+
}
4345
}
4446

4547
Future<void> getFavoritesList() async {
4648
final favoritesList = await _proposalService.getFavoritesProposalsIds();
4749

48-
emit(state.copyWith(favoritesIds: favoritesList));
50+
if (!isClosed) {
51+
emit(state.copyWith(favoritesIds: favoritesList));
52+
}
4953
}
5054

5155
Future<void> getProposals(

catalyst_voices/packages/internal/catalyst_voices_repositories/lib/src/database/catalyst_database.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ abstract interface class CatalystDatabase {
3939

4040
/// Removes all data from this db.
4141
Future<void> clear();
42+
43+
/// Only once instance is allowed.
44+
///
45+
/// In tests it can happen that database was opened and disposed later.
46+
Future<void> close();
4247
}
4348

4449
@DriftDatabase(

catalyst_voices/packages/internal/catalyst_voices_shared/lib/src/dependency/dependency_provider.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ abstract class DependencyProvider {
3030
return _getIt.allReady();
3131
}
3232

33+
bool isRegistered<T extends Object>() => _getIt.isRegistered<T>();
34+
3335
T get<T extends Object>() => _getIt.get<T>();
3436

3537
Future<T> getAsync<T extends Object>() => _getIt.getAsync<T>();

0 commit comments

Comments
 (0)