Files
PiliPlus/lib/pages/setting/pages/display_mode.dart
bggRGjQaUbCoE e236485bc7 mod: listener
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
2025-02-25 15:20:52 +08:00

122 lines
3.5 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:flutter_displaymode/flutter_displaymode.dart';
import 'package:hive/hive.dart';
import 'package:PiliPlus/utils/storage.dart';
class SetDisplayMode extends StatefulWidget {
const SetDisplayMode({super.key});
@override
State<SetDisplayMode> createState() => _SetDisplayModeState();
}
class _SetDisplayModeState extends State<SetDisplayMode> {
List<DisplayMode> modes = <DisplayMode>[];
DisplayMode? active;
DisplayMode? preferred;
Box get setting => GStorage.setting;
final ValueNotifier<int> page = ValueNotifier<int>(0);
late final PageController controller = PageController()
..addListener(listener);
void listener() {
page.value = controller.page!.round();
}
@override
void initState() {
super.initState();
init();
SchedulerBinding.instance.addPostFrameCallback((_) {
fetchAll();
});
}
@override
void dispose() {
controller.removeListener(listener);
controller.dispose();
super.dispose();
}
// 获取所有的mode
Future<void> fetchAll() async {
preferred = await FlutterDisplayMode.preferred;
active = await FlutterDisplayMode.active;
await setting.put(SettingBoxKey.displayMode, preferred.toString());
setState(() {});
}
// 初始化mode/手动设置
Future<void> init() async {
try {
modes = await FlutterDisplayMode.supported;
} on PlatformException catch (e) {
debugPrint(e.toString());
}
var res = await getDisplayModeType(modes);
preferred = modes.toList().firstWhere((el) => el == res);
FlutterDisplayMode.setPreferredMode(preferred!);
}
Future<DisplayMode> getDisplayModeType(modes) async {
var value = setting.get(SettingBoxKey.displayMode);
DisplayMode f = DisplayMode.auto;
if (value != null) {
f = modes.firstWhere((e) => e.toString() == value);
}
return f;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('屏幕帧率设置')),
body: SafeArea(
top: false,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
if (modes.isEmpty) const Text('Nothing here'),
Padding(
padding: const EdgeInsets.only(left: 25, top: 10, bottom: 5),
child: Text(
'没有生效重启app试试',
style: TextStyle(color: Theme.of(context).colorScheme.outline),
),
),
Expanded(
child: ListView.builder(
itemCount: modes.length,
itemBuilder: (context, int i) {
final DisplayMode mode = modes[i];
return RadioListTile<DisplayMode>(
value: mode,
title: mode == DisplayMode.auto
? const Text('自动')
: Text('$mode${mode == active ? " [系统]" : ""}'),
groupValue: preferred,
onChanged: (DisplayMode? newMode) async {
await FlutterDisplayMode.setPreferredMode(newMode!);
await Future<dynamic>.delayed(
const Duration(milliseconds: 100),
);
await fetchAll();
},
);
},
),
),
],
),
),
);
}
}