Fixed no Settings icon on larger displays

Window size persistance support
This commit is contained in:
Kingkor Roy Tirtho 2022-07-13 19:22:58 +06:00
parent 708995d542
commit 42294b027a
5 changed files with 66 additions and 13 deletions

View File

@ -47,8 +47,8 @@ class Home extends HookConsumerWidget {
md: 80, md: 80,
lg: 256, lg: 256,
sm: 0, sm: 0,
xl: 0, xl: 256,
xxl: 0, xxl: 256,
); );
final _selectedIndex = useState(0); final _selectedIndex = useState(0);
_onSelectedIndexChanged(int index) => _selectedIndex.value = index; _onSelectedIndexChanged(int index) => _selectedIndex.value = index;

View File

@ -37,7 +37,6 @@ class Sidebar extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final breakpoints = useBreakpoints(); final breakpoints = useBreakpoints();
if (breakpoints.isSm) return Container();
final extended = useState(false); final extended = useState(false);
final meSnapshot = ref.watch(currentUserQuery); final meSnapshot = ref.watch(currentUserQuery);
final auth = ref.watch(authProvider); final auth = ref.watch(authProvider);
@ -46,8 +45,8 @@ class Sidebar extends HookConsumerWidget {
md: 80, md: 80,
lg: 256, lg: 256,
sm: 0, sm: 0,
xl: 0, xl: 256,
xxl: 0, xxl: 256,
); );
useEffect(() { useEffect(() {
@ -60,6 +59,8 @@ class Sidebar extends HookConsumerWidget {
return null; return null;
}); });
if (breakpoints.isSm) return Container();
return SafeArea( return SafeArea(
child: Material( child: Material(
color: Theme.of(context).navigationRailTheme.backgroundColor, color: Theme.of(context).navigationRailTheme.backgroundColor,

View File

@ -1,3 +1,5 @@
import 'dart:convert';
import 'package:audio_service/audio_service.dart'; import 'package:audio_service/audio_service.dart';
import 'package:bitsdojo_window/bitsdojo_window.dart'; import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -5,8 +7,10 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:spotube/entities/CacheTrack.dart'; import 'package:spotube/entities/CacheTrack.dart';
import 'package:spotube/models/GoRouteDeclarations.dart'; import 'package:spotube/models/GoRouteDeclarations.dart';
import 'package:spotube/models/LocalStorageKeys.dart';
import 'package:spotube/models/Logger.dart'; import 'package:spotube/models/Logger.dart';
import 'package:spotube/provider/AudioPlayer.dart'; import 'package:spotube/provider/AudioPlayer.dart';
import 'package:spotube/provider/Playback.dart'; import 'package:spotube/provider/Playback.dart';
@ -23,13 +27,20 @@ void main() async {
Hive.registerAdapter(CacheTrackEngagementAdapter()); Hive.registerAdapter(CacheTrackEngagementAdapter());
if (kIsDesktop) { if (kIsDesktop) {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
// final client = DBusClient.session(); doWhenWindowReady(() async {
// await client.registerObject(Media_Player()); final localStorage = await SharedPreferences.getInstance();
doWhenWindowReady(() { final rawSize = localStorage.getString(LocalStorageKeys.windowSizeInfo);
final savedSize = rawSize != null ? json.decode(rawSize) : null;
final double? height = savedSize?["height"];
final double? width = savedSize?["width"];
appWindow.minSize = const Size(359, 700); appWindow.minSize = const Size(359, 700);
appWindow.alignment = Alignment.center; appWindow.alignment = Alignment.center;
appWindow.title = "Spotube"; appWindow.title = "Spotube";
if (height != null && width != null && height >= 700 && width >= 359) {
appWindow.size = Size(width, height);
} else {
appWindow.maximize(); appWindow.maximize();
}
appWindow.show(); appWindow.show();
}); });
} }
@ -71,13 +82,52 @@ void main() async {
)); ));
} }
class Spotube extends HookConsumerWidget { class Spotube extends StatefulHookConsumerWidget {
const Spotube({Key? key}) : super(key: key);
@override
_SpotubeState createState() => _SpotubeState();
}
class _SpotubeState extends ConsumerState<Spotube> with WidgetsBindingObserver {
final GoRouter _router = createGoRouter(); final GoRouter _router = createGoRouter();
final logger = getLogger(Spotube); final logger = getLogger(Spotube);
SharedPreferences? localStorage;
Size? prevSize;
Spotube({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context, ref) { void initState() {
super.initState();
SharedPreferences.getInstance().then(((value) => localStorage = value));
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeMetrics() {
super.didChangeMetrics();
if (localStorage == null ||
(prevSize?.width == appWindow.size.width &&
prevSize?.height == appWindow.size.height) ||
kIsMobile) return;
localStorage!.setString(
LocalStorageKeys.windowSizeInfo,
jsonEncode({
'width': appWindow.size.width,
'height': appWindow.size.height,
}),
);
prevSize = appWindow.size;
}
@override
Widget build(BuildContext context) {
final themeMode = final themeMode =
ref.watch(userPreferencesProvider.select((s) => s.themeMode)); ref.watch(userPreferencesProvider.select((s) => s.themeMode));
final accentMaterialColor = final accentMaterialColor =

View File

@ -16,4 +16,6 @@ abstract class LocalStorageKeys {
static String playPauseHotKey = "play_pause_hot_key"; static String playPauseHotKey = "play_pause_hot_key";
static String volume = "volume"; static String volume = "volume";
static String windowSizeInfo = "window_size_info";
} }

View File

@ -390,7 +390,7 @@ packages:
name: flutter_hooks name: flutter_hooks
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.18.4" version: "0.18.5+1"
flutter_launcher_icons: flutter_launcher_icons:
dependency: "direct dev" dependency: "direct dev"
description: description: