implemented custom logger

[android] fixed solid color screen until the player on the navbar is stopped
This commit is contained in:
Kingkor Roy Tirtho 2022-03-23 11:51:58 +06:00
parent 8dea8dc051
commit 0cf5bfea50
18 changed files with 107 additions and 57 deletions

View File

@ -4,6 +4,7 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/components/Album/AlbumCard.dart'; import 'package:spotube/components/Album/AlbumCard.dart';
import 'package:spotube/components/Shared/PageWindowTitleBar.dart'; import 'package:spotube/components/Shared/PageWindowTitleBar.dart';
import 'package:spotube/models/Logger.dart';
import 'package:spotube/provider/SpotifyDI.dart'; import 'package:spotube/provider/SpotifyDI.dart';
class ArtistAlbumView extends ConsumerStatefulWidget { class ArtistAlbumView extends ConsumerStatefulWidget {
@ -23,6 +24,8 @@ class _ArtistAlbumViewState extends ConsumerState<ArtistAlbumView> {
final PagingController<int, Album> _pagingController = final PagingController<int, Album> _pagingController =
PagingController<int, Album>(firstPageKey: 0); PagingController<int, Album>(firstPageKey: 0);
final logger = createLogger(ArtistAlbumView);
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -51,8 +54,7 @@ class _ArtistAlbumViewState extends ConsumerState<ArtistAlbumView> {
_pagingController.appendPage(items, albums.nextOffset); _pagingController.appendPage(items, albums.nextOffset);
} }
} catch (e, stack) { } catch (e, stack) {
print("[ArtistAlbumView._fetchPage] $e"); logger.e(e, null, stack);
print(stack);
_pagingController.error = e; _pagingController.error = e;
} }
} }

View File

@ -5,17 +5,20 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/components/Playlist/PlaylistCard.dart'; import 'package:spotube/components/Playlist/PlaylistCard.dart';
import 'package:spotube/hooks/usePagingController.dart'; import 'package:spotube/hooks/usePagingController.dart';
import 'package:spotube/models/Logger.dart';
import 'package:spotube/provider/SpotifyDI.dart'; import 'package:spotube/provider/SpotifyDI.dart';
class CategoryCard extends HookWidget { class CategoryCard extends HookWidget {
final Category category; final Category category;
final Iterable<PlaylistSimple>? playlists; final Iterable<PlaylistSimple>? playlists;
const CategoryCard( CategoryCard(
this.category, { this.category, {
Key? key, Key? key,
this.playlists, this.playlists,
}) : super(key: key); }) : super(key: key);
final logger = createLogger(CategoryCard);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(
@ -68,9 +71,7 @@ class CategoryCard extends HookWidget {
if (!_error.value) _error.value = true; if (!_error.value) _error.value = true;
pagingController.error = e; pagingController.error = e;
} }
print( logger.e("pagingController.addPageRequestListener", e, stack);
"[CategoryCard.pagingController.addPageRequestListener] $e");
print(stack);
} }
} }

View File

@ -23,6 +23,7 @@ import 'package:spotube/hooks/useHotKeys.dart';
import 'package:spotube/hooks/usePagingController.dart'; import 'package:spotube/hooks/usePagingController.dart';
import 'package:spotube/hooks/useSharedPreferences.dart'; import 'package:spotube/hooks/useSharedPreferences.dart';
import 'package:spotube/models/LocalStorageKeys.dart'; import 'package:spotube/models/LocalStorageKeys.dart';
import 'package:spotube/models/Logger.dart';
import 'package:spotube/models/generated_secrets.dart'; import 'package:spotube/models/generated_secrets.dart';
import 'package:spotube/provider/Auth.dart'; import 'package:spotube/provider/Auth.dart';
import 'package:spotube/provider/SpotifyDI.dart'; import 'package:spotube/provider/SpotifyDI.dart';
@ -38,7 +39,8 @@ List<String> spotifyScopes = [
]; ];
class Home extends HookConsumerWidget { class Home extends HookConsumerWidget {
const Home({Key? key}) : super(key: key); Home({Key? key}) : super(key: key);
final logger = createLogger(Home);
@override @override
Widget build(BuildContext context, ref) { Widget build(BuildContext context, ref) {
@ -82,8 +84,7 @@ class Home extends HookConsumerWidget {
} }
} catch (e, stack) { } catch (e, stack) {
pagingController.error = e; pagingController.error = e;
print("[Home.pagingController.addPageRequestListener] $e"); logger.e("pagingController.addPageRequestListener", e, stack);
print(stack);
} }
}, []); }, []);
@ -146,16 +147,14 @@ class Home extends HookConsumerWidget {
clientSecret: clientSecret, clientSecret: clientSecret,
); );
} }
print("[Home.useEffect.spotify.getCredentials]: $e"); logger.e("useEffect.spotify.getCredentials", e, stack);
print(stack);
}); });
} else { } else {
pagingController.addPageRequestListener(listener); pagingController.addPageRequestListener(listener);
pagingController.notifyPageRequestListeners(0); pagingController.notifyPageRequestListeners(0);
} }
} catch (e, stack) { } catch (e, stack) {
print("[Home.initState]: $e"); logger.e("initState", e, stack);
print(stack);
} }
return () { return () {
pagingController.removePageRequestListener(listener); pagingController.removePageRequestListener(listener);
@ -218,7 +217,7 @@ class Home extends HookConsumerWidget {
), ),
), ),
// player itself // player itself
const Player(), Player(),
SpotubeNavigationBar( SpotubeNavigationBar(
selectedIndex: _selectedIndex.value, selectedIndex: _selectedIndex.value,
onSelectedIndexChanged: _onSelectedIndexChanged, onSelectedIndexChanged: _onSelectedIndexChanged,

View File

@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/components/Artist/ArtistCard.dart'; import 'package:spotube/components/Artist/ArtistCard.dart';
import 'package:spotube/models/Logger.dart';
import 'package:spotube/provider/SpotifyDI.dart'; import 'package:spotube/provider/SpotifyDI.dart';
class UserArtists extends ConsumerStatefulWidget { class UserArtists extends ConsumerStatefulWidget {
@ -15,6 +16,7 @@ class UserArtists extends ConsumerStatefulWidget {
class _UserArtistsState extends ConsumerState<UserArtists> { class _UserArtistsState extends ConsumerState<UserArtists> {
final PagingController<String, Artist> _pagingController = final PagingController<String, Artist> _pagingController =
PagingController(firstPageKey: ""); PagingController(firstPageKey: "");
final logger = createLogger(UserArtists);
@override @override
void initState() { void initState() {
@ -36,8 +38,7 @@ class _UserArtistsState extends ConsumerState<UserArtists> {
} }
} catch (e, stack) { } catch (e, stack) {
_pagingController.error = e; _pagingController.error = e;
print("[UserArtists.pagingController]: $e"); logger.e("pagingController", e, stack);
print(stack);
} }
}); });
}); });

View File

@ -8,11 +8,13 @@ import 'package:spotube/components/Shared/PageWindowTitleBar.dart';
import 'package:spotube/helpers/oauth-login.dart'; import 'package:spotube/helpers/oauth-login.dart';
import 'package:spotube/hooks/useBreakpoints.dart'; import 'package:spotube/hooks/useBreakpoints.dart';
import 'package:spotube/models/LocalStorageKeys.dart'; import 'package:spotube/models/LocalStorageKeys.dart';
import 'package:spotube/models/Logger.dart';
import 'package:spotube/provider/Auth.dart'; import 'package:spotube/provider/Auth.dart';
import 'package:spotube/provider/UserPreferences.dart'; import 'package:spotube/provider/UserPreferences.dart';
class Login extends HookConsumerWidget { class Login extends HookConsumerWidget {
const Login({Key? key}) : super(key: key); Login({Key? key}) : super(key: key);
final log = createLogger(Login);
@override @override
Widget build(BuildContext context, ref) { Widget build(BuildContext context, ref) {
@ -37,7 +39,7 @@ class Login extends HookConsumerWidget {
(value) => GoRouter.of(context).pop(), (value) => GoRouter.of(context).pop(),
); );
} catch (e) { } catch (e) {
print("[Login.handleLogin] $e"); log.e("[Login.handleLogin] $e");
} }
} }

View File

@ -11,11 +11,14 @@ import 'package:spotube/components/Player/PlayerControls.dart';
import 'package:spotube/helpers/image-to-url-string.dart'; import 'package:spotube/helpers/image-to-url-string.dart';
import 'package:spotube/hooks/useBreakpoints.dart'; import 'package:spotube/hooks/useBreakpoints.dart';
import 'package:spotube/models/LocalStorageKeys.dart'; import 'package:spotube/models/LocalStorageKeys.dart';
import 'package:spotube/models/Logger.dart';
import 'package:spotube/provider/Playback.dart'; import 'package:spotube/provider/Playback.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class Player extends HookConsumerWidget { class Player extends HookConsumerWidget {
const Player({Key? key}) : super(key: key); Player({Key? key}) : super(key: key);
final logger = createLogger(Player);
@override @override
Widget build(BuildContext context, ref) { Widget build(BuildContext context, ref) {
Playback playback = ref.watch(playbackProvider); Playback playback = ref.watch(playbackProvider);
@ -37,7 +40,9 @@ class Player extends HookConsumerWidget {
/// [disposeAllPlayers] method which is throwing /// [disposeAllPlayers] method which is throwing
/// [UnimplementedException] in the [PlatformInterface] /// [UnimplementedException] in the [PlatformInterface]
/// implementation /// implementation
player.setAsset("assets/warmer.mp3"); playback.audioSession
?.setActive(true)
.then((_) => player.setAsset("assets/warmer.mp3"));
return null; return null;
}, []); }, []);
@ -65,8 +70,7 @@ class Player extends HookConsumerWidget {
entryRef.value = null; entryRef.value = null;
} catch (e, stack) { } catch (e, stack) {
if (e is! AssertionError) { if (e is! AssertionError) {
print("[Player.useEffect.cleanup] $e"); logger.e("useEffect.cleanup", e, stack);
print(stack);
} }
} }
} }
@ -107,7 +111,7 @@ class Player extends HookConsumerWidget {
children: [ children: [
Expanded(child: PlayerTrackDetails(albumArt: albumArt)), Expanded(child: PlayerTrackDetails(albumArt: albumArt)),
// controls // controls
const Expanded( Expanded(
flex: 3, flex: 3,
child: PlayerControls(), child: PlayerControls(),
), ),
@ -133,8 +137,7 @@ class Player extends HookConsumerWidget {
); );
}); });
} catch (e, stack) { } catch (e, stack) {
print("[VolumeSlider.onChange()] $e"); logger.e("onChange", e, stack);
print(stack);
} }
}, },
), ),

View File

@ -4,15 +4,18 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:just_audio/just_audio.dart'; import 'package:just_audio/just_audio.dart';
import 'package:spotube/helpers/zero-pad-num-str.dart'; import 'package:spotube/helpers/zero-pad-num-str.dart';
import 'package:spotube/hooks/playback.dart'; import 'package:spotube/hooks/playback.dart';
import 'package:spotube/models/Logger.dart';
import 'package:spotube/provider/Playback.dart'; import 'package:spotube/provider/Playback.dart';
class PlayerControls extends HookConsumerWidget { class PlayerControls extends HookConsumerWidget {
final Color? iconColor; final Color? iconColor;
const PlayerControls({ PlayerControls({
this.iconColor, this.iconColor,
Key? key, Key? key,
}) : super(key: key); }) : super(key: key);
final logger = createLogger(PlayerControls);
@override @override
Widget build(BuildContext context, ref) { Widget build(BuildContext context, ref) {
final Playback playback = ref.watch(playbackProvider); final Playback playback = ref.watch(playbackProvider);
@ -115,8 +118,7 @@ class PlayerControls extends HookConsumerWidget {
_shuffled.value = false; _shuffled.value = false;
} }
} catch (e, stack) { } catch (e, stack) {
print("[PlayerControls.onShuffle()] $e"); logger.e("onShuffle", e, stack);
print(stack);
} }
}), }),
IconButton( IconButton(
@ -150,8 +152,7 @@ class PlayerControls extends HookConsumerWidget {
_shuffled.value = false; _shuffled.value = false;
playback.reset(); playback.reset();
} catch (e, stack) { } catch (e, stack) {
print("[PlayerControls.onStop()] $e"); logger.e("onStop", e, stack);
print(stack);
} }
} }
: null, : null,

View File

@ -3,8 +3,11 @@ import 'package:html/parser.dart' as parser;
import 'package:html/dom.dart'; import 'package:html/dom.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:spotube/helpers/get-random-element.dart'; import 'package:spotube/helpers/get-random-element.dart';
import 'package:spotube/models/Logger.dart';
import 'package:spotube/models/generated_secrets.dart'; import 'package:spotube/models/generated_secrets.dart';
final logger = createLogger("GetLyrics");
String getTitle(String title, String artist) { String getTitle(String title, String artist) {
return "$title $artist" return "$title $artist"
.toLowerCase() .toLowerCase()
@ -40,8 +43,7 @@ Future<String?> extractLyrics(Uri url) async {
return lyrics; return lyrics;
} catch (e, stack) { } catch (e, stack) {
print("[extractLyrics] $e"); logger.e("extractLyrics", e, stack);
print(stack);
rethrow; rethrow;
} }
} }
@ -78,8 +80,7 @@ Future<List?> searchSong(
}).toList(); }).toList();
return results; return results;
} catch (e, stack) { } catch (e, stack) {
print("[searchSong] $e"); logger.e("searchSong", e, stack);
print(stack);
rethrow; rethrow;
} }
} }
@ -103,8 +104,7 @@ Future<String?> getLyrics(
String? lyrics = await extractLyrics(Uri.parse(results.first["url"])); String? lyrics = await extractLyrics(Uri.parse(results.first["url"]));
return lyrics; return lyrics;
} catch (e, stack) { } catch (e, stack) {
print("[getLyrics] $e"); logger.e("getLyrics", e, stack);
print(stack);
return null; return null;
} }
} }

View File

@ -3,9 +3,11 @@ import 'package:spotify/spotify.dart';
import 'package:spotube/components/Home/Home.dart'; import 'package:spotube/components/Home/Home.dart';
import 'package:spotube/helpers/server_ipc.dart'; import 'package:spotube/helpers/server_ipc.dart';
import 'package:spotube/models/LocalStorageKeys.dart'; import 'package:spotube/models/LocalStorageKeys.dart';
import 'package:spotube/models/Logger.dart';
import 'package:spotube/provider/Auth.dart'; import 'package:spotube/provider/Auth.dart';
const redirectUri = "http://localhost:4304/auth/spotify/callback"; const redirectUri = "http://localhost:4304/auth/spotify/callback";
final logger = createLogger("OAuthLogin");
Future<void> oauthLogin(Auth auth, Future<void> oauthLogin(Auth auth,
{required String clientId, required String clientSecret}) async { {required String clientId, required String clientSecret}) async {
@ -57,8 +59,7 @@ Future<void> oauthLogin(Auth auth,
isLoggedIn: true, isLoggedIn: true,
); );
} catch (e, stack) { } catch (e, stack) {
print("[oauthLogin()] $e"); logger.e("oauthLogin", e, stack);
print(stack);
rethrow; rethrow;
} }
} }

View File

@ -1,15 +1,18 @@
import 'dart:io'; import 'dart:io';
import 'package:spotube/models/Logger.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
final logger = createLogger("ServerIPC");
Future<String?> connectIpc(String authUri, String redirectUri) async { Future<String?> connectIpc(String authUri, String redirectUri) async {
try { try {
print("[Launching]: $authUri"); logger.i("[Launching]: $authUri");
await launch(authUri); await launch(authUri);
HttpServer server = HttpServer server =
await HttpServer.bind(InternetAddress.loopbackIPv4, 4304); await HttpServer.bind(InternetAddress.loopbackIPv4, 4304);
print("Server started"); logger.i("Server started");
await for (HttpRequest request in server) { await for (HttpRequest request in server) {
if (request.uri.path == "/auth/spotify/callback" && if (request.uri.path == "/auth/spotify/callback" &&
@ -30,9 +33,8 @@ Future<String?> connectIpc(String authUri, String redirectUri) async {
} }
} }
} }
} catch (error, stack) { } catch (e, stack) {
print("[connectIpc]: $error"); logger.e("connectIpc", e, stack);
print(stack);
rethrow; rethrow;
} }
} }

View File

@ -1,5 +1,8 @@
import 'package:spotube/models/Logger.dart';
import 'package:spotube/provider/Playback.dart'; import 'package:spotube/provider/Playback.dart';
final logger = createLogger("PlaybackHook");
Future<void> Function() useNextTrack(Playback playback) { Future<void> Function() useNextTrack(Playback playback) {
return () async { return () async {
try { try {
@ -7,8 +10,7 @@ Future<void> Function() useNextTrack(Playback playback) {
await playback.player.seek(Duration.zero); await playback.player.seek(Duration.zero);
playback.movePlaylistPositionBy(1); playback.movePlaylistPositionBy(1);
} catch (e, stack) { } catch (e, stack) {
print("[PlayerControls.onNext()] $e"); logger.e("useNextTrack", e, stack);
print(stack);
} }
}; };
} }
@ -20,8 +22,7 @@ Future<void> Function() usePreviousTrack(Playback playback) {
await playback.player.seek(Duration.zero); await playback.player.seek(Duration.zero);
playback.movePlaylistPositionBy(-1); playback.movePlaylistPositionBy(-1);
} catch (e, stack) { } catch (e, stack) {
print("[PlayerControls.onPrevious()] $e"); logger.e("onPrevious", e, stack);
print(stack);
} }
}; };
} }
@ -34,8 +35,7 @@ Future<void> Function([dynamic]) useTogglePlayPause(Playback playback) {
? await playback.player.pause() ? await playback.player.pause()
: await playback.player.play(); : await playback.player.play();
} catch (e, stack) { } catch (e, stack) {
print("[PlayPauseShortcut] $e"); logger.e("useTogglePlayPause", e, stack);
print(stack);
} }
}; };
} }

View File

@ -9,6 +9,7 @@ import 'package:hotkey_manager/hotkey_manager.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:spotube/models/GoRouteDeclarations.dart'; import 'package:spotube/models/GoRouteDeclarations.dart';
import 'package:spotube/models/LocalStorageKeys.dart'; import 'package:spotube/models/LocalStorageKeys.dart';
import 'package:spotube/models/Logger.dart';
import 'package:spotube/provider/AudioPlayer.dart'; import 'package:spotube/provider/AudioPlayer.dart';
import 'package:spotube/provider/ThemeProvider.dart'; import 'package:spotube/provider/ThemeProvider.dart';
import 'package:spotube/provider/YouTube.dart'; import 'package:spotube/provider/YouTube.dart';
@ -38,6 +39,7 @@ void main() async {
class MyApp extends HookConsumerWidget { class MyApp extends HookConsumerWidget {
final GoRouter _router = createGoRouter(); final GoRouter _router = createGoRouter();
final logger = createLogger(MyApp);
MyApp({Key? key}) : super(key: key); MyApp({Key? key}) : super(key: key);
@override @override

View File

@ -15,12 +15,12 @@ GoRouter createGoRouter() => GoRouter(
routes: [ routes: [
GoRoute( GoRoute(
path: "/", path: "/",
builder: (context, state) => const Home(), builder: (context, state) => Home(),
), ),
GoRoute( GoRoute(
path: "/login", path: "/login",
pageBuilder: (context, state) => SpotubePage( pageBuilder: (context, state) => SpotubePage(
child: const Login(), child: Login(),
), ),
), ),
GoRoute( GoRoute(

25
lib/models/Logger.dart Normal file
View File

@ -0,0 +1,25 @@
import 'dart:io';
import 'package:logger/logger.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as path;
_SpotubeLogger createLogger<T>(T owner) =>
_SpotubeLogger(owner is String ? owner : owner.toString());
class _SpotubeLogger extends Logger {
String owner;
_SpotubeLogger(this.owner);
@override
void log(Level level, message, [error, StackTrace? stackTrace]) {
getApplicationDocumentsDirectory().then((dir) async {
final file = File(path.join(dir.path, ".spotube_logs"));
if (level == Level.error) {
await file.writeAsString("[${DateTime.now()}]\n$message\n$stackTrace",
mode: FileMode.writeOnlyAppend);
}
});
super.log(level, "[$owner] $message", error, stackTrace);
}
}

View File

@ -9,6 +9,7 @@ import 'package:spotify/spotify.dart';
import 'package:spotube/helpers/artist-to-string.dart'; import 'package:spotube/helpers/artist-to-string.dart';
import 'package:spotube/helpers/image-to-url-string.dart'; import 'package:spotube/helpers/image-to-url-string.dart';
import 'package:spotube/helpers/search-youtube.dart'; import 'package:spotube/helpers/search-youtube.dart';
import 'package:spotube/models/Logger.dart';
import 'package:spotube/provider/AudioPlayer.dart'; import 'package:spotube/provider/AudioPlayer.dart';
import 'package:spotube/provider/YouTube.dart'; import 'package:spotube/provider/YouTube.dart';
import 'package:youtube_explode_dart/youtube_explode_dart.dart'; import 'package:youtube_explode_dart/youtube_explode_dart.dart';
@ -47,6 +48,7 @@ class CurrentPlaylist {
} }
class Playback extends ChangeNotifier { class Playback extends ChangeNotifier {
final _logger = createLogger(Playback);
CurrentPlaylist? _currentPlaylist; CurrentPlaylist? _currentPlaylist;
Track? _currentTrack; Track? _currentTrack;
@ -109,8 +111,7 @@ class Playback extends ChangeNotifier {
movePlaylistPositionBy(1); movePlaylistPositionBy(1);
} }
} catch (e, stack) { } catch (e, stack) {
print("[PrecessingStateStreamListener] $e"); _logger.e("PrecessingStateStreamListener", e, stack);
print(stack);
} }
}); });
@ -126,6 +127,7 @@ class Playback extends ChangeNotifier {
CurrentPlaylist? get currentPlaylist => _currentPlaylist; CurrentPlaylist? get currentPlaylist => _currentPlaylist;
Track? get currentTrack => _currentTrack; Track? get currentTrack => _currentTrack;
bool get isPlaying => _isPlaying; bool get isPlaying => _isPlaying;
AudioSession? get audioSession => _audioSession;
/// this duration field is almost static & changes occasionally /// this duration field is almost static & changes occasionally
/// ///
@ -258,8 +260,7 @@ class Playback extends ChangeNotifier {
} }
} }
} catch (e, stack) { } catch (e, stack) {
print("[Playback.startPlaying] $e"); _logger.e("startPlaying", e, stack);
print(stack);
} }
} }
} }

View File

@ -5,6 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hotkey_manager/hotkey_manager.dart'; import 'package:hotkey_manager/hotkey_manager.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:spotube/models/LocalStorageKeys.dart'; import 'package:spotube/models/LocalStorageKeys.dart';
import 'package:spotube/models/Logger.dart';
class UserPreferences extends ChangeNotifier { class UserPreferences extends ChangeNotifier {
String geniusAccessToken; String geniusAccessToken;
@ -20,6 +21,8 @@ class UserPreferences extends ChangeNotifier {
onInit(); onInit();
} }
final logger = createLogger(UserPreferences);
Future<HotKey?> _getHotKeyFromLocalStorage( Future<HotKey?> _getHotKeyFromLocalStorage(
SharedPreferences preferences, String key) async { SharedPreferences preferences, String key) async {
String? str = preferences.getString(key); String? str = preferences.getString(key);
@ -68,8 +71,7 @@ class UserPreferences extends ChangeNotifier {
); );
notifyListeners(); notifyListeners();
} catch (e, stack) { } catch (e, stack) {
print("[UserPreferences.onInit]: $e"); logger.e("onInit", e, stack);
print(stack);
} }
} }

View File

@ -373,6 +373,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "1.0.1"
logger:
dependency: "direct main"
description:
name: logger
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
logging: logging:
dependency: transitive dependency: transitive
description: description:

View File

@ -55,6 +55,7 @@ dependencies:
palette_generator: ^0.3.3 palette_generator: ^0.3.3
audio_session: ^0.1.6+1 audio_session: ^0.1.6+1
just_audio_background: ^0.0.1-beta.5 just_audio_background: ^0.0.1-beta.5
logger: ^1.1.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: