fix(legacy): add dark mode support for pickers and dialogs

This commit is contained in:
2026-04-26 08:25:33 +02:00
parent 4422f93903
commit 376e6bc13a
10 changed files with 79 additions and 17 deletions

View File

@@ -73,6 +73,7 @@ class _ActivityMeterBody extends ConsumerWidget {
context: context, context: context,
firstDate: now.subtract(const Duration(days: 365)), firstDate: now.subtract(const Duration(days: 365)),
lastDate: now, lastDate: now,
builder: legacyPickerThemeBuilder,
); );
if (picked != null) { if (picked != null) {
notifier.selectCustomRange(picked.start, picked.end); notifier.selectCustomRange(picked.start, picked.end);

View File

@@ -2,6 +2,7 @@ import 'package:design_system/design_system.dart';
import 'package:device_management/src/core/domain/entities/app_usage_schedule_entity.dart'; import 'package:device_management/src/core/domain/entities/app_usage_schedule_entity.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:legacy_theme/legacy_theme.dart'; import 'package:legacy_theme/legacy_theme.dart';
import 'package:legacy_ui/legacy_ui.dart';
import 'package:sf_localizations/sf_localizations.dart'; import 'package:sf_localizations/sf_localizations.dart';
import 'package:utils/utils.dart'; import 'package:utils/utils.dart';
@@ -55,6 +56,7 @@ class _EditSchedulePeriodSheetState extends State<_EditSchedulePeriodSheet> {
final picked = await showTimePicker( final picked = await showTimePicker(
context: context, context: context,
initialTime: isStart ? _start : _end, initialTime: isStart ? _start : _end,
builder: legacyPickerThemeBuilder,
); );
if (picked == null) return; if (picked == null) return;
setState(() { setState(() {

View File

@@ -92,6 +92,7 @@ class AppsUseScreen extends ConsumerWidget {
context: context, context: context,
firstDate: now.subtract(const Duration(days: 365)), firstDate: now.subtract(const Duration(days: 365)),
lastDate: now, lastDate: now,
builder: legacyPickerThemeBuilder,
); );
if (picked != null) { if (picked != null) {
notifier.selectCustomRange(picked.start, picked.end); notifier.selectCustomRange(picked.start, picked.end);

View File

@@ -2,6 +2,7 @@ import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:legacy_theme/legacy_theme.dart'; import 'package:legacy_theme/legacy_theme.dart';
import 'package:legacy_ui/legacy_ui.dart';
import 'package:sf_localizations/sf_localizations.dart'; import 'package:sf_localizations/sf_localizations.dart';
import 'package:utils/utils.dart'; import 'package:utils/utils.dart';
@@ -110,6 +111,7 @@ class _EditPeriodSheetState extends ConsumerState<EditPeriodSheet> {
final picked = await showTimePicker( final picked = await showTimePicker(
context: context, context: context,
initialTime: start, initialTime: start,
builder: legacyPickerThemeBuilder,
); );
if (picked != null) _start.value = picked; if (picked != null) _start.value = picked;
}, },
@@ -128,6 +130,7 @@ class _EditPeriodSheetState extends ConsumerState<EditPeriodSheet> {
final picked = await showTimePicker( final picked = await showTimePicker(
context: context, context: context,
initialTime: end, initialTime: end,
builder: legacyPickerThemeBuilder,
); );
if (picked != null) _end.value = picked; if (picked != null) _end.value = picked;
}, },

View File

@@ -48,6 +48,7 @@ class _HealthScreenState extends ConsumerState<HealthScreen>
context: context, context: context,
firstDate: now.subtract(const Duration(days: 365)), firstDate: now.subtract(const Duration(days: 365)),
lastDate: now, lastDate: now,
builder: legacyPickerThemeBuilder,
); );
if (picked != null) { if (picked != null) {
notifier.selectCustomRange(picked.start, picked.end); notifier.selectCustomRange(picked.start, picked.end);

View File

@@ -1,5 +1,6 @@
import 'package:design_system/design_system.dart'; import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:legacy_ui/legacy_ui.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:legacy_auth/src/features/device_setup/presentation/providers/device_setup_controller.dart'; import 'package:legacy_auth/src/features/device_setup/presentation/providers/device_setup_controller.dart';
import 'package:legacy_auth/src/features/device_setup/presentation/providers/device_setup_form_controllers.dart'; import 'package:legacy_auth/src/features/device_setup/presentation/providers/device_setup_form_controllers.dart';
@@ -21,6 +22,7 @@ Future<void> _pickBornAt(
initialDate: safeInitial, initialDate: safeInitial,
firstDate: DateTime(1900, 1, 1), firstDate: DateTime(1900, 1, 1),
lastDate: now, lastDate: now,
builder: legacyPickerThemeBuilder,
); );
if (picked != null) onPicked(picked); if (picked != null) onPicked(picked);

View File

@@ -1,4 +1,3 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:legacy_theme/legacy_theme.dart'; import 'package:legacy_theme/legacy_theme.dart';
@@ -98,7 +97,7 @@ class _AlarmFormSheet extends ConsumerWidget {
style: TextStyle( style: TextStyle(
color: formState.canSave color: formState.canSave
? primaryColor ? primaryColor
: Colors.grey, : Theme.of(context).colorScheme.outline,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: fontSize:
SizeUtils.getByScreen(small: 16, big: 17), SizeUtils.getByScreen(small: 16, big: 17),
@@ -108,20 +107,44 @@ class _AlarmFormSheet extends ConsumerWidget {
], ],
), ),
SizedBox(height: SizeUtils.getByScreen(small: 16, big: 18)), SizedBox(height: SizeUtils.getByScreen(small: 16, big: 18)),
Container( GestureDetector(
height: SizeUtils.getByScreen(small: 160, big: 180), onTap: () async {
decoration: BoxDecoration( final picked = await showTimePicker(
borderRadius: context: context,
const BorderRadius.all(Radius.circular(16)), initialTime: TimeOfDay(
color: Colors.grey.shade50, hour: formState.durationMinutes ~/ 60,
), minute: formState.durationMinutes % 60,
child: CupertinoTimerPicker( ),
mode: CupertinoTimerPickerMode.hm, builder: legacyPickerThemeBuilder,
initialTimerDuration: Duration( );
minutes: formState.durationMinutes, if (picked != null) {
notifier.setDurationMinutes(
picked.hour * 60 + picked.minute,
);
}
},
child: Container(
width: double.infinity,
padding: EdgeInsets.symmetric(
vertical: SizeUtils.getByScreen(small: 24, big: 28),
),
decoration: BoxDecoration(
borderRadius:
const BorderRadius.all(Radius.circular(16)),
color: Theme.of(context)
.colorScheme
.surfaceContainerHighest,
),
child: Center(
child: Text(
'${(formState.durationMinutes ~/ 60).toString().padLeft(2, '0')}:${(formState.durationMinutes % 60).toString().padLeft(2, '0')}',
style: TextStyle(
fontSize: 48,
fontWeight: FontWeight.w300,
color: primaryColor,
),
),
), ),
onTimerDurationChanged: (duration) =>
notifier.setDurationMinutes(duration.inMinutes),
), ),
), ),
SizedBox(height: SizeUtils.getByScreen(small: 20, big: 22)), SizedBox(height: SizeUtils.getByScreen(small: 20, big: 22)),
@@ -197,7 +220,9 @@ class _RadioOption extends StatelessWidget {
children: [ children: [
Icon( Icon(
isSelected ? Icons.radio_button_checked : Icons.radio_button_off, isSelected ? Icons.radio_button_checked : Icons.radio_button_off,
color: isSelected ? primaryColor : Colors.grey, color: isSelected
? primaryColor
: Theme.of(context).colorScheme.outline,
size: SizeUtils.getByScreen(small: 22, big: 24), size: SizeUtils.getByScreen(small: 22, big: 24),
), ),
const SizedBox(width: 12), const SizedBox(width: 12),

View File

@@ -6,3 +6,4 @@ export 'src/widgets/refreshable_error_state.dart';
export 'src/widgets/week_day_chips.dart'; export 'src/widgets/week_day_chips.dart';
export 'src/providers/map_style_provider.dart'; export 'src/providers/map_style_provider.dart';
export 'src/transitions/legacy_transitions.dart'; export 'src/transitions/legacy_transitions.dart';
export 'src/utils/legacy_picker_theme.dart';

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:legacy_theme/legacy_theme.dart';
const _duration = Duration(milliseconds: 300); const _duration = Duration(milliseconds: 300);
const _dialogDuration = Duration(milliseconds: 500); const _dialogDuration = Duration(milliseconds: 500);
@@ -8,13 +9,24 @@ Future<T?> showLegacyDialog<T>({
required WidgetBuilder builder, required WidgetBuilder builder,
bool barrierDismissible = true, bool barrierDismissible = true,
}) { }) {
final primaryColor = context.sfColors.legacyPrimary;
final brightness = Theme.of(context).brightness;
return showGeneralDialog<T>( return showGeneralDialog<T>(
context: context, context: context,
barrierDismissible: barrierDismissible, barrierDismissible: barrierDismissible,
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel, barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
barrierColor: Colors.black54, barrierColor: Colors.black54,
transitionDuration: _dialogDuration, transitionDuration: _dialogDuration,
pageBuilder: (dialogContext, __, ___) => builder(dialogContext), pageBuilder: (dialogContext, __, ___) {
final colorScheme = brightness == Brightness.dark
? ColorScheme.dark(primary: primaryColor)
: ColorScheme.light(primary: primaryColor);
return Theme(
data: Theme.of(dialogContext).copyWith(colorScheme: colorScheme),
child: builder(dialogContext),
);
},
transitionBuilder: (_, animation, __, child) { transitionBuilder: (_, animation, __, child) {
final fadeCurved = CurvedAnimation( final fadeCurved = CurvedAnimation(
parent: animation, parent: animation,

View File

@@ -0,0 +1,14 @@
import 'package:flutter/material.dart';
import 'package:legacy_theme/legacy_theme.dart';
Widget legacyPickerThemeBuilder(BuildContext context, Widget? child) {
final primaryColor = context.sfColors.legacyPrimary;
final brightness = Theme.of(context).brightness;
final colorScheme = brightness == Brightness.dark
? ColorScheme.dark(primary: primaryColor)
: ColorScheme.light(primary: primaryColor);
return Theme(
data: Theme.of(context).copyWith(colorScheme: colorScheme),
child: child!,
);
}