mirror of
https://github.com/lifegpc/eh_downloader_flutter.git
synced 2026-07-08 01:30:28 +08:00
Add Settings Page
This commit is contained in:
144
lib/settings.dart
Normal file
144
lib/settings.dart
Normal file
@@ -0,0 +1,144 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'globals.dart';
|
||||
import 'main.dart';
|
||||
|
||||
final _log = Logger("SettingsPage");
|
||||
|
||||
class SettingsPage extends StatefulWidget {
|
||||
const SettingsPage({Key? key}) : super(key: key);
|
||||
|
||||
static const String routeName = '/settings';
|
||||
|
||||
@override
|
||||
State<SettingsPage> createState() => _SettingsPage();
|
||||
}
|
||||
|
||||
class _SettingsPage extends State<SettingsPage> with ThemeModeWidget {
|
||||
Lang _ori_lang = Lang.system;
|
||||
Lang _lang = Lang.system;
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
try {
|
||||
_ori_lang = Lang.values[prefs.getInt("lang") ?? 0];
|
||||
_lang = _ori_lang;
|
||||
} catch (e) {
|
||||
_log.warning("Failed to get lang:", e);
|
||||
_ori_lang = Lang.system;
|
||||
_lang = Lang.system;
|
||||
}
|
||||
}
|
||||
|
||||
void fallback(BuildContext context) {
|
||||
if (_ori_lang != _lang) {
|
||||
MainApp.of(context).changeLang(_ori_lang);
|
||||
}
|
||||
}
|
||||
|
||||
void reset(BuildContext context) {
|
||||
if (_lang != Lang.system) MainApp.of(context).changeLang(Lang.system);
|
||||
setState(() {
|
||||
_lang = Lang.system;
|
||||
});
|
||||
}
|
||||
|
||||
Future<bool> save() async {
|
||||
bool re = true;
|
||||
if (!await prefs.setInt("lang", _lang.index)) {
|
||||
re = false;
|
||||
_log.warning("Failed to save lang.");
|
||||
} else {
|
||||
_ori_lang = _lang;
|
||||
}
|
||||
return re;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
leading: IconButton(
|
||||
onPressed: () {
|
||||
fallback(context);
|
||||
context.canPop() ? context.pop() : context.go("/");
|
||||
},
|
||||
icon: const Icon(Icons.arrow_back),
|
||||
),
|
||||
title: Text(AppLocalizations.of(context)!.settings),
|
||||
actions: [
|
||||
buildThemeModeIcon(context),
|
||||
buildMoreVertSettingsButon(context),
|
||||
],
|
||||
),
|
||||
body: LayoutBuilder(
|
||||
builder: (context, constraints) {
|
||||
return SingleChildScrollView(
|
||||
child: ConstrainedBox(
|
||||
constraints:
|
||||
BoxConstraints(minHeight: constraints.maxHeight),
|
||||
child: Container(
|
||||
padding: MediaQuery.of(context).size.width > 810
|
||||
? const EdgeInsets.symmetric(horizontal: 100)
|
||||
: null,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Container(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(vertical: 8),
|
||||
child: DropdownMenu<Lang>(
|
||||
initialSelection: _lang,
|
||||
onSelected: (value) {
|
||||
if (value != null) {
|
||||
setState(() {
|
||||
_lang = value;
|
||||
});
|
||||
MainApp.of(context).changeLang(_lang);
|
||||
}
|
||||
},
|
||||
label:
|
||||
Text(AppLocalizations.of(context)!.lang),
|
||||
dropdownMenuEntries: Lang.values
|
||||
.map((e) => DropdownMenuEntry(
|
||||
value: e,
|
||||
label: e == Lang.system
|
||||
? AppLocalizations.of(context)!
|
||||
.systemLang
|
||||
: e.langName))
|
||||
.toList(),
|
||||
leadingIcon: const Icon(Icons.language),
|
||||
)),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 8),
|
||||
child: ElevatedButton(
|
||||
onPressed: () {
|
||||
reset(context);
|
||||
},
|
||||
child: Text(
|
||||
AppLocalizations.of(context)!
|
||||
.reset))),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 8),
|
||||
child: ElevatedButton(
|
||||
onPressed: () {
|
||||
save();
|
||||
},
|
||||
child: Text(
|
||||
AppLocalizations.of(context)!.save),
|
||||
))
|
||||
],
|
||||
),
|
||||
],
|
||||
))));
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user