From 8ea16f457392f9727bee79a9a15386d6b9e6b6a0 Mon Sep 17 00:00:00 2001 From: niuhuan Date: Mon, 5 Sep 2022 11:05:46 +0800 Subject: [PATCH] version tips, icon loading --- lib/basic/config/IconLoading.dart | 43 +++++++++++ lib/basic/config/Version.dart | 87 ++++++++++++++++++++++ lib/screens/AccountScreen.dart | 10 ++- lib/screens/AppScreen.dart | 7 ++ lib/screens/InitScreen.dart | 2 + lib/screens/SettingsScreen.dart | 2 + lib/screens/components/ContentLoading.dart | 11 ++- 7 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 lib/basic/config/IconLoading.dart diff --git a/lib/basic/config/IconLoading.dart b/lib/basic/config/IconLoading.dart new file mode 100644 index 0000000..2fe8d75 --- /dev/null +++ b/lib/basic/config/IconLoading.dart @@ -0,0 +1,43 @@ +/// 自动全屏 + +import 'package:flutter/material.dart'; + +import '../Common.dart'; +import '../Method.dart'; + +const _propertyName = "iconLoading"; +late bool _iconLoading; + +Future initIconLoading() async { + _iconLoading = + (await method.loadProperty(_propertyName, "false")) == "true"; +} + +bool currentIconLoading() { + return _iconLoading; +} + +Future _chooseIconLoading(BuildContext context) async { + String? result = + await chooseListDialog(context, "使用静态图标代替加载动画", ["是", "否"]); + if (result != null) { + var target = result == "是"; + await method.saveProperty(_propertyName, "$target"); + _iconLoading = target; + } +} + +Widget iconLoadingSetting() { + return StatefulBuilder( + builder: (BuildContext context, void Function(void Function()) setState) { + return ListTile( + title: const Text("使用静态图标代替加载动画"), + subtitle: Text(_iconLoading ? "是" : "否"), + onTap: () async { + await _chooseIconLoading(context); + setState(() {}); + }, + ); + }, + ); +} diff --git a/lib/basic/config/Version.dart b/lib/basic/config/Version.dart index 4c53dd7..c2fb249 100644 --- a/lib/basic/config/Version.dart +++ b/lib/basic/config/Version.dart @@ -71,3 +71,90 @@ Future _versionCheck() async { } // else dirtyVersion versionEvent.broadcast(); } + +var _display = true; + +void versionPop(BuildContext context) { + if (latestVersion() != null && _display) { + _display = false; + TopConfirm.topConfirm( + context, + "发现新版本", + "发现新版本 ${latestVersion()} , 请到关于页面更新", + ); + } +} + +class TopConfirm { + static topConfirm(BuildContext context, String title, String message, + {Function()? afterIKnown}) { + late OverlayEntry overlayEntry; + overlayEntry = OverlayEntry(builder: (BuildContext context) { + return LayoutBuilder( + builder: ( + BuildContext context, + BoxConstraints constraints, + ) { + var mq = MediaQuery.of(context).size.width - 30; + return Material( + color: Colors.transparent, + child: Container( + width: constraints.maxWidth, + height: constraints.maxHeight, + decoration: BoxDecoration( + color: Colors.black.withOpacity(.35), + ), + child: Column( + children: [ + Expanded(child: Container()), + Container( + width: mq, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + ), + child: Column( + children: [ + Container(height: 30), + Text( + title, + style: const TextStyle( + color: Colors.black, + fontSize: 28, + ), + ), + Container(height: 15), + Text( + message, + style: const TextStyle( + color: Colors.black, + fontSize: 16, + ), + ), + Container(height: 25), + MaterialButton( + elevation: 0, + color: Colors.black.withOpacity(.1), + onPressed: () { + overlayEntry.remove(); + }, + child: const Text("朕知道了"), + ), + Container(height: 30), + ], + ), + ), + Expanded(child: Container()), + ], + ), + ), + ); + }, + ); + }); + OverlayState? overlay = Overlay.of(context); + if (overlay != null) { + overlay.insert(overlayEntry); + } + } +} diff --git a/lib/screens/AccountScreen.dart b/lib/screens/AccountScreen.dart index 443e8db..92621cf 100644 --- a/lib/screens/AccountScreen.dart +++ b/lib/screens/AccountScreen.dart @@ -12,6 +12,7 @@ import 'package:pikapika/screens/RegisterScreen.dart'; import 'package:pikapika/screens/SettingsScreen.dart'; import 'package:pikapika/screens/components/NetworkSetting.dart'; +import '../basic/config/Version.dart'; import 'AppScreen.dart'; import 'DownloadListScreen.dart'; import 'ThemeScreen.dart'; @@ -34,7 +35,8 @@ class _AccountScreenState extends State { @override void initState() { _linkSubscription = linkSubscript(context); - + versionEvent.subscribe(_versionSub); + versionPop(context); _loadProperties(); super.initState(); } @@ -42,9 +44,15 @@ class _AccountScreenState extends State { @override void dispose() { _linkSubscription.cancel(); + versionEvent.unsubscribe(_versionSub); super.dispose(); } + _versionSub(_) { + versionPop(context); + } + + Future _loadProperties() async { var username = await method.getUsername(); var password = await method.getPassword(); diff --git a/lib/screens/AppScreen.dart b/lib/screens/AppScreen.dart index 1f6c63b..eb8d4a5 100644 --- a/lib/screens/AppScreen.dart +++ b/lib/screens/AppScreen.dart @@ -29,6 +29,8 @@ class _AppScreenState extends State { void initState() { versionEvent.subscribe(_onVersion); _linkSubscription = linkSubscript(context); + versionEvent.subscribe(_versionSub); + versionPop(context); super.initState(); } @@ -36,9 +38,14 @@ class _AppScreenState extends State { void dispose() { versionEvent.unsubscribe(_onVersion); _linkSubscription.cancel(); + versionEvent.unsubscribe(_versionSub); super.dispose(); } + _versionSub(_) { + versionPop(context); + } + void _onVersion(dynamic a) { setState(() {}); } diff --git a/lib/screens/InitScreen.dart b/lib/screens/InitScreen.dart index 99e3399..e58a53c 100644 --- a/lib/screens/InitScreen.dart +++ b/lib/screens/InitScreen.dart @@ -40,6 +40,7 @@ import 'package:pikapika/screens/PkzArchiveScreen.dart'; import 'package:uni_links/uni_links.dart'; import 'package:uri_to_file/uri_to_file.dart'; import '../basic/config/ExportRename.dart'; +import '../basic/config/IconLoading.dart'; import '../basic/config/IsPro.dart'; import 'AccountScreen.dart'; import 'AppScreen.dart'; @@ -82,6 +83,7 @@ class _InitScreenState extends State { await initShadowCategoriesMode(); await initShadowCategories(); await initFullScreenUI(); + await initIconLoading(); switchFullScreenUI(); await initContentFailedReloadAction(); await initVolumeController(); diff --git a/lib/screens/SettingsScreen.dart b/lib/screens/SettingsScreen.dart index 16b6922..dad262d 100644 --- a/lib/screens/SettingsScreen.dart +++ b/lib/screens/SettingsScreen.dart @@ -13,6 +13,7 @@ import 'package:pikapika/basic/config/DownloadThreadCount.dart'; import 'package:pikapika/basic/config/ExportRename.dart'; import 'package:pikapika/basic/config/FullScreenAction.dart'; import 'package:pikapika/basic/config/FullScreenUI.dart'; +import 'package:pikapika/basic/config/IconLoading.dart'; import 'package:pikapika/basic/config/IsPro.dart'; import 'package:pikapika/basic/config/KeyboardController.dart'; import 'package:pikapika/basic/config/NoAnimation.dart'; @@ -88,6 +89,7 @@ class SettingsScreen extends StatelessWidget { volumeControllerSetting(), keyboardControllerSetting(), noAnimationSetting(), + iconLoadingSetting(), const Divider(), fullScreenUISetting(), willPopNoticeSetting(), diff --git a/lib/screens/components/ContentLoading.dart b/lib/screens/components/ContentLoading.dart index 2cac12d..e05680f 100644 --- a/lib/screens/components/ContentLoading.dart +++ b/lib/screens/components/ContentLoading.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:pikapika/basic/config/IconLoading.dart'; class ContentLoading extends StatelessWidget { final String label; @@ -20,10 +21,12 @@ class ContentLoading extends StatelessWidget { SizedBox( width: min / 2, height: min / 2, - child: CircularProgressIndicator( - color: theme.colorScheme.secondary, - backgroundColor: Colors.grey[100], - ), + child: currentIconLoading() + ? Icon(Icons.refresh, color: Colors.grey[100]) + : CircularProgressIndicator( + color: theme.colorScheme.secondary, + backgroundColor: Colors.grey[100], + ), ), Container(height: min / 10), Text(label, style: TextStyle(fontSize: min / 15)),