add scale setting

This commit is contained in:
Fabian Freund
2026-03-05 17:59:59 +01:00
parent d4265fc8c8
commit 66183ec075
7 changed files with 191 additions and 2 deletions
+77 -1
View File
@@ -30,11 +30,13 @@ class MainApp extends HookConsumerWidget {
final ThemeData? theme;
final ThemeData? darkTheme;
final ThemeMode? themeMode;
final double uiScaleFactor;
const MainApp({
required this.theme,
required this.darkTheme,
required this.themeMode,
required this.uiScaleFactor,
super.key,
});
@@ -51,6 +53,12 @@ class MainApp extends HookConsumerWidget {
theme: theme,
darkTheme: darkTheme,
themeMode: themeMode,
builder: (context, child) {
return _AppUiScale(
uiScaleFactor: uiScaleFactor,
child: child ?? const SizedBox.shrink(),
);
},
home: Scaffold(
body: Center(
child: Column(
@@ -76,7 +84,12 @@ class MainApp extends HookConsumerWidget {
themeMode: themeMode,
routerConfig: router.value,
builder: (context, child) {
return _SyncEventListener(child: child ?? const SizedBox.shrink());
return _AppUiScale(
uiScaleFactor: uiScaleFactor,
child: _SyncEventListener(
child: child ?? const SizedBox.shrink(),
),
);
},
);
},
@@ -86,6 +99,12 @@ class MainApp extends HookConsumerWidget {
theme: theme,
darkTheme: darkTheme,
themeMode: themeMode,
builder: (context, child) {
return _AppUiScale(
uiScaleFactor: uiScaleFactor,
child: child ?? const SizedBox.shrink(),
);
},
home: Scaffold(
appBar: AppBar(title: const Text('Initiallization Error')),
body: Center(
@@ -106,6 +125,63 @@ class MainApp extends HookConsumerWidget {
}
}
class _AppUiScale extends StatelessWidget {
final double uiScaleFactor;
final Widget child;
const _AppUiScale({required this.uiScaleFactor, required this.child});
@override
Widget build(BuildContext context) {
if (uiScaleFactor == 1.0) {
return child;
}
final mediaQuery = MediaQuery.of(context);
return MediaQuery(
data: mediaQuery.copyWith(
textScaler: _AppTextScaler(
baseTextScaler: mediaQuery.textScaler,
uiScaleFactor: uiScaleFactor,
),
),
child: child,
);
}
}
class _AppTextScaler extends TextScaler {
final TextScaler baseTextScaler;
final double uiScaleFactor;
const _AppTextScaler({
required this.baseTextScaler,
required this.uiScaleFactor,
}) : assert(uiScaleFactor > 0);
@override
double scale(double fontSize) =>
baseTextScaler.scale(fontSize) * uiScaleFactor;
@override
double get textScaleFactor => scale(1.0);
@override
bool operator ==(Object other) {
if (identical(this, other)) {
return true;
}
return other is _AppTextScaler &&
baseTextScaler == other.baseTextScaler &&
uiScaleFactor == other.uiScaleFactor;
}
@override
int get hashCode => Object.hash(baseTextScaler, uiScaleFactor);
}
class _SyncEventListener extends ConsumerWidget {
final Widget child;