Fix localization imports and build issues

- Update localization imports to use package path
- Remove unused provider import from main.dart
- Fix default test file
- Refactor settings dialogs to use Radio widget
This commit is contained in:
m3mo 2026-02-02 20:48:42 +01:00
parent cb308bbf68
commit f121df50f1
9 changed files with 126 additions and 95 deletions

View File

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:agenda_tasks/l10n/app_localizations.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'core/di/injection_container.dart'; import 'core/di/injection_container.dart';

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:agenda_tasks/l10n/app_localizations.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -74,30 +74,9 @@ class SettingsPage extends StatelessWidget {
) { ) {
showDialog( showDialog(
context: context, context: context,
builder: (context) => AlertDialog( builder: (dialogContext) => _LanguageDialog(
title: Text(l10n.language), vm: vm,
content: Column( l10n: l10n,
mainAxisSize: MainAxisSize.min,
children: SettingsViewModel.supportedLocales.map((locale) {
return RadioListTile<Locale>(
title: Text(vm.getLanguageName(locale)),
value: locale,
groupValue: vm.locale,
onChanged: (value) {
if (value != null) {
vm.setLocale(value);
Navigator.pop(context);
}
},
);
}).toList(),
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(l10n.cancel),
),
],
), ),
); );
} }
@ -109,53 +88,128 @@ class SettingsPage extends StatelessWidget {
) { ) {
showDialog( showDialog(
context: context, context: context,
builder: (context) => AlertDialog( builder: (dialogContext) => _ThemeDialog(
title: Text(l10n.darkMode), vm: vm,
content: Column( l10n: l10n,
mainAxisSize: MainAxisSize.min, ),
children: [ );
RadioListTile<ThemeMode>( }
title: Text(l10n.systemDefault), }
value: ThemeMode.system,
groupValue: vm.themeMode, class _LanguageDialog extends StatefulWidget {
final SettingsViewModel vm;
final AppLocalizations l10n;
const _LanguageDialog({required this.vm, required this.l10n});
@override
State<_LanguageDialog> createState() => _LanguageDialogState();
}
class _LanguageDialogState extends State<_LanguageDialog> {
late Locale? _selectedLocale;
@override
void initState() {
super.initState();
_selectedLocale = widget.vm.locale;
}
@override
Widget build(BuildContext context) {
return AlertDialog(
title: Text(widget.l10n.language),
content: Column(
mainAxisSize: MainAxisSize.min,
children: SettingsViewModel.supportedLocales.map((locale) {
return ListTile(
title: Text(widget.vm.getLanguageName(locale)),
leading: Radio<Locale>(
value: locale,
groupValue: _selectedLocale,
onChanged: (value) { onChanged: (value) {
setState(() => _selectedLocale = value);
if (value != null) { if (value != null) {
vm.setThemeMode(value); widget.vm.setLocale(value);
Navigator.pop(context); Navigator.pop(context);
} }
}, },
), ),
RadioListTile<ThemeMode>( onTap: () {
title: Text(l10n.lightMode), setState(() => _selectedLocale = locale);
value: ThemeMode.light, widget.vm.setLocale(locale);
groupValue: vm.themeMode, Navigator.pop(context);
onChanged: (value) { },
if (value != null) { );
vm.setThemeMode(value); }).toList(),
Navigator.pop(context); ),
} actions: [
}, TextButton(
), onPressed: () => Navigator.pop(context),
RadioListTile<ThemeMode>( child: Text(widget.l10n.cancel),
title: Text(l10n.darkModeOption),
value: ThemeMode.dark,
groupValue: vm.themeMode,
onChanged: (value) {
if (value != null) {
vm.setThemeMode(value);
Navigator.pop(context);
}
},
),
],
), ),
actions: [ ],
TextButton( );
onPressed: () => Navigator.pop(context), }
child: Text(l10n.cancel), }
),
class _ThemeDialog extends StatefulWidget {
final SettingsViewModel vm;
final AppLocalizations l10n;
const _ThemeDialog({required this.vm, required this.l10n});
@override
State<_ThemeDialog> createState() => _ThemeDialogState();
}
class _ThemeDialogState extends State<_ThemeDialog> {
late ThemeMode _selectedMode;
@override
void initState() {
super.initState();
_selectedMode = widget.vm.themeMode;
}
@override
Widget build(BuildContext context) {
return AlertDialog(
title: Text(widget.l10n.darkMode),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
_buildThemeOption(ThemeMode.system, widget.l10n.systemDefault),
_buildThemeOption(ThemeMode.light, widget.l10n.lightMode),
_buildThemeOption(ThemeMode.dark, widget.l10n.darkModeOption),
], ],
), ),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(widget.l10n.cancel),
),
],
);
}
Widget _buildThemeOption(ThemeMode mode, String label) {
return ListTile(
title: Text(label),
leading: Radio<ThemeMode>(
value: mode,
groupValue: _selectedMode,
onChanged: (value) {
setState(() => _selectedMode = value!);
widget.vm.setThemeMode(value!);
Navigator.pop(context);
},
),
onTap: () {
setState(() => _selectedMode = mode);
widget.vm.setThemeMode(mode);
Navigator.pop(context);
},
); );
} }
} }

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:agenda_tasks/l10n/app_localizations.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:agenda_tasks/l10n/app_localizations.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:agenda_tasks/l10n/app_localizations.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:agenda_tasks/l10n/app_localizations.dart';
import '../viewmodels/daily_tasks_viewmodel.dart'; import '../viewmodels/daily_tasks_viewmodel.dart';

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:agenda_tasks/l10n/app_localizations.dart';
import '../../domain/entities/task_entity.dart'; import '../../domain/entities/task_entity.dart';
import '../../domain/enums/priority.dart'; import '../../domain/enums/priority.dart';

View File

@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'app.dart'; import 'app.dart';
import 'core/di/injection_container.dart' as di; import 'core/di/injection_container.dart' as di;

View File

@ -1,30 +1,8 @@
// This is a basic Flutter widget test.
//
// To perform an interaction with a widget in your test, use the WidgetTester
// utility in the flutter_test package. For example, you can send tap and scroll
// gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct.
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:agenda_tasks/main.dart';
void main() { void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async { testWidgets('Placeholder test', (WidgetTester tester) async {
// Build our app and trigger a frame. // Placeholder test - will be expanded with actual widget tests
await tester.pumpWidget(const MyApp()); expect(true, isTrue);
// Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget);
expect(find.text('1'), findsNothing);
// Tap the '+' icon and trigger a frame.
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
// Verify that our counter has incremented.
expect(find.text('0'), findsNothing);
expect(find.text('1'), findsOneWidget);
}); });
} }