From 8990c4ae9205e5e6006389de226008fabe9cb8d1 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Sat, 26 Aug 2023 10:51:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=AB=98=E5=B8=A7=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/setting/pages/display_mode.dart | 94 +++++++++++++++++++++++ lib/pages/setting/style_setting.dart | 13 +++- lib/router/app_pages.dart | 4 + pubspec.lock | 8 ++ pubspec.yaml | 2 + 5 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 lib/pages/setting/pages/display_mode.dart diff --git a/lib/pages/setting/pages/display_mode.dart b/lib/pages/setting/pages/display_mode.dart new file mode 100644 index 00000000..4e84e956 --- /dev/null +++ b/lib/pages/setting/pages/display_mode.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_displaymode/flutter_displaymode.dart'; + +class SetDiaplayMode extends StatefulWidget { + const SetDiaplayMode({super.key}); + + @override + State createState() => _SetDiaplayModeState(); +} + +class _SetDiaplayModeState extends State { + List modes = []; + DisplayMode? active; + DisplayMode? preferred; + + final ValueNotifier page = ValueNotifier(0); + late final PageController controller = PageController() + ..addListener(() { + page.value = controller.page!.round(); + }); + @override + void initState() { + super.initState(); + init(); + SchedulerBinding.instance.addPostFrameCallback((_) { + fetchAll(); + }); + } + + Future fetchAll() async { + preferred = await FlutterDisplayMode.preferred; + active = await FlutterDisplayMode.active; + // GStorage().setDisplayModeType(preferred!); + setState(() {}); + } + + Future init() async { + try { + modes = await FlutterDisplayMode.supported; + } on PlatformException catch (e) { + print(e); + } + // var res = await GStorage().getDisplayModeType(); + // preferred = modes.toList().firstWhere((el) => el == res); + FlutterDisplayMode.setPreferredMode(preferred!); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('屏幕帧率设置')), + body: SafeArea( + top: false, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 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: (_, int i) { + final DisplayMode mode = modes[i]; + return RadioListTile( + value: mode, + title: mode == DisplayMode.auto + ? const Text('自动') + : Text('$mode${mode == active ? " [系统]" : ""}'), + groupValue: preferred, + onChanged: (DisplayMode? newMode) async { + await FlutterDisplayMode.setPreferredMode(newMode!); + await Future.delayed( + const Duration(milliseconds: 100), + ); + await fetchAll(); + }, + ); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/setting/style_setting.dart b/lib/pages/setting/style_setting.dart index 987ad256..73cad841 100644 --- a/lib/pages/setting/style_setting.dart +++ b/lib/pages/setting/style_setting.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; @@ -195,12 +197,21 @@ class _StyleSettingState extends State { dense: false, onTap: () => Get.toNamed('/colorSetting'), title: Text('应用主题', style: titleStyle), + trailing: const Icon(Icons.arrow_forward_ios, size: 17), ), ListTile( dense: false, onTap: () => Get.toNamed('/fontSizeSetting'), title: Text('字体大小', style: titleStyle), - ) + trailing: const Icon(Icons.arrow_forward_ios, size: 17), + ), + if (Platform.isAndroid) + ListTile( + dense: false, + onTap: () => Get.toNamed('/displayModeSetting'), + title: Text('屏幕帧率', style: titleStyle), + trailing: const Icon(Icons.arrow_forward_ios, size: 17), + ) ], ), ); diff --git a/lib/router/app_pages.dart b/lib/router/app_pages.dart index 6ce0717e..7edb435b 100644 --- a/lib/router/app_pages.dart +++ b/lib/router/app_pages.dart @@ -22,6 +22,7 @@ import 'package:pilipala/pages/search/index.dart'; import 'package:pilipala/pages/searchResult/index.dart'; import 'package:pilipala/pages/setting/extra_setting.dart'; import 'package:pilipala/pages/setting/pages/color_select.dart'; +import 'package:pilipala/pages/setting/pages/display_mode.dart'; import 'package:pilipala/pages/setting/pages/font_size_select.dart'; import 'package:pilipala/pages/setting/play_setting.dart'; import 'package:pilipala/pages/setting/privacy_setting.dart'; @@ -101,6 +102,9 @@ class Routes { CustomGetPage(name: '/colorSetting', page: () => const ColorSelectPage()), CustomGetPage( name: '/fontSizeSetting', page: () => const FontSizeSelectPage()), + // 屏幕帧率 + CustomGetPage( + name: '/displayModeSetting', page: () => const SetDiaplayMode()), // 关于 CustomGetPage(name: '/about', page: () => const AboutPage()), ]; diff --git a/pubspec.lock b/pubspec.lock index ce8ddd59..2205250b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -438,6 +438,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.3.1" + flutter_displaymode: + dependency: "direct main" + description: + name: flutter_displaymode + sha256: "42c5e9abd13d28ed74f701b60529d7f8416947e58256e6659c5550db719c57ef" + url: "https://pub.dev" + source: hosted + version: "0.6.0" flutter_launcher_icons: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index b177f93b..3b78e438 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -115,6 +115,8 @@ dependencies: flutter_svg: ^2.0.7 # 防抖节流 easy_debounce: ^2.0.3 + # 高帧率 + flutter_displaymode: ^0.6.0 dev_dependencies: flutter_test: