From 3a9db2297ca4063bdb5d99a82ee0b2869835da9a Mon Sep 17 00:00:00 2001 From: niuhuan Date: Fri, 26 Nov 2021 11:06:20 +0800 Subject: [PATCH] add gui animation setting --- lib/basic/config/GuiAnimation.dart | 42 ++++++++++++++++++++++++++++++ lib/screens/AppScreen.dart | 21 ++++++++++++--- lib/screens/CategoriesScreen.dart | 7 ++++- lib/screens/InitScreen.dart | 2 ++ lib/screens/SettingsScreen.dart | 4 ++- lib/screens/SpaceScreen.dart | 5 +++- 6 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 lib/basic/config/GuiAnimation.dart diff --git a/lib/basic/config/GuiAnimation.dart b/lib/basic/config/GuiAnimation.dart new file mode 100644 index 0000000..1b82bf3 --- /dev/null +++ b/lib/basic/config/GuiAnimation.dart @@ -0,0 +1,42 @@ +/// 自动全屏 + +import 'package:flutter/material.dart'; + +import '../Common.dart'; +import '../Method.dart'; + +const _propertyName = "guiAnimation"; +late bool _guiAnimation; + +Future initGuiAnimation() async { + _guiAnimation = (await method.loadProperty(_propertyName, "true")) == "true"; +} + +bool currentGuiAnimation() { + return _guiAnimation; +} + +Future _chooseGuiAnimation(BuildContext context) async { + String? result = + await chooseListDialog(context, "进入阅读器自动全屏", ["是", "否"]); + if (result != null) { + var target = result == "是"; + await method.saveProperty(_propertyName, "$target"); + _guiAnimation = target; + } +} + +Widget guiAnimationSetting() { + return StatefulBuilder( + builder: (BuildContext context, void Function(void Function()) setState) { + return ListTile( + title: Text("软件界面动画"), + subtitle: Text(_guiAnimation ? "是" : "否"), + onTap: () async { + await _chooseGuiAnimation(context); + setState(() {}); + }, + ); + }, + ); +} diff --git a/lib/screens/AppScreen.dart b/lib/screens/AppScreen.dart index 43cce7d..3844e7f 100644 --- a/lib/screens/AppScreen.dart +++ b/lib/screens/AppScreen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:pikapika/basic/config/GuiAnimation.dart'; import 'package:pikapika/basic/config/Version.dart'; import 'package:pikapika/screens/components/Badge.dart'; @@ -36,19 +37,33 @@ class _AppScreenState extends State { ]; late int _selectedIndex = 0; + PageController _pageController = PageController(initialPage: 0); void _onItemTapped(int index) { + if (currentGuiAnimation()) { + _pageController.animateToPage( + index, + duration: Duration(milliseconds: 200), + curve: Curves.ease, + ); + } else { + _pageController.jumpToPage(index); + } + } + + void _onPageChanged(int index) { setState(() { - _selectedIndex = index; + this._selectedIndex = index; }); } @override Widget build(BuildContext context) { return Scaffold( - body: IndexedStack( - index: _selectedIndex, + body: PageView( + controller: _pageController, children: _widgetOptions, + onPageChanged: _onPageChanged, ), bottomNavigationBar: BottomNavigationBar( items: [ diff --git a/lib/screens/CategoriesScreen.dart b/lib/screens/CategoriesScreen.dart index ff91521..9ec3323 100644 --- a/lib/screens/CategoriesScreen.dart +++ b/lib/screens/CategoriesScreen.dart @@ -24,7 +24,12 @@ class CategoriesScreen extends StatefulWidget { State createState() => _CategoriesScreenState(); } -class _CategoriesScreenState extends State { +class _CategoriesScreenState extends State + with AutomaticKeepAliveClientMixin { + + @override + bool get wantKeepAlive => true; + late SearchBar _searchBar = SearchBar( hintText: '搜索', inBar: false, diff --git a/lib/screens/InitScreen.dart b/lib/screens/InitScreen.dart index 1338802..527e7a0 100644 --- a/lib/screens/InitScreen.dart +++ b/lib/screens/InitScreen.dart @@ -11,6 +11,7 @@ import 'package:pikapika/basic/config/DownloadAndExportPath.dart'; import 'package:pikapika/basic/config/DownloadThreadCount.dart'; import 'package:pikapika/basic/config/FullScreenAction.dart'; import 'package:pikapika/basic/config/FullScreenUI.dart'; +import 'package:pikapika/basic/config/GuiAnimation.dart'; import 'package:pikapika/basic/config/KeyboardController.dart'; import 'package:pikapika/basic/config/NoAnimation.dart'; import 'package:pikapika/basic/config/PagerAction.dart'; @@ -76,6 +77,7 @@ class _InitScreenState extends State { await initNoAnimation(); await initVersion(); autoCheckNewVersion(); + await initGuiAnimation(); // 登录, 如果token失效重新登录, 网络不好的时候可能需要1分钟 if (await method.preLogin()) { // 如果token或username+password有效则直接进入登录好的界面 diff --git a/lib/screens/SettingsScreen.dart b/lib/screens/SettingsScreen.dart index 138056a..267e5f9 100644 --- a/lib/screens/SettingsScreen.dart +++ b/lib/screens/SettingsScreen.dart @@ -13,6 +13,7 @@ import 'package:pikapika/basic/config/DownloadAndExportPath.dart'; import 'package:pikapika/basic/config/DownloadThreadCount.dart'; import 'package:pikapika/basic/config/FullScreenAction.dart'; import 'package:pikapika/basic/config/FullScreenUI.dart'; +import 'package:pikapika/basic/config/GuiAnimation.dart'; import 'package:pikapika/basic/config/KeyboardController.dart'; import 'package:pikapika/basic/config/NoAnimation.dart'; import 'package:pikapika/basic/config/PagerAction.dart'; @@ -43,11 +44,12 @@ class SettingsScreen extends StatelessWidget { convertToPNGSetting(), readerTypeSetting(), readerDirectionSetting(), + noAnimationSetting(), autoFullScreenSetting(), fullScreenActionSetting(), volumeControllerSetting(), keyboardControllerSetting(), - noAnimationSetting(), + guiAnimationSetting(), Divider(), shadowCategoriesModeSetting(), shadowCategoriesSetting(), diff --git a/lib/screens/SpaceScreen.dart b/lib/screens/SpaceScreen.dart index a154626..9dda868 100644 --- a/lib/screens/SpaceScreen.dart +++ b/lib/screens/SpaceScreen.dart @@ -21,7 +21,10 @@ class SpaceScreen extends StatefulWidget { State createState() => _SpaceScreenState(); } -class _SpaceScreenState extends State { +class _SpaceScreenState extends State + with AutomaticKeepAliveClientMixin { + @override + bool get wantKeepAlive => true; @override void initState() {