Mouse secondary button clieck pop

This commit is contained in:
niuhuan 2022-03-19 12:12:27 +08:00
parent 7e742a185a
commit 68ac6eff64
71 changed files with 455 additions and 324 deletions

View File

@ -172,7 +172,7 @@ Future<String?> displayTextInputDialog(BuildContext context,
? [] ? []
: [ : [
Container( Container(
padding: EdgeInsets.only(top: 20, bottom: 10), padding: const EdgeInsets.only(top: 20, bottom: 10),
child: Text( child: Text(
desc, desc,
style: TextStyle( style: TextStyle(

View File

@ -28,7 +28,7 @@ Future<void> chooseAddress(BuildContext context) async {
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return SimpleDialog( return SimpleDialog(
title: Text('选择分流'), title: const Text('选择分流'),
children: <Widget>[ children: <Widget>[
..._addresses.entries.map( ..._addresses.entries.map(
(e) => SimpleDialogOption( (e) => SimpleDialogOption(
@ -52,7 +52,7 @@ Widget switchAddressSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("分流"), title: const Text("分流"),
subtitle: Text(currentAddressName()), subtitle: Text(currentAddressName()),
onTap: () async { onTap: () async {
await chooseAddress(context); await chooseAddress(context);

View File

@ -41,7 +41,7 @@ Widget androidDisplayModeSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("屏幕刷新率(安卓)"), title: const Text("屏幕刷新率(安卓)"),
subtitle: Text(_androidDisplayMode), subtitle: Text(_androidDisplayMode),
onTap: () async { onTap: () async {
await _chooseAndroidDisplayMode(context); await _chooseAndroidDisplayMode(context);

View File

@ -37,7 +37,7 @@ Widget androidSecureFlagSetting() {
return StatefulBuilder(builder: return StatefulBuilder(builder:
(BuildContext context, void Function(void Function()) setState) { (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("禁止截图/禁止显示在任务视图"), title: const Text("禁止截图/禁止显示在任务视图"),
subtitle: Text(_androidSecureFlag ? "" : ""), subtitle: Text(_androidSecureFlag ? "" : ""),
onTap: () async { onTap: () async {
await _chooseAndroidSecureFlag(context); await _chooseAndroidSecureFlag(context);

View File

@ -33,7 +33,7 @@ Future<void> _chooseAutoCleanSec(BuildContext context) async {
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return SimpleDialog( return SimpleDialog(
title: Text('选择自动清理周期'), title: const Text('选择自动清理周期'),
children: <Widget>[ children: <Widget>[
..._autoCleanMap.entries.map( ..._autoCleanMap.entries.map(
(e) => SimpleDialogOption( (e) => SimpleDialogOption(
@ -57,7 +57,7 @@ Widget autoCleanSecSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("自动清理缓存"), title: const Text("自动清理缓存"),
subtitle: Text(_currentAutoCleanSec()), subtitle: Text(_currentAutoCleanSec()),
onTap: () async { onTap: () async {
await _chooseAutoCleanSec(context); await _chooseAutoCleanSec(context);

View File

@ -31,7 +31,7 @@ Widget autoFullScreenSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("进入阅读器自动全屏"), title: const Text("进入阅读器自动全屏"),
subtitle: Text(_autoFullScreen ? "" : ""), subtitle: Text(_autoFullScreen ? "" : ""),
onTap: () async { onTap: () async {
await _chooseAutoFullScreen(context); await _chooseAutoFullScreen(context);

View File

@ -66,7 +66,7 @@ Widget chooserRootSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("文件夹选择器默认路径"), title: const Text("文件夹选择器默认路径"),
subtitle: Text(_currentChooserRoot()), subtitle: Text(_currentChooserRoot()),
onTap: () async { onTap: () async {
await _inputChooserRoot(context); await _inputChooserRoot(context);

View File

@ -58,7 +58,7 @@ Widget contentFailedReloadActionSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("加载失败时"), title: const Text("加载失败时"),
subtitle: Text(_currentContentFailedReloadActionName()), subtitle: Text(_currentContentFailedReloadActionName()),
onTap: () async { onTap: () async {
await _chooseContentFailedReloadAction(context); await _chooseContentFailedReloadAction(context);

View File

@ -34,7 +34,7 @@ Widget convertToPNGSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("读取到超大图片时进行缩放(防止崩溃)"), title: const Text("读取到超大图片时进行缩放(防止崩溃)"),
subtitle: Text(_convertToPNG ? "" : ""), subtitle: Text(_convertToPNG ? "" : ""),
onTap: () async { onTap: () async {
await _chooseConvertToPNGSetting(context); await _chooseConvertToPNGSetting(context);

View File

@ -27,7 +27,7 @@ Widget downloadAndExportPathSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("下载的同时导出到文件系统"), title: const Text("下载的同时导出到文件系统"),
subtitle: Text(_downloadAndExportPath), subtitle: Text(_downloadAndExportPath),
onTap: () async { onTap: () async {
if (_downloadAndExportPath == "") { if (_downloadAndExportPath == "") {

View File

@ -15,7 +15,7 @@ Widget downloadThreadCountSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("下载线程数"), title: const Text("下载线程数"),
subtitle: Text("$_downloadThreadCount"), subtitle: Text("$_downloadThreadCount"),
onTap: () async { onTap: () async {
int? value = await chooseListDialog(context, "选择下载线程数", _values); int? value = await chooseListDialog(context, "选择下载线程数", _values);

View File

@ -29,7 +29,7 @@ Widget exportRenameSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("导出时进行重命名"), title: const Text("导出时进行重命名"),
subtitle: Text(_exportRename ? "" : ""), subtitle: Text(_exportRename ? "" : ""),
onTap: () async { onTap: () async {
await _chooseExportRename(context); await _chooseExportRename(context);

View File

@ -67,7 +67,7 @@ Widget fullScreenActionSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("操控方式"), title: const Text("操控方式"),
subtitle: Text(currentFullScreenActionName()), subtitle: Text(currentFullScreenActionName()),
onTap: () async { onTap: () async {
await chooseFullScreenAction(context); await chooseFullScreenAction(context);

View File

@ -27,7 +27,7 @@ Future<void> chooseImageAddress(BuildContext context) async {
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return SimpleDialog( return SimpleDialog(
title: Text('选择图片分流'), title: const Text('选择图片分流'),
children: <Widget>[ children: <Widget>[
..._imageAddresses.entries.map( ..._imageAddresses.entries.map(
(e) => SimpleDialogOption( (e) => SimpleDialogOption(
@ -51,7 +51,7 @@ Widget imageSwitchAddressSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("图片分流"), title: const Text("图片分流"),
subtitle: Text(currentImageAddressName()), subtitle: Text(currentImageAddressName()),
onTap: () async { onTap: () async {
await chooseImageAddress(context); await chooseImageAddress(context);

View File

@ -31,7 +31,7 @@ Widget keyboardControllerSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("阅读器键盘翻页(仅PC)"), title: const Text("阅读器键盘翻页(仅PC)"),
subtitle: Text(keyboardController ? "" : ""), subtitle: Text(keyboardController ? "" : ""),
onTap: () async { onTap: () async {
await _chooseKeyboardController(context); await _chooseKeyboardController(context);

View File

@ -29,7 +29,7 @@ Widget noAnimationSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("取消键盘或音量翻页动画"), title: const Text("取消键盘或音量翻页动画"),
subtitle: Text(_noAnimation ? "" : ""), subtitle: Text(_noAnimation ? "" : ""),
onTap: () async { onTap: () async {
await _chooseNoAnimation(context); await _chooseNoAnimation(context);

View File

@ -58,7 +58,7 @@ Widget pagerActionSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("列表页加载方式"), title: const Text("列表页加载方式"),
subtitle: Text(_currentPagerActionName()), subtitle: Text(_currentPagerActionName()),
onTap: () async { onTap: () async {
await _choosePagerAction(context); await _choosePagerAction(context);

View File

@ -34,7 +34,7 @@ Widget proxySetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("代理服务器"), title: const Text("代理服务器"),
subtitle: Text(currentProxyName()), subtitle: Text(currentProxyName()),
onTap: () async { onTap: () async {
await inputProxy(context); await inputProxy(context);

View File

@ -46,7 +46,7 @@ Future<void> chooseQuality(BuildContext context) async {
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return SimpleDialog( return SimpleDialog(
title: Text("请选择图片质量"), title: const Text("请选择图片质量"),
children: <Widget>[ children: <Widget>[
..._qualities.entries.map( ..._qualities.entries.map(
(e) => SimpleDialogOption( (e) => SimpleDialogOption(
@ -70,7 +70,7 @@ Widget qualitySetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("浏览时的图片质量"), title: const Text("浏览时的图片质量"),
subtitle: Text(currentQualityName()), subtitle: Text(currentQualityName()),
onTap: () async { onTap: () async {
await chooseQuality(context); await chooseQuality(context);

View File

@ -49,7 +49,7 @@ Future<void> choosePagerDirection(BuildContext buildContext) async {
context: buildContext, context: buildContext,
builder: (BuildContext context) { builder: (BuildContext context) {
return SimpleDialog( return SimpleDialog(
title: Text("选择翻页方向"), title: const Text("选择翻页方向"),
children: _types.entries children: _types.entries
.map((e) => SimpleDialogOption( .map((e) => SimpleDialogOption(
child: Text(e.key), child: Text(e.key),
@ -71,7 +71,7 @@ Widget readerDirectionSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("阅读器方向"), title: const Text("阅读器方向"),
subtitle: Text(_currentReaderDirectionName()), subtitle: Text(_currentReaderDirectionName()),
onTap: () async { onTap: () async {
await choosePagerDirection(context); await choosePagerDirection(context);

View File

@ -49,7 +49,7 @@ Widget readerSliderPositionSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("滚动条的位置"), title: const Text("滚动条的位置"),
subtitle: Text(currentReaderSliderPositionName()), subtitle: Text(currentReaderSliderPositionName()),
onTap: () async { onTap: () async {
await chooseReaderSliderPosition(context); await chooseReaderSliderPosition(context);

View File

@ -52,7 +52,7 @@ Future<void> choosePagerType(BuildContext buildContext) async {
context: buildContext, context: buildContext,
builder: (BuildContext context) { builder: (BuildContext context) {
return SimpleDialog( return SimpleDialog(
title: Text("选择阅读模式"), title: const Text("选择阅读模式"),
children: _types.entries children: _types.entries
.map((e) => SimpleDialogOption( .map((e) => SimpleDialogOption(
child: Text(e.key), child: Text(e.key),
@ -74,7 +74,7 @@ Widget readerTypeSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("阅读器模式"), title: const Text("阅读器模式"),
subtitle: Text(currentReaderTypeName()), subtitle: Text(currentReaderTypeName()),
onTap: () async { onTap: () async {
await choosePagerType(context); await choosePagerType(context);

View File

@ -38,10 +38,10 @@ Future<void> _chooseShadowCategories(BuildContext context) async {
} }
} }
return MultiSelectDialog<String>( return MultiSelectDialog<String>(
title: Text('封印'), title: const Text('封印'),
searchHint: '搜索', searchHint: '搜索',
cancelText: Text('取消'), cancelText: const Text('取消'),
confirmText: Text('确定'), confirmText: const Text('确定'),
items: storedCategories.map((e) => MultiSelectItem(e, e)).toList(), items: storedCategories.map((e) => MultiSelectItem(e, e)).toList(),
initialValue: initialValue, initialValue: initialValue,
onConfirm: (List<String>? value) async { onConfirm: (List<String>? value) async {
@ -69,7 +69,7 @@ Widget shadowCategoriesSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("封印"), title: const Text("封印"),
subtitle: Text(jsonEncode(shadowCategories)), subtitle: Text(jsonEncode(shadowCategories)),
onTap: () async { onTap: () async {
await _chooseShadowCategories(context); await _chooseShadowCategories(context);

View File

@ -42,7 +42,7 @@ Widget fontSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("字体"), title: const Text("字体"),
subtitle: Text("$_fontFamily"), subtitle: Text("$_fontFamily"),
onTap: () async { onTap: () async {
await inputFont(context); await inputFont(context);
@ -170,7 +170,7 @@ class _DarkTheme extends _ThemePackage {
colorScheme: ColorScheme.light( colorScheme: ColorScheme.light(
secondary: Colors.pink.shade200, secondary: Colors.pink.shade200,
), ),
appBarTheme: AppBarTheme( appBarTheme: const AppBarTheme(
systemOverlayStyle: SystemUiOverlayStyle.light, systemOverlayStyle: SystemUiOverlayStyle.light,
color: Color(0xFF1E1E1E), color: Color(0xFF1E1E1E),
iconTheme: IconThemeData( iconTheme: IconThemeData(
@ -207,13 +207,16 @@ class _DustyBlueTheme extends _ThemePackage {
ThemeData themeData(ThemeData rawData) => ThemeData themeData(ThemeData rawData) =>
rawData.copyWith( rawData.copyWith(
scaffoldBackgroundColor: Color.alphaBlend( scaffoldBackgroundColor: Color.alphaBlend(
Color(0x11999999), Color(0xff20253b)), const Color(0x11999999), const Color(0xff20253b),
cardColor: Color.alphaBlend(Color(0x11AAAAAA), Color(0xff20253b)), ),
cardColor: Color.alphaBlend(
const Color(0x11AAAAAA), const Color(0xff20253b),
),
brightness: Brightness.light, brightness: Brightness.light,
colorScheme: ColorScheme.light( colorScheme: ColorScheme.light(
secondary: Colors.blue.shade200, secondary: Colors.blue.shade200,
), ),
appBarTheme: AppBarTheme( appBarTheme: const AppBarTheme(
systemOverlayStyle: SystemUiOverlayStyle.light, systemOverlayStyle: SystemUiOverlayStyle.light,
color: Color(0xff20253b), color: Color(0xff20253b),
iconTheme: IconThemeData( iconTheme: IconThemeData(
@ -339,7 +342,7 @@ Future<dynamic> chooseTheme(BuildContext buildContext) async {
onChange(!_androidNightMode); onChange(!_androidNightMode);
}, },
child: Container( child: Container(
margin: EdgeInsets.only(top: 3, bottom: 3), margin: const EdgeInsets.only(top: 3, bottom: 3),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
top: BorderSide( top: BorderSide(
@ -362,7 +365,7 @@ Future<dynamic> chooseTheme(BuildContext buildContext) async {
value: _androidNightMode, value: _androidNightMode,
onChanged: onChange, onChanged: onChange,
), ),
Text("随手机进入黑暗模式"), const Text("随手机进入黑暗模式"),
], ],
), ),
), ),

View File

@ -43,7 +43,7 @@ Widget timeZoneSetting() {
c = "+" + c; c = "+" + c;
} }
return ListTile( return ListTile(
title: Text("时区"), title: const Text("时区"),
subtitle: Text(c), subtitle: Text(c),
onTap: () async { onTap: () async {
await _chooseTimeZone(context); await _chooseTimeZone(context);

View File

@ -140,7 +140,7 @@ Widget autoUpdateCheckSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("自动检查更新"), title: const Text("自动检查更新"),
subtitle: Text(_periodText()), subtitle: Text(_periodText()),
onTap: () async { onTap: () async {
await _choosePeriod(context); await _choosePeriod(context);

View File

@ -30,7 +30,7 @@ Widget volumeControllerSetting() {
return StatefulBuilder(builder: return StatefulBuilder(builder:
(BuildContext context, void Function(void Function()) setState) { (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("阅读器音量键翻页"), title: const Text("阅读器音量键翻页"),
subtitle: Text(volumeController ? "" : ""), subtitle: Text(volumeController ? "" : ""),
onTap: () async { onTap: () async {
await _chooseVolumeController(context); await _chooseVolumeController(context);

View File

@ -61,7 +61,7 @@ Widget shadowCategoriesModeSetting() {
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, void Function(void Function()) setState) { builder: (BuildContext context, void Function(void Function()) setState) {
return ListTile( return ListTile(
title: Text("封印模式"), title: const Text("封印模式"),
subtitle: Text(_currentShadowCategoriesMode()), subtitle: Text(_currentShadowCategoriesMode()),
onTap: () async { onTap: () async {
await _chooseShadowCategoriesMode(context); await _chooseShadowCategoriesMode(context);

View File

@ -7,7 +7,7 @@ import 'package:pikapika/screens/components/MouseAndTouchScrollBehavior.dart';
import 'basic/config/Themes.dart'; import 'basic/config/Themes.dart';
void main() { void main() {
runApp(PikapikaApp()); runApp(const PikapikaApp());
} }
class PikapikaApp extends StatefulWidget { class PikapikaApp extends StatefulWidget {
@ -41,7 +41,7 @@ class _PikapikaAppState extends State<PikapikaApp> {
theme: currentThemeData(), theme: currentThemeData(),
darkTheme: currentDarkTheme(), darkTheme: currentDarkTheme(),
navigatorObservers: [navigatorObserver, routeObserver], navigatorObservers: [navigatorObserver, routeObserver],
home: InitScreen(), home: const InitScreen(),
); );
} }
} }

View File

@ -5,6 +5,8 @@ import 'package:pikapika/basic/Cross.dart';
import 'package:pikapika/basic/config/Version.dart'; import 'package:pikapika/basic/config/Version.dart';
import 'package:pikapika/screens/components/Badge.dart'; import 'package:pikapika/screens/components/Badge.dart';
import 'components/RightClickPop.dart';
const _releasesUrl = "https://github.com/niuhuan/pikapika/releases"; const _releasesUrl = "https://github.com/niuhuan/pikapika/releases";
// //
@ -34,6 +36,10 @@ class _AboutScreenState extends State<AboutScreen> {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
var size = MediaQuery.of(context).size; var size = MediaQuery.of(context).size;
var min = size.width < size.height ? size.width : size.height; var min = size.width < size.height ? size.width : size.height;
var _currentVersion = currentVersion(); var _currentVersion = currentVersion();
@ -59,21 +65,21 @@ class _AboutScreenState extends State<AboutScreen> {
), ),
), ),
Container(height: 20), Container(height: 20),
Divider(), const Divider(),
Container( Container(
padding: EdgeInsets.only(left: 20, right: 20), padding: const EdgeInsets.only(left: 20, right: 20),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
'软件版本 : $_currentVersion', '软件版本 : $_currentVersion',
style: TextStyle( style: const TextStyle(
height: 1.3, height: 1.3,
), ),
), ),
Row( Row(
children: [ children: [
Text( const Text(
"检查更新 : ", "检查更新 : ",
style: TextStyle( style: TextStyle(
height: 1.3, height: 1.3,
@ -87,12 +93,12 @@ class _AboutScreenState extends State<AboutScreen> {
], ],
), ),
), ),
Divider(), const Divider(),
autoUpdateCheckSetting(), autoUpdateCheckSetting(),
Divider(), const Divider(),
Container( Container(
padding: EdgeInsets.all(20), padding: const EdgeInsets.all(20),
child: SelectableText( child: const SelectableText(
"提示 : \n" "提示 : \n"
"1. 详情页的作者/上传者/分类/标签都可以点击\n" "1. 详情页的作者/上传者/分类/标签都可以点击\n"
"2. 详情页的作者/上传者/标题长按可以复制\n" "2. 详情页的作者/上传者/标题长按可以复制\n"
@ -104,7 +110,7 @@ class _AboutScreenState extends State<AboutScreen> {
), ),
), ),
), ),
Divider(), const Divider(),
], ],
), ),
); );
@ -118,16 +124,16 @@ class _AboutScreenState extends State<AboutScreen> {
WidgetSpan( WidgetSpan(
child: Badged( child: Badged(
child: Container( child: Container(
padding: EdgeInsets.only(right: 12), padding: const EdgeInsets.only(right: 12),
child: Text( child: Text(
latestVersion, latestVersion,
style: TextStyle(height: 1.3), style: const TextStyle(height: 1.3),
), ),
), ),
badge: "1", badge: "1",
), ),
), ),
TextSpan(text: " "), const TextSpan(text: " "),
TextSpan( TextSpan(
text: "去下载", text: "去下载",
style: TextStyle( style: TextStyle(
@ -144,13 +150,13 @@ class _AboutScreenState extends State<AboutScreen> {
return Text.rich( return Text.rich(
TextSpan( TextSpan(
children: [ children: [
TextSpan(text: "未检测到新版本", style: TextStyle(height: 1.3)), const TextSpan(text: "未检测到新版本", style: TextStyle(height: 1.3)),
WidgetSpan( WidgetSpan(
alignment: PlaceholderAlignment.middle, alignment: PlaceholderAlignment.middle,
child: Container( child: Container(
padding: EdgeInsets.all(4), padding: const EdgeInsets.all(4),
margin: EdgeInsets.only(left: 3, right: 3), margin: const EdgeInsets.only(left: 3, right: 3),
decoration: BoxDecoration( decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(20)), borderRadius: BorderRadius.all(Radius.circular(20)),
), ),
), ),
@ -187,13 +193,13 @@ class _AboutScreenState extends State<AboutScreen> {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Divider(), const Divider(),
Text("更新内容:"), const Text("更新内容:"),
Container( Container(
padding: EdgeInsets.all(15), padding: const EdgeInsets.all(15),
child: Text( child: Text(
latestVersionInfo, latestVersionInfo,
style: TextStyle(), style: const TextStyle(),
), ),
), ),
], ],
@ -202,9 +208,9 @@ class _AboutScreenState extends State<AboutScreen> {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Divider(), const Divider(),
Container( Container(
padding: EdgeInsets.all(15), padding: const EdgeInsets.all(15),
child: Text.rich( child: Text.rich(
TextSpan( TextSpan(
text: "去RELEASE仓库", text: "去RELEASE仓库",

View File

@ -62,22 +62,22 @@ class _AccountScreenState extends State<AccountScreen> {
onPressed: () { onPressed: () {
chooseTheme(context); chooseTheme(context);
}, },
icon: Text('主题'), icon: const Text('主题'),
), ),
IconButton( IconButton(
onPressed: _toDownloadList, onPressed: _toDownloadList,
icon: Icon(Icons.download_rounded), icon: const Icon(Icons.download_rounded),
), ),
IconButton( IconButton(
onPressed: _logIn, onPressed: _logIn,
icon: Icon(Icons.save), icon: const Icon(Icons.save),
), ),
], ],
), ),
body: ListView( body: ListView(
children: [ children: [
ListTile( ListTile(
title: Text("账号"), title: const Text("账号"),
subtitle: Text(_username == "" ? "未设置" : _username), subtitle: Text(_username == "" ? "未设置" : _username),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -95,7 +95,7 @@ class _AccountScreenState extends State<AccountScreen> {
}, },
), ),
ListTile( ListTile(
title: Text("密码"), title: const Text("密码"),
subtitle: Text(_password == "" ? "未设置" : '\u2022' * 10), subtitle: Text(_password == "" ? "未设置" : '\u2022' * 10),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -113,12 +113,12 @@ class _AccountScreenState extends State<AccountScreen> {
} }
}, },
), ),
NetworkSetting(), const NetworkSetting(),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Container( child: Container(
padding: EdgeInsets.all(15), padding: const EdgeInsets.all(15),
child: Text.rich(TextSpan( child: Text.rich(TextSpan(
text: '没有账号,我要注册', text: '没有账号,我要注册',
style: TextStyle( style: TextStyle(
@ -180,7 +180,7 @@ class _AccountScreenState extends State<AccountScreen> {
_toDownloadList() { _toDownloadList() {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute(builder: (context) => DownloadListScreen()), MaterialPageRoute(builder: (context) => const DownloadListScreen()),
); );
} }
} }

View File

@ -52,13 +52,13 @@ class _AppScreenState extends State<AppScreen> {
), ),
bottomNavigationBar: BottomNavigationBar( bottomNavigationBar: BottomNavigationBar(
items: <BottomNavigationBarItem>[ items: <BottomNavigationBarItem>[
BottomNavigationBarItem( const BottomNavigationBarItem(
icon: Icon(Icons.public), icon: Icon(Icons.public),
label: '浏览', label: '浏览',
), ),
BottomNavigationBarItem( BottomNavigationBarItem(
icon: Badged( icon: Badged(
child: Icon(Icons.face), child: const Icon(Icons.face),
badge: latestVersion() == null ? null : "1", badge: latestVersion() == null ? null : "1",
), ),
label: '我的', label: '我的',

View File

@ -25,7 +25,7 @@ class CategoriesScreen extends StatefulWidget {
} }
class _CategoriesScreenState extends State<CategoriesScreen> { class _CategoriesScreenState extends State<CategoriesScreen> {
late SearchBar _searchBar = SearchBar( late final SearchBar _searchBar = SearchBar(
hintText: '搜索', hintText: '搜索',
inBar: false, inBar: false,
setState: setState, setState: setState,
@ -41,7 +41,7 @@ class _CategoriesScreenState extends State<CategoriesScreen> {
}, },
buildDefaultAppBar: (BuildContext context) { buildDefaultAppBar: (BuildContext context) {
return AppBar( return AppBar(
title: Text('分类'), title: const Text('分类'),
actions: [ actions: [
shadowCategoriesActionButton(context), shadowCategoriesActionButton(context),
_searchBar.getSearchAction(context), _searchBar.getSearchAction(context),
@ -113,7 +113,7 @@ class _CategoriesScreenState extends State<CategoriesScreen> {
); );
} }
if (snapshot.connectionState != ConnectionState.done) { if (snapshot.connectionState != ConnectionState.done) {
return ContentLoading(label: '加载中'); return const ContentLoading(label: '加载中');
} }
return ListView( return ListView(
children: [ children: [
@ -123,7 +123,7 @@ class _CategoriesScreenState extends State<CategoriesScreen> {
alignment: WrapAlignment.spaceAround, alignment: WrapAlignment.spaceAround,
children: _buildChannels(), children: _buildChannels(),
), ),
Divider(), const Divider(),
Wrap( Wrap(
runSpacing: 20, runSpacing: 20,
alignment: WrapAlignment.spaceAround, alignment: WrapAlignment.spaceAround,
@ -253,7 +253,7 @@ class _CategoriesScreenState extends State<CategoriesScreen> {
() { () {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute(builder: (context) => RankingsScreen()), MaterialPageRoute(builder: (context) => const RankingsScreen()),
); );
}, },
); );
@ -265,7 +265,7 @@ class _CategoriesScreenState extends State<CategoriesScreen> {
() { () {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute(builder: (context) => RandomComicsScreen()), MaterialPageRoute(builder: (context) => const RandomComicsScreen()),
); );
}, },
); );
@ -277,7 +277,7 @@ class _CategoriesScreenState extends State<CategoriesScreen> {
() { () {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute(builder: (context) => GamesScreen()), MaterialPageRoute(builder: (context) => const GamesScreen()),
); );
}, },
); );

View File

@ -17,6 +17,7 @@ import 'components/CommentList.dart';
import 'components/ContentError.dart'; import 'components/ContentError.dart';
import 'components/ContentLoading.dart'; import 'components/ContentLoading.dart';
import 'components/ContinueReadButton.dart'; import 'components/ContinueReadButton.dart';
import 'components/RightClickPop.dart';
// //
class ComicInfoScreen extends StatefulWidget { class ComicInfoScreen extends StatefulWidget {
@ -74,6 +75,10 @@ class _ComicInfoScreenState extends State<ComicInfoScreen> with RouteAware {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
return FutureBuilder( return FutureBuilder(
future: _comicFuture, future: _comicFuture,
builder: (BuildContext context, AsyncSnapshot<ComicInfo> snapshot) { builder: (BuildContext context, AsyncSnapshot<ComicInfo> snapshot) {
@ -94,7 +99,7 @@ class _ComicInfoScreenState extends State<ComicInfoScreen> with RouteAware {
if (snapshot.connectionState != ConnectionState.done) { if (snapshot.connectionState != ConnectionState.done) {
return Scaffold( return Scaffold(
appBar: AppBar(), appBar: AppBar(),
body: ContentLoading(label: '加载中'), body: const ContentLoading(label: '加载中'),
); );
} }
var _comicInfo = snapshot.data!; var _comicInfo = snapshot.data!;
@ -122,7 +127,7 @@ class _ComicInfoScreenState extends State<ComicInfoScreen> with RouteAware {
ComicTagsCard(_comicInfo.tags), ComicTagsCard(_comicInfo.tags),
ComicDescriptionCard(description: _comicInfo.description), ComicDescriptionCard(description: _comicInfo.description),
Container( Container(
padding: EdgeInsets.all(10), padding: const EdgeInsets.all(10),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
bottom: BorderSide( bottom: BorderSide(
@ -173,7 +178,7 @@ class _ComicInfoScreenState extends State<ComicInfoScreen> with RouteAware {
TextSpan( TextSpan(
text: text:
"( ${formatTimeToDate(_comicInfo.updatedAt)} )", "( ${formatTimeToDate(_comicInfo.updatedAt)} )",
style: TextStyle( style: const TextStyle(
fontSize: 13, fontSize: 13,
color: Colors.grey, color: Colors.grey,
), ),
@ -245,11 +250,11 @@ class _ComicInfoScreenState extends State<ComicInfoScreen> with RouteAware {
this._epListFuture = _loadEps(); this._epListFuture = _loadEps();
}); });
}, },
icon: Icon(Icons.sync_problem), icon: const Icon(Icons.sync_problem),
); );
} }
if (snapshot.connectionState != ConnectionState.done) { if (snapshot.connectionState != ConnectionState.done) {
return IconButton(onPressed: () {}, icon: Icon(Icons.sync)); return IconButton(onPressed: () {}, icon: const Icon(Icons.sync));
} }
var _epList = snapshot.data!; var _epList = snapshot.data!;
return IconButton( return IconButton(
@ -264,7 +269,7 @@ class _ComicInfoScreenState extends State<ComicInfoScreen> with RouteAware {
), ),
); );
}, },
icon: Icon(Icons.download_rounded), icon: const Icon(Icons.download_rounded),
); );
}, },
); );
@ -305,8 +310,10 @@ class _ComicInfoScreenState extends State<ComicInfoScreen> with RouteAware {
_push(_comicInfo, _epList, e.order, null); _push(_comicInfo, _epList, e.order, null);
}, },
color: Colors.white, color: Colors.white,
child: child: Text(
Text(e.title, style: TextStyle(color: Colors.black)), e.title,
style: const TextStyle(color: Colors.black),
),
); );
}), }),
], ],

View File

@ -12,6 +12,7 @@ import 'package:pikapika/screens/components/ContentError.dart';
import 'package:pikapika/screens/components/ContentLoading.dart'; import 'package:pikapika/screens/components/ContentLoading.dart';
import 'DownloadConfirmScreen.dart'; import 'DownloadConfirmScreen.dart';
import 'components/ImageReader.dart'; import 'components/ImageReader.dart';
import 'components/RightClickPop.dart';
// 线 // 线
class ComicReaderScreen extends StatefulWidget { class ComicReaderScreen extends StatefulWidget {
@ -143,6 +144,10 @@ class _ComicReaderScreenState extends State<ComicReaderScreen> {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
return readerKeyboardHolder(_build(context)); return readerKeyboardHolder(_build(context));
} }

View File

@ -9,6 +9,7 @@ import 'package:pikapika/basic/Method.dart';
import '../basic/Entities.dart'; import '../basic/Entities.dart';
import 'SearchScreen.dart'; import 'SearchScreen.dart';
import 'components/ComicPager.dart'; import 'components/ComicPager.dart';
import 'components/RightClickPop.dart';
// //
class ComicsScreen extends StatefulWidget { class ComicsScreen extends StatefulWidget {
@ -96,7 +97,7 @@ class _ComicsScreenState extends State<ComicsScreen> {
)); ));
} }
}, },
icon: Icon(Icons.category), icon: const Icon(Icons.category),
); );
Future<ComicsPage> _load(String _currentSort, int _currentPage) { Future<ComicsPage> _load(String _currentSort, int _currentPage) {
@ -112,6 +113,10 @@ class _ComicsScreenState extends State<ComicsScreen> {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
PreferredSizeWidget? appBar; PreferredSizeWidget? appBar;
if (widget.tag == null && if (widget.tag == null &&
widget.creatorId == null && widget.creatorId == null &&

View File

@ -7,6 +7,8 @@ import 'package:pikapika/screens/components/CommentItem.dart';
import 'package:pikapika/screens/components/CommentMainType.dart'; import 'package:pikapika/screens/components/CommentMainType.dart';
import 'package:pikapika/screens/components/ContentBuilder.dart'; import 'package:pikapika/screens/components/ContentBuilder.dart';
import 'components/RightClickPop.dart';
class _CommentChildPage extends e.Page { class _CommentChildPage extends e.Page {
late List<ChildOfComment> docs; late List<ChildOfComment> docs;
@ -77,9 +79,13 @@ class _CommentScreenState extends State<CommentScreen> {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text('评论'), title: const Text('评论'),
), ),
body: Column( body: Column(
children: [ children: [
@ -138,8 +144,8 @@ class _CommentScreenState extends State<CommentScreen> {
), ),
), ),
), ),
padding: EdgeInsets.all(30), padding: const EdgeInsets.all(30),
child: Center( child: const Center(
child: Text('我有话要讲'), child: Text('我有话要讲'),
), ),
), ),
@ -156,8 +162,8 @@ class _CommentScreenState extends State<CommentScreen> {
}); });
}, },
child: Container( child: Container(
padding: EdgeInsets.all(30), padding: const EdgeInsets.all(30),
child: Center( child: const Center(
child: Text('上一页'), child: Text('上一页'),
), ),
), ),
@ -176,8 +182,8 @@ class _CommentScreenState extends State<CommentScreen> {
}); });
}, },
child: Container( child: Container(
padding: EdgeInsets.all(30), padding: const EdgeInsets.all(30),
child: Center( child: const Center(
child: Text('下一页'), child: Text('下一页'),
), ),
), ),

View File

@ -7,6 +7,7 @@ import 'package:pikapika/screens/components/ContentLoading.dart';
import 'package:pikapika/basic/Method.dart'; import 'package:pikapika/basic/Method.dart';
import 'components/ComicInfoCard.dart'; import 'components/ComicInfoCard.dart';
import 'components/RightClickPop.dart';
// //
class DownloadConfirmScreen extends StatefulWidget { class DownloadConfirmScreen extends StatefulWidget {
@ -100,6 +101,10 @@ class _DownloadConfirmScreenState extends State<DownloadConfirmScreen> {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text("下载 - ${widget.comicInfo.title}"), title: Text("下载 - ${widget.comicInfo.title}"),
@ -110,10 +115,10 @@ class _DownloadConfirmScreenState extends State<DownloadConfirmScreen> {
if (snapshot.hasError) { if (snapshot.hasError) {
print(snapshot.error); print(snapshot.error);
print(snapshot.stackTrace); print(snapshot.stackTrace);
return Text('error'); return const Text('error');
} }
if (snapshot.connectionState != ConnectionState.done) { if (snapshot.connectionState != ConnectionState.done) {
return ContentLoading(label: '加载中'); return const ContentLoading(label: '加载中');
} }
return ListView( return ListView(
children: [ children: [
@ -126,7 +131,7 @@ class _DownloadConfirmScreenState extends State<DownloadConfirmScreen> {
children: [ children: [
...widget.epList.map((e) { ...widget.epList.map((e) {
return Container( return Container(
padding: EdgeInsets.all(5), padding: const EdgeInsets.all(5),
child: MaterialButton( child: MaterialButton(
onPressed: () { onPressed: () {
_clickOfEp(e); _clickOfEp(e);
@ -141,7 +146,7 @@ class _DownloadConfirmScreenState extends State<DownloadConfirmScreen> {
width: 10, width: 10,
), ),
Text(e.title, Text(e.title,
style: TextStyle(color: Colors.black)), style: const TextStyle(color: Colors.black)),
], ],
), ),
), ),
@ -159,7 +164,7 @@ class _DownloadConfirmScreenState extends State<DownloadConfirmScreen> {
Widget _buildButtons() { Widget _buildButtons() {
var theme = Theme.of(context); var theme = Theme.of(context);
return Container( return Container(
padding: EdgeInsets.all(5), padding: const EdgeInsets.all(5),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
bottom: BorderSide( bottom: BorderSide(
@ -176,13 +181,13 @@ class _DownloadConfirmScreenState extends State<DownloadConfirmScreen> {
color: theme.colorScheme.secondary, color: theme.colorScheme.secondary,
textColor: Colors.white, textColor: Colors.white,
onPressed: _selectAll, onPressed: _selectAll,
child: Text('全选'), child: const Text('全选'),
), ),
MaterialButton( MaterialButton(
color: theme.colorScheme.secondary, color: theme.colorScheme.secondary,
textColor: Colors.white, textColor: Colors.white,
onPressed: _download, onPressed: _download,
child: Text('确定下载'), child: const Text('确定下载'),
), ),
], ],
), ),
@ -201,12 +206,12 @@ class _DownloadConfirmScreenState extends State<DownloadConfirmScreen> {
Icon _iconOfEp(Ep e) { Icon _iconOfEp(Ep e) {
if (_taskedEps.contains(e.order)) { if (_taskedEps.contains(e.order)) {
return Icon(Icons.download_rounded, color: Colors.black); return const Icon(Icons.download_rounded, color: Colors.black);
} }
if (_selectedEps.contains(e.order)) { if (_selectedEps.contains(e.order)) {
return Icon(Icons.check_box, color: Colors.black); return const Icon(Icons.check_box, color: Colors.black);
} }
return Icon(Icons.check_box_outline_blank, color: Colors.black); return const Icon(Icons.check_box_outline_blank, color: Colors.black);
} }
void _clickOfEp(Ep e) { void _clickOfEp(Ep e) {

View File

@ -85,18 +85,18 @@ class _DownloadExportToFileScreenState
}); });
} }
if (snapshot.connectionState != ConnectionState.done) { if (snapshot.connectionState != ConnectionState.done) {
return ContentLoading(label: '加载中'); return const ContentLoading(label: '加载中');
} }
return ListView( return ListView(
children: [ children: [
DownloadInfoCard(task: _task), DownloadInfoCard(task: _task),
Container( Container(
padding: EdgeInsets.all(8), padding: const EdgeInsets.all(8),
child: exportResult != "" ? Text(exportResult) : Container(), child: exportResult != "" ? Text(exportResult) : Container(),
), ),
Container( Container(
padding: EdgeInsets.all(8), padding: const EdgeInsets.all(8),
child: Text('TIPS : 选择一个目录'), child: const Text('TIPS : 选择一个目录'),
), ),
..._buildExportToFileButtons(), ..._buildExportToFileButtons(),
MaterialButton( MaterialButton(
@ -280,7 +280,7 @@ class _DownloadExportToFileScreenState
builder: (BuildContext context, BoxConstraints constraints) { builder: (BuildContext context, BoxConstraints constraints) {
return Container( return Container(
width: constraints.maxWidth, width: constraints.maxWidth,
padding: EdgeInsets.only(top: 15, bottom: 15), padding: const EdgeInsets.only(top: 15, bottom: 15),
color: (Theme.of(context).textTheme.bodyText1?.color ?? Colors.black) color: (Theme.of(context).textTheme.bodyText1?.color ?? Colors.black)
.withOpacity(.05), .withOpacity(.05),
child: Text( child: Text(

View File

@ -74,16 +74,16 @@ class _DownloadExportToSocketScreenState
}); });
} }
if (snapshot.connectionState != ConnectionState.done) { if (snapshot.connectionState != ConnectionState.done) {
return ContentLoading(label: '加载中'); return const ContentLoading(label: '加载中');
} }
return ListView( return ListView(
children: [ children: [
DownloadInfoCard(task: widget.task), DownloadInfoCard(task: widget.task),
Container( Container(
padding: EdgeInsets.all(8), padding: const EdgeInsets.all(8),
child: Column( child: Column(
children: [ children: [
Text( const Text(
'TIPS : 传输成功之前请不要退出页面, 一次只能导出到一个设备, 两台设备需要在同一网段或无限局域网中, 请另外一台设备输入 IP:端口 , 有一个IP时请选择无限局域网的IP, 通常是192.168开头'), 'TIPS : 传输成功之前请不要退出页面, 一次只能导出到一个设备, 两台设备需要在同一网段或无限局域网中, 请另外一台设备输入 IP:端口 , 有一个IP时请选择无限局域网的IP, 通常是192.168开头'),
FutureBuilder( FutureBuilder(
future: _ipFuture, future: _ipFuture,

View File

@ -62,12 +62,12 @@ class _DownloadImportScreenState extends State<DownloadImportScreen> {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text('导入'), title: const Text('导入'),
), ),
body: ListView( body: ListView(
children: [ children: [
Container( Container(
padding: EdgeInsets.all(10), padding: const EdgeInsets.all(10),
child: Text(_importMessage), child: Text(_importMessage),
), ),
...actions, ...actions,
@ -116,7 +116,7 @@ class _DownloadImportScreenState extends State<DownloadImportScreen> {
} }
} }
}, },
child: Text('选择zip文件进行导入'), child: const Text('选择zip文件进行导入'),
); );
} }
@ -146,7 +146,7 @@ class _DownloadImportScreenState extends State<DownloadImportScreen> {
} }
} }
}, },
child: Text('从其他设备导入'), child: const Text('从其他设备导入'),
); );
} }
} }

View File

@ -82,7 +82,7 @@ class _DownloadInfoScreenState extends State<DownloadInfoScreen>
), ),
); );
}, },
icon: Icon(Icons.add_to_home_screen), icon: const Icon(Icons.add_to_home_screen),
), ),
IconButton( IconButton(
onPressed: () { onPressed: () {
@ -95,7 +95,7 @@ class _DownloadInfoScreenState extends State<DownloadInfoScreen>
), ),
); );
}, },
icon: Icon(Icons.settings_ethernet_outlined), icon: const Icon(Icons.settings_ethernet_outlined),
), ),
], ],
), ),
@ -113,7 +113,7 @@ class _DownloadInfoScreenState extends State<DownloadInfoScreen>
}); });
} }
if (snapshot.connectionState != ConnectionState.done) { if (snapshot.connectionState != ConnectionState.done) {
return ContentLoading(label: '加载中'); return const ContentLoading(label: '加载中');
} }
List<dynamic> tagsDynamic = json.decode(_task.tags); List<dynamic> tagsDynamic = json.decode(_task.tags);
List<String> tags = tagsDynamic.map((e) => "$e").toList(); List<String> tags = tagsDynamic.map((e) => "$e").toList();

View File

@ -10,6 +10,7 @@ import 'DownloadImportScreen.dart';
import 'DownloadInfoScreen.dart'; import 'DownloadInfoScreen.dart';
import 'components/ContentLoading.dart'; import 'components/ContentLoading.dart';
import 'components/DownloadInfoCard.dart'; import 'components/DownloadInfoCard.dart';
import 'components/RightClickPop.dart';
// //
class DownloadListScreen extends StatefulWidget { class DownloadListScreen extends StatefulWidget {
@ -54,9 +55,9 @@ class _DownloadListScreenState extends State<DownloadListScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( final screen = Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text('下载列表'), title: const Text('下载列表'),
actions: [ actions: [
importButton(), importButton(),
pauseButton(), pauseButton(),
@ -68,13 +69,13 @@ class _DownloadListScreenState extends State<DownloadListScreen> {
builder: (BuildContext context, builder: (BuildContext context,
AsyncSnapshot<List<DownloadComic>> snapshot) { AsyncSnapshot<List<DownloadComic>> snapshot) {
if (snapshot.connectionState != ConnectionState.done) { if (snapshot.connectionState != ConnectionState.done) {
return ContentLoading(label: '加载中'); return const ContentLoading(label: '加载中');
} }
if (snapshot.hasError) { if (snapshot.hasError) {
print("${snapshot.error}"); print("${snapshot.error}");
print("${snapshot.stackTrace}"); print("${snapshot.stackTrace}");
return Center(child: Text('加载失败')); return const Center(child: Text('加载失败'));
} }
var data = snapshot.data!; var data = snapshot.data!;
@ -106,6 +107,7 @@ class _DownloadListScreenState extends State<DownloadListScreen> {
}, },
), ),
); );
return RightClickPop(screen);
} }
Widget downloadWidget(DownloadComic e) { Widget downloadWidget(DownloadComic e) {
@ -155,12 +157,12 @@ class _DownloadListScreenState extends State<DownloadListScreen> {
child: Column( child: Column(
children: [ children: [
Expanded(child: Container()), Expanded(child: Container()),
Icon( const Icon(
Icons.label_important, Icons.label_important,
size: 18, size: 18,
color: Colors.white, color: Colors.white,
), ),
Text( const Text(
'导入', '导入',
style: TextStyle(fontSize: 14, color: Colors.white), style: TextStyle(fontSize: 14, color: Colors.white),
), ),
@ -197,7 +199,7 @@ class _DownloadListScreenState extends State<DownloadListScreen> {
_downloadRunning = to; _downloadRunning = to;
}); });
}, },
child: Text('确认'), child: const Text('确认'),
), ),
], ],
); );

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:pikapika/basic/Method.dart'; import 'package:pikapika/basic/Method.dart';
import '../basic/Entities.dart'; import '../basic/Entities.dart';
import 'components/ComicPager.dart'; import 'components/ComicPager.dart';
import 'components/RightClickPop.dart';
// //
class FavouritePaperScreen extends StatefulWidget { class FavouritePaperScreen extends StatefulWidget {
@ -18,9 +19,13 @@ class _FavouritePaperScreen extends State<FavouritePaperScreen> {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text('收藏'), title: const Text('收藏'),
), ),
body: ComicPager( body: ComicPager(
fetchPage: _fetch, fetchPage: _fetch,

View File

@ -4,6 +4,8 @@ import 'package:pikapika/basic/Common.dart';
import 'package:pikapika/basic/Cross.dart'; import 'package:pikapika/basic/Cross.dart';
import 'package:pikapika/screens/components/Images.dart'; import 'package:pikapika/screens/components/Images.dart';
import 'components/RightClickPop.dart';
// //
class FilePhotoViewScreen extends StatelessWidget { class FilePhotoViewScreen extends StatelessWidget {
final String filePath; final String filePath;
@ -11,7 +13,11 @@ class FilePhotoViewScreen extends StatelessWidget {
const FilePhotoViewScreen(this.filePath, {Key? key}) : super(key: key); const FilePhotoViewScreen(this.filePath, {Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) => Scaffold( Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) => Scaffold(
body: Stack( body: Stack(
children: [ children: [
GestureDetector( GestureDetector(
@ -31,8 +37,8 @@ class FilePhotoViewScreen extends StatelessWidget {
InkWell( InkWell(
onTap: () => Navigator.of(context).pop(), onTap: () => Navigator.of(context).pop(),
child: Container( child: Container(
margin: EdgeInsets.only(top: 30), margin: const EdgeInsets.only(top: 30),
padding: EdgeInsets.only(left: 4, right: 4), padding: const EdgeInsets.only(left: 4, right: 4),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.black.withOpacity(.75), color: Colors.black.withOpacity(.75),
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(

View File

@ -5,6 +5,7 @@ import 'package:pikapika/basic/Method.dart';
import 'package:pikapika/screens/components/ItemBuilder.dart'; import 'package:pikapika/screens/components/ItemBuilder.dart';
import 'components/GameTitleCard.dart'; import 'components/GameTitleCard.dart';
import 'components/RightClickPop.dart';
// //
class GameDownloadScreen extends StatefulWidget { class GameDownloadScreen extends StatefulWidget {
@ -22,6 +23,10 @@ class _GameDownloadScreenState extends State<GameDownloadScreen> {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text("下载 - ${widget.info.title}"), title: Text("下载 - ${widget.info.title}"),
@ -64,8 +69,8 @@ class _GameDownloadScreenState extends State<GameDownloadScreen> {
children: [ children: [
Expanded( Expanded(
child: Container( child: Container(
margin: EdgeInsets.all(10), margin: const EdgeInsets.all(10),
padding: EdgeInsets.all(10), padding: const EdgeInsets.all(10),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border.all( border: Border.all(
color: Colors.grey.shade500, color: Colors.grey.shade500,

View File

@ -9,6 +9,7 @@ import 'package:pikapika/screens/components/Images.dart';
import 'GameDownloadScreen.dart'; import 'GameDownloadScreen.dart';
import 'components/CommentList.dart'; import 'components/CommentList.dart';
import 'components/GameTitleCard.dart'; import 'components/GameTitleCard.dart';
import 'components/RightClickPop.dart';
// //
class GameInfoScreen extends StatefulWidget { class GameInfoScreen extends StatefulWidget {
@ -25,13 +26,17 @@ class _GameInfoScreenState extends State<GameInfoScreen> {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
return FutureBuilder( return FutureBuilder(
future: _future, future: _future,
builder: (BuildContext context, AsyncSnapshot<GameInfo> snapshot) { builder: (BuildContext context, AsyncSnapshot<GameInfo> snapshot) {
if (snapshot.hasError) { if (snapshot.hasError) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text('加载出错'), title: const Text('加载出错'),
), ),
body: ContentError( body: ContentError(
error: snapshot.error, error: snapshot.error,
@ -46,16 +51,16 @@ class _GameInfoScreenState extends State<GameInfoScreen> {
if (snapshot.connectionState != ConnectionState.done) { if (snapshot.connectionState != ConnectionState.done) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text('加载中'), title: const Text('加载中'),
), ),
body: ContentLoading(label: '加载中'), body: const ContentLoading(label: '加载中'),
); );
} }
BorderRadius iconRadius = BorderRadius.all(Radius.circular(6)); BorderRadius iconRadius = const BorderRadius.all(Radius.circular(6));
double screenShootMargin = 10; double screenShootMargin = 10;
double screenShootHeight = 200; double screenShootHeight = 200;
TextStyle descriptionStyle = TextStyle(); TextStyle descriptionStyle = const TextStyle();
return LayoutBuilder( return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) { builder: (BuildContext context, BoxConstraints constraints) {
@ -70,14 +75,14 @@ class _GameInfoScreenState extends State<GameInfoScreen> {
children: [ children: [
GameTitleCard(info), GameTitleCard(info),
Container( Container(
padding: EdgeInsets.only( padding: const EdgeInsets.only(
left: 20, left: 20,
right: 20, right: 20,
top: 5, top: 5,
bottom: 10, bottom: 10,
), ),
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(5)), borderRadius: const BorderRadius.all(Radius.circular(5)),
child: MaterialButton( child: MaterialButton(
color: Theme.of(context).colorScheme.secondary, color: Theme.of(context).colorScheme.secondary,
textColor: Colors.white, textColor: Colors.white,
@ -90,8 +95,8 @@ class _GameInfoScreenState extends State<GameInfoScreen> {
); );
}, },
child: Container( child: Container(
padding: EdgeInsets.all(5), padding: const EdgeInsets.all(5),
child: Text('下载'), child: const Text('下载'),
), ),
), ),
), ),
@ -137,7 +142,7 @@ class _GameInfoScreenState extends State<GameInfoScreen> {
.withOpacity(.025), .withOpacity(.025),
child: TabBar( child: TabBar(
tabs: <Widget>[ tabs: <Widget>[
Tab(text: '详情 '), const Tab(text: '详情 '),
Tab(text: '评论 (${info.commentsCount})'), Tab(text: '评论 (${info.commentsCount})'),
], ],
indicatorColor: indicatorColor:
@ -155,7 +160,7 @@ class _GameInfoScreenState extends State<GameInfoScreen> {
), ),
_tabIndex == 0 _tabIndex == 0
? Container( ? Container(
padding: EdgeInsets.all(20), padding: const EdgeInsets.all(20),
child: child:
Text(info.description, style: descriptionStyle), Text(info.description, style: descriptionStyle),
) )

View File

@ -6,6 +6,7 @@ import 'package:pikapika/screens/components/ContentBuilder.dart';
import 'GameInfoScreen.dart'; import 'GameInfoScreen.dart';
import 'components/Images.dart'; import 'components/Images.dart';
import 'components/RightClickPop.dart';
// //
class GamesScreen extends StatefulWidget { class GamesScreen extends StatefulWidget {
@ -32,9 +33,13 @@ class _GamesScreenState extends State<GamesScreen> {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text('游戏'), title: const Text('游戏'),
), ),
body: ContentBuilder( body: ContentBuilder(
future: _future, future: _future,
@ -64,9 +69,9 @@ class _GamesScreenState extends State<GamesScreen> {
} }
return Scaffold( return Scaffold(
appBar: PreferredSize( appBar: PreferredSize(
preferredSize: Size.fromHeight(40), preferredSize: const Size.fromHeight(40),
child: Container( child: Container(
padding: EdgeInsets.only(left: 10, right: 10), padding: const EdgeInsets.only(left: 10, right: 10),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
bottom: BorderSide( bottom: BorderSide(
@ -168,7 +173,7 @@ class _GamesScreenState extends State<GamesScreen> {
_onPageChange(page.page + 1); _onPageChange(page.page + 1);
}, },
child: Container( child: Container(
padding: EdgeInsets.only(top: 30, bottom: 30), padding: const EdgeInsets.only(top: 30, bottom: 30),
child: Text('下一页'), child: Text('下一页'),
), ),
), ),

View File

@ -95,7 +95,7 @@ class _InitScreenState extends State<InitScreen> {
// //
Navigator.pushReplacement( Navigator.pushReplacement(
context, context,
MaterialPageRoute(builder: (context) => AccountScreen()), MaterialPageRoute(builder: (context) => const AccountScreen()),
); );
} }
} }
@ -103,9 +103,9 @@ class _InitScreenState extends State<InitScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
backgroundColor: Color(0xfffffced), backgroundColor: const Color(0xfffffced),
body: ConstrainedBox( body: ConstrainedBox(
constraints: BoxConstraints.expand(), constraints: const BoxConstraints.expand(),
child: Image.asset( child: Image.asset(
"lib/assets/init.jpg", "lib/assets/init.jpg",
fit: BoxFit.contain, fit: BoxFit.contain,

View File

@ -6,6 +6,8 @@ import 'package:pikapika/basic/Method.dart';
import 'package:pikapika/screens/components/ContentBuilder.dart'; import 'package:pikapika/screens/components/ContentBuilder.dart';
import 'package:pikapika/screens/components/ContentLoading.dart'; import 'package:pikapika/screens/components/ContentLoading.dart';
import 'components/RightClickPop.dart';
// //
class MigrateScreen extends StatefulWidget { class MigrateScreen extends StatefulWidget {
const MigrateScreen({Key? key}) : super(key: key); const MigrateScreen({Key? key}) : super(key: key);
@ -32,9 +34,13 @@ class _MigrateScreenState extends State<MigrateScreen> {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text('数据迁移'), title: const Text('数据迁移'),
), ),
body: ContentBuilder( body: ContentBuilder(
future: _future, future: _future,
@ -46,8 +52,8 @@ class _MigrateScreenState extends State<MigrateScreen> {
return ListView( return ListView(
children: [ children: [
Container( Container(
padding: EdgeInsets.all(10), padding: const EdgeInsets.all(10),
child: Text( child: const Text(
"1. 为了手机数据存储空间不足, 且具有内存卡的安卓手机设计, 可将数据迁移到内存卡上。\n\n" "1. 为了手机数据存储空间不足, 且具有内存卡的安卓手机设计, 可将数据迁移到内存卡上。\n\n"
"2. 您在迁移之前, 请确保您的下载处于暂停状态, 或下载均已完成, 以保证您的数据完整性。\n\n" "2. 您在迁移之前, 请确保您的下载处于暂停状态, 或下载均已完成, 以保证您的数据完整性。\n\n"
"3. 如果迁移中断, 迁移失败, 或其他原因导致程序无法启动, 图片失效等问题, 您可在程序管理中清除本应用程序的数据, 以回复正常使用。\n\n" "3. 如果迁移中断, 迁移失败, 或其他原因导致程序无法启动, 图片失效等问题, 您可在程序管理中清除本应用程序的数据, 以回复正常使用。\n\n"
@ -58,18 +64,18 @@ class _MigrateScreenState extends State<MigrateScreen> {
), ),
), ),
Container( Container(
padding: EdgeInsets.all(10), padding: const EdgeInsets.all(10),
child: Text("当前文件储存路径 : $_current"), child: Text("当前文件储存路径 : $_current"),
), ),
...paths.map((e) => Container( ...paths.map((e) => Container(
padding: EdgeInsets.all(10), padding: const EdgeInsets.all(10),
child: MaterialButton( child: MaterialButton(
color: Theme.of(context).accentColor, color: Theme.of(context).accentColor,
textColor: Theme.of(context) textColor: Theme.of(context)
.accentTextTheme .accentTextTheme
.subtitle1 .subtitle1
?.color, ?.color,
padding: EdgeInsets.all(10), padding: const EdgeInsets.all(10),
onPressed: () async { onPressed: () async {
if (!await confirmDialog(context, "文件迁移", if (!await confirmDialog(context, "文件迁移",
"您将要迁移到$e, 迁移过程中一定《 不 要 关 闭 程 序 》")) { "您将要迁移到$e, 迁移过程中一定《 不 要 关 闭 程 序 》")) {
@ -96,9 +102,9 @@ class _MigrateScreenState extends State<MigrateScreen> {
], ],
); );
case 1: case 1:
return ContentLoading(label: "迁移中"); return const ContentLoading(label: "迁移中");
case 2: case 2:
return Center(child: Text("迁移成功 您需要关闭应用程序重新启动")); return const Center(child: Text("迁移成功 您需要关闭应用程序重新启动"));
case 3: case 3:
return Center(child: Text("迁移失败\n$_message")); return Center(child: Text("迁移失败\n$_message"));
default: default:

View File

@ -3,8 +3,11 @@ import 'package:pikapika/basic/Method.dart';
import 'package:pikapika/screens/components/ContentLoading.dart'; import 'package:pikapika/screens/components/ContentLoading.dart';
import '../basic/Common.dart'; import '../basic/Common.dart';
import 'components/RightClickPop.dart';
class ModifyPasswordScreen extends StatefulWidget { class ModifyPasswordScreen extends StatefulWidget {
const ModifyPasswordScreen({Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() => _ModifyPasswordScreenState(); State<StatefulWidget> createState() => _ModifyPasswordScreenState();
} }
@ -17,14 +20,18 @@ class _ModifyPasswordScreenState extends State<ModifyPasswordScreen> {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text("修改密码"), title: const Text("修改密码"),
), ),
body: _loading body: _loading
? Stack( ? Stack(
children: [ children: [
ContentLoading(label: "请稍后"), const ContentLoading(label: "请稍后"),
WillPopScope( WillPopScope(
child: Container(), child: Container(),
onWillPop: () async { onWillPop: () async {
@ -42,7 +49,7 @@ class _ModifyPasswordScreenState extends State<ModifyPasswordScreen> {
children: [ children: [
const Divider(), const Divider(),
ListTile( ListTile(
title: Text("旧密码"), title: const Text("旧密码"),
subtitle: Text(_oldPassword == "" ? "未填写" : '\u2022' * 10), subtitle: Text(_oldPassword == "" ? "未填写" : '\u2022' * 10),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -61,7 +68,7 @@ class _ModifyPasswordScreenState extends State<ModifyPasswordScreen> {
), ),
const Divider(), const Divider(),
ListTile( ListTile(
title: Text("新密码"), title: const Text("新密码"),
subtitle: Text(_newPassword == "" ? "未填写" : '\u2022' * 10), subtitle: Text(_newPassword == "" ? "未填写" : '\u2022' * 10),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -80,7 +87,7 @@ class _ModifyPasswordScreenState extends State<ModifyPasswordScreen> {
), ),
const Divider(), const Divider(),
ListTile( ListTile(
title: Text("重复输入新密码"), title: const Text("重复输入新密码"),
subtitle: Text(_newPasswordRep == "" ? "未填写" : '\u2022' * 10), subtitle: Text(_newPasswordRep == "" ? "未填写" : '\u2022' * 10),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -99,7 +106,7 @@ class _ModifyPasswordScreenState extends State<ModifyPasswordScreen> {
), ),
const Divider(), const Divider(),
Container( Container(
margin: EdgeInsets.all(10), margin: const EdgeInsets.all(10),
child: MaterialButton( child: MaterialButton(
textColor: Colors.white, textColor: Colors.white,
color: Theme.of(context).appBarTheme.backgroundColor, color: Theme.of(context).appBarTheme.backgroundColor,
@ -122,7 +129,7 @@ class _ModifyPasswordScreenState extends State<ModifyPasswordScreen> {
}); });
} }
}, },
child: Text("确认"), child: const Text("确认"),
), ),
), ),
], ],

View File

@ -1,12 +1,20 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pikapika/screens/components/NetworkSetting.dart'; import 'package:pikapika/screens/components/NetworkSetting.dart';
import 'components/RightClickPop.dart';
class NetworkSettingsScreen extends StatelessWidget { class NetworkSettingsScreen extends StatelessWidget {
const NetworkSettingsScreen({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) => Scaffold( Widget build(BuildContext context){
appBar: AppBar(title: Text('网络设置')), return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) => Scaffold(
appBar: AppBar(title: const Text('网络设置')),
body: ListView( body: ListView(
children: [ children: const [
NetworkSetting(), NetworkSetting(),
], ],
), ),

View File

@ -5,9 +5,12 @@ import 'package:pikapika/basic/config/ListLayout.dart';
import 'package:pikapika/basic/config/ShadowCategories.dart'; import 'package:pikapika/basic/config/ShadowCategories.dart';
import 'components/ComicListBuilder.dart'; import 'components/ComicListBuilder.dart';
import 'components/RightClickPop.dart';
// //
class RandomComicsScreen extends StatefulWidget { class RandomComicsScreen extends StatefulWidget {
const RandomComicsScreen({Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() => _RandomComicsScreenState(); State<StatefulWidget> createState() => _RandomComicsScreenState();
} }
@ -23,6 +26,10 @@ class _RandomComicsScreenState extends State<RandomComicsScreen> {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text('随机本子'), title: Text('随机本子'),

View File

@ -5,16 +5,22 @@ import 'package:pikapika/basic/config/ListLayout.dart';
import 'package:pikapika/basic/config/ShadowCategories.dart'; import 'package:pikapika/basic/config/ShadowCategories.dart';
import 'components/ComicListBuilder.dart'; import 'components/ComicListBuilder.dart';
import 'components/RightClickPop.dart';
// //
class RankingsScreen extends StatelessWidget { class RankingsScreen extends StatelessWidget {
const RankingsScreen({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
var theme = Theme.of(context); var theme = Theme.of(context);
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text('排行榜'), title: const Text('排行榜'),
actions: [ actions: [
shadowCategoriesActionButton(context), shadowCategoriesActionButton(context),
chooseLayoutActionButton(context), chooseLayoutActionButton(context),
@ -30,14 +36,14 @@ class RankingsScreen extends StatelessWidget {
child: TabBar( child: TabBar(
indicatorColor: theme.colorScheme.secondary, indicatorColor: theme.colorScheme.secondary,
labelColor: theme.colorScheme.secondary, labelColor: theme.colorScheme.secondary,
tabs: [ tabs: const [
Tab(text: ''), Tab(text: ''),
Tab(text: ''), Tab(text: ''),
Tab(text: ''), Tab(text: ''),
], ],
), ),
), ),
Expanded( const Expanded(
child: TabBarView( child: TabBarView(
children: [ children: [
_Leaderboard("H24"), _Leaderboard("H24"),
@ -56,7 +62,7 @@ class RankingsScreen extends StatelessWidget {
class _Leaderboard extends StatefulWidget { class _Leaderboard extends StatefulWidget {
final String type; final String type;
_Leaderboard(this.type); const _Leaderboard(this.type);
@override @override
State<StatefulWidget> createState() => _LeaderboardState(); State<StatefulWidget> createState() => _LeaderboardState();

View File

@ -3,11 +3,14 @@ import 'package:flutter_datetime_picker/flutter_datetime_picker.dart';
import 'package:pikapika/basic/Common.dart'; import 'package:pikapika/basic/Common.dart';
import 'package:pikapika/basic/Method.dart'; import 'package:pikapika/basic/Method.dart';
import 'package:pikapika/screens/components/NetworkSetting.dart'; import 'package:pikapika/screens/components/NetworkSetting.dart';
import 'package:pikapika/screens/components/RightClickPop.dart';
import 'components/ContentLoading.dart'; import 'components/ContentLoading.dart';
/// ///
class RegisterScreen extends StatefulWidget { class RegisterScreen extends StatefulWidget {
const RegisterScreen({Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() => _RegisterScreenState(); State<StatefulWidget> createState() => _RegisterScreenState();
} }
@ -86,13 +89,16 @@ class _RegisterScreenState extends State<RegisterScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
if (_registerOver) { if (_registerOver) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('注册成功'), title: const Text('注册成功'),
), ),
body: Center( body: Center(
child: Container(
child: Column( child: Column(
children: [ children: [
Expanded(child: Container()), Expanded(child: Container()),
@ -104,24 +110,24 @@ class _RegisterScreenState extends State<RegisterScreen> {
], ],
), ),
), ),
),
); );
} }
if (_registering) { if (_registering) {
return Scaffold( return Scaffold(
appBar: AppBar(), appBar: AppBar(),
body: ContentLoading(label: '注册中'), body: const ContentLoading(label: '注册中'),
); );
} }
return Scaffold( return Scaffold(
appBar: AppBar(title: Text('注册'), actions: [ appBar: AppBar(title: const Text('注册'), actions: [
IconButton(onPressed: () => _register(), icon: Icon(Icons.check),), IconButton(
onPressed: () => _register(), icon: const Icon(Icons.check),),
],), ],),
body: ListView( body: ListView(
children: [ children: [
Divider(), const Divider(),
ListTile( ListTile(
title: Text("账号 (不一定是邮箱/登录使用)"), title: const Text("账号 (不一定是邮箱/登录使用)"),
subtitle: Text(_email == "" ? "未设置" : _email), subtitle: Text(_email == "" ? "未设置" : _email),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -138,7 +144,7 @@ class _RegisterScreenState extends State<RegisterScreen> {
}, },
), ),
ListTile( ListTile(
title: Text("密码 (8位以上)"), title: const Text("密码 (8位以上)"),
subtitle: Text(_password == "" ? "未设置" : '\u2022' * 10), subtitle: Text(_password == "" ? "未设置" : '\u2022' * 10),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -156,7 +162,7 @@ class _RegisterScreenState extends State<RegisterScreen> {
}, },
), ),
ListTile( ListTile(
title: Text("昵称 (2-50字)"), title: const Text("昵称 (2-50字)"),
subtitle: Text(_name == "" ? "未设置" : _name), subtitle: Text(_name == "" ? "未设置" : _name),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -173,29 +179,29 @@ class _RegisterScreenState extends State<RegisterScreen> {
}, },
), ),
ListTile( ListTile(
title: Text("性别"), title: const Text("性别"),
subtitle: Text(_genderText(_gender)), subtitle: Text(_genderText(_gender)),
onTap: () async { onTap: () async {
String? result = await showDialog<String>( String? result = await showDialog<String>(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return SimpleDialog( return SimpleDialog(
title: Text('选择您的性别'), title: const Text('选择您的性别'),
children: [ children: [
SimpleDialogOption( SimpleDialogOption(
child: Text('扶她'), child: const Text('扶她'),
onPressed: () { onPressed: () {
Navigator.pop(context, 'bot'); Navigator.pop(context, 'bot');
}, },
), ),
SimpleDialogOption( SimpleDialogOption(
child: Text(''), child: const Text(''),
onPressed: () { onPressed: () {
Navigator.pop(context, 'm'); Navigator.pop(context, 'm');
}, },
), ),
SimpleDialogOption( SimpleDialogOption(
child: Text(''), child: const Text(''),
onPressed: () { onPressed: () {
Navigator.pop(context, 'f'); Navigator.pop(context, 'f');
}, },
@ -212,7 +218,7 @@ class _RegisterScreenState extends State<RegisterScreen> {
}, },
), ),
ListTile( ListTile(
title: Text("生日"), title: const Text("生日"),
subtitle: Text(_birthday), subtitle: Text(_birthday),
onTap: () async { onTap: () async {
DatePicker.showDatePicker( DatePicker.showDatePicker(
@ -227,9 +233,9 @@ class _RegisterScreenState extends State<RegisterScreen> {
); );
}, },
), ),
Divider(), const Divider(),
ListTile( ListTile(
title: Text("问题1"), title: const Text("问题1"),
subtitle: Text(_question1 == "" ? "未设置" : _question1), subtitle: Text(_question1 == "" ? "未设置" : _question1),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -246,7 +252,7 @@ class _RegisterScreenState extends State<RegisterScreen> {
}, },
), ),
ListTile( ListTile(
title: Text("回答1"), title: const Text("回答1"),
subtitle: Text(_answer1 == "" ? "未设置" : _answer1), subtitle: Text(_answer1 == "" ? "未设置" : _answer1),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -263,7 +269,7 @@ class _RegisterScreenState extends State<RegisterScreen> {
}, },
), ),
ListTile( ListTile(
title: Text("问题2"), title: const Text("问题2"),
subtitle: Text(_question2 == "" ? "未设置" : _question2), subtitle: Text(_question2 == "" ? "未设置" : _question2),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -280,7 +286,7 @@ class _RegisterScreenState extends State<RegisterScreen> {
}, },
), ),
ListTile( ListTile(
title: Text("回答2"), title: const Text("回答2"),
subtitle: Text(_answer2 == "" ? "未设置" : _answer2), subtitle: Text(_answer2 == "" ? "未设置" : _answer2),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -297,7 +303,7 @@ class _RegisterScreenState extends State<RegisterScreen> {
}, },
), ),
ListTile( ListTile(
title: Text("问题3"), title: const Text("问题3"),
subtitle: Text(_question3 == "" ? "未设置" : _question3), subtitle: Text(_question3 == "" ? "未设置" : _question3),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -314,7 +320,7 @@ class _RegisterScreenState extends State<RegisterScreen> {
}, },
), ),
ListTile( ListTile(
title: Text("回答3"), title: const Text("回答3"),
subtitle: Text(_answer3 == "" ? "未设置" : _answer3), subtitle: Text(_answer3 == "" ? "未设置" : _answer3),
onTap: () async { onTap: () async {
String? input = await displayTextInputDialog( String? input = await displayTextInputDialog(
@ -330,9 +336,9 @@ class _RegisterScreenState extends State<RegisterScreen> {
} }
}, },
), ),
Divider(), const Divider(),
NetworkSetting(), const NetworkSetting(),
Divider(), const Divider(),
], ],
), ),
); );

View File

@ -5,6 +5,7 @@ import 'package:pikapika/basic/config/ShadowCategories.dart';
import 'package:pikapika/basic/store/Categories.dart'; import 'package:pikapika/basic/store/Categories.dart';
import 'package:pikapika/basic/config/ListLayout.dart'; import 'package:pikapika/basic/config/ListLayout.dart';
import 'package:pikapika/basic/Method.dart'; import 'package:pikapika/basic/Method.dart';
import 'package:pikapika/screens/components/RightClickPop.dart';
import '../basic/Entities.dart'; import '../basic/Entities.dart';
import 'components/ComicPager.dart'; import 'components/ComicPager.dart';
@ -80,7 +81,7 @@ class _SearchScreenState extends State<SearchScreen> {
)); ));
} }
}, },
icon: Icon(Icons.category), icon: const Icon(Icons.category),
); );
Future<ComicsPage> _fetch(String _currentSort, int _currentPage) { Future<ComicsPage> _fetch(String _currentSort, int _currentPage) {
@ -98,6 +99,10 @@ class _SearchScreenState extends State<SearchScreen> {
@override @override
Widget build(BuildContext context){ Widget build(BuildContext context){
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) {
return Scaffold( return Scaffold(
appBar: _searchBar.build(context), appBar: _searchBar.build(context),
body: ComicPager( body: ComicPager(

View File

@ -28,6 +28,7 @@ import 'package:pikapika/basic/config/Version.dart';
import 'package:pikapika/basic/config/VolumeController.dart'; import 'package:pikapika/basic/config/VolumeController.dart';
import 'package:pikapika/basic/config/shadowCategoriesMode.dart'; import 'package:pikapika/basic/config/shadowCategoriesMode.dart';
import 'package:pikapika/screens/components/NetworkSetting.dart'; import 'package:pikapika/screens/components/NetworkSetting.dart';
import 'package:pikapika/screens/components/RightClickPop.dart';
import 'CleanScreen.dart'; import 'CleanScreen.dart';
import 'MigrateScreen.dart'; import 'MigrateScreen.dart';
@ -37,7 +38,11 @@ class SettingsScreen extends StatelessWidget {
const SettingsScreen({Key? key}) : super(key: key); const SettingsScreen({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) => Scaffold( Widget build(BuildContext context) {
return RightClickPop(buildScreen(context));
}
Widget buildScreen(BuildContext context) => Scaffold(
appBar: AppBar(title: const Text('设置')), appBar: AppBar(title: const Text('设置')),
body: ListView( body: ListView(
children: [ children: [
@ -47,7 +52,7 @@ class SettingsScreen extends StatelessWidget {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (context) => ModifyPasswordScreen()), builder: (context) => const ModifyPasswordScreen()),
); );
}, },
title: const Text('修改密码'), title: const Text('修改密码'),
@ -72,31 +77,31 @@ class SettingsScreen extends StatelessWidget {
fullScreenUISetting(), fullScreenUISetting(),
contentFailedReloadActionSetting(), contentFailedReloadActionSetting(),
timeZoneSetting(), timeZoneSetting(),
Divider(), const Divider(),
autoCleanSecSetting(), autoCleanSecSetting(),
ListTile( ListTile(
onTap: () { onTap: () {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute(builder: (context) => CleanScreen()), MaterialPageRoute(builder: (context) => const CleanScreen()),
); );
}, },
title: Text('清除缓存'), title: const Text('清除缓存'),
), ),
Divider(), const Divider(),
androidDisplayModeSetting(), androidDisplayModeSetting(),
androidSecureFlagSetting(), androidSecureFlagSetting(),
Divider(), const Divider(),
chooserRootSetting(), chooserRootSetting(),
downloadThreadCountSetting(), downloadThreadCountSetting(),
downloadAndExportPathSetting(), downloadAndExportPathSetting(),
exportRenameSetting(), exportRenameSetting(),
fontSetting(), fontSetting(),
Divider(), const Divider(),
migrate(context), migrate(context),
Divider(), const Divider(),
autoUpdateCheckSetting(), autoUpdateCheckSetting(),
Divider(), const Divider(),
], ],
), ),
); );
@ -104,15 +109,15 @@ class SettingsScreen extends StatelessWidget {
Widget migrate(BuildContext context) { Widget migrate(BuildContext context) {
if (Platform.isAndroid) { if (Platform.isAndroid) {
return ListTile( return ListTile(
title: Text("文件迁移"), title: const Text("文件迁移"),
subtitle: Text("更换您的数据文件夹"), subtitle: const Text("更换您的数据文件夹"),
onTap: () async { onTap: () async {
var f = var f =
await confirmDialog(context, "文件迁移", "此功能菜单保存后, 需要重启程序, 您确认吗"); await confirmDialog(context, "文件迁移", "此功能菜单保存后, 需要重启程序, 您确认吗");
if (f) { if (f) {
Navigator.of(context).pushAndRemoveUntil( Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (BuildContext context) { MaterialPageRoute(builder: (BuildContext context) {
return MigrateScreen(); return const MigrateScreen();
}), }),
(route) => false, (route) => false,
); );
@ -122,4 +127,5 @@ class SettingsScreen extends StatelessWidget {
} }
return Container(); return Container();
} }
} }

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pikapika/basic/Common.dart'; import 'package:pikapika/basic/Common.dart';
import 'package:pikapika/basic/Method.dart'; import 'package:pikapika/basic/Method.dart';
import 'package:pikapika/screens/components/RightClickPop.dart';
import 'ComicInfoScreen.dart'; import 'ComicInfoScreen.dart';
import 'components/Images.dart'; import 'components/Images.dart';
@ -105,12 +106,12 @@ class _ViewLogsScreenState extends State<ViewLogsScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return NotificationListener( final screen = NotificationListener(
child: Scaffold( child: Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text('浏览记录'), title: const Text('浏览记录'),
actions: [ actions: [
IconButton(onPressed: _clearAll, icon: Icon(Icons.auto_delete)), IconButton(onPressed: _clearAll, icon: const Icon(Icons.auto_delete)),
], ],
), ),
body: ListView( body: ListView(
@ -133,6 +134,7 @@ class _ViewLogsScreenState extends State<ViewLogsScreen> {
return true; return true;
}, },
); );
return RightClickPop(screen);
} }
void _chooseComic(String comicId) { void _chooseComic(String comicId) {
@ -190,8 +192,8 @@ class ViewLogWrap extends StatelessWidget {
e.title + '\n', e.title + '\n',
maxLines: 2, maxLines: 2,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle(height: 1.4), style: const TextStyle(height: 1.4),
strutStyle: StrutStyle(height: 1.4), strutStyle: const StrutStyle(height: 1.4),
), ),
], ],
), ),

View File

@ -16,7 +16,7 @@ class Avatar extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
var theme = Theme.of(context); var theme = Theme.of(context);
return Container( return Container(
margin: EdgeInsets.all(_avatarMargin), margin: const EdgeInsets.all(_avatarMargin),
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
border: Border.all( border: Border.all(

View File

@ -32,7 +32,7 @@ class _ComicInfoCard extends State<ComicInfoCard> {
bool? like = info is ComicInfo ? info.isLiked : null; bool? like = info is ComicInfo ? info.isLiked : null;
bool? favourite = info is ComicInfo ? (info).isFavourite : null; bool? favourite = info is ComicInfo ? (info).isFavourite : null;
return Container( return Container(
padding: EdgeInsets.all(5), padding: const EdgeInsets.all(5),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
bottom: BorderSide( bottom: BorderSide(
@ -43,7 +43,7 @@ class _ComicInfoCard extends State<ComicInfoCard> {
child: Row( child: Row(
children: [ children: [
Container( Container(
padding: EdgeInsets.only(right: 10), padding: const EdgeInsets.only(right: 10),
child: RemoteImage( child: RemoteImage(
fileServer: info.thumb.fileServer, fileServer: info.thumb.fileServer,
path: info.thumb.path, path: info.thumb.path,
@ -86,11 +86,11 @@ class _ComicInfoCard extends State<ComicInfoCard> {
widget.linkItem widget.linkItem
? TextSpan( ? TextSpan(
children: [ children: [
TextSpan(text: '分类 :'), const TextSpan(text: '分类 :'),
...info.categories.map( ...info.categories.map(
(e) => TextSpan( (e) => TextSpan(
children: [ children: [
TextSpan(text: ' '), const TextSpan(text: ' '),
TextSpan( TextSpan(
text: e, text: e,
recognizer: TapGestureRecognizer() recognizer: TapGestureRecognizer()
@ -149,7 +149,7 @@ class _ComicInfoCard extends State<ComicInfoCard> {
...(info.epsCount > 0 ...(info.epsCount > 0
? [ ? [
Text.rich(TextSpan(children: [ Text.rich(TextSpan(children: [
WidgetSpan(child: iconPage), const WidgetSpan(child: iconPage),
WidgetSpan(child: iconSpacing), WidgetSpan(child: iconSpacing),
WidgetSpan( WidgetSpan(
child: Text( child: Text(
@ -186,7 +186,7 @@ class _ComicInfoCard extends State<ComicInfoCard> {
? IconButton( ? IconButton(
color: Colors.pink[400], color: Colors.pink[400],
onPressed: () {}, onPressed: () {},
icon: Icon( icon: const Icon(
Icons.sync, Icons.sync,
), ),
) )
@ -211,7 +211,7 @@ class _ComicInfoCard extends State<ComicInfoCard> {
? IconButton( ? IconButton(
color: Colors.pink[400], color: Colors.pink[400],
onPressed: () {}, onPressed: () {},
icon: Icon( icon: const Icon(
Icons.sync, Icons.sync,
), ),
) )
@ -277,12 +277,12 @@ double imageHeight = 315 / 3.15;
Widget buildFinished(bool comicFinished) { Widget buildFinished(bool comicFinished) {
if (comicFinished) { if (comicFinished) {
return Container( return Container(
padding: EdgeInsets.only(left: 8, right: 8), padding: const EdgeInsets.only(left: 8, right: 8),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.orange.shade800, color: Colors.orange.shade800,
borderRadius: BorderRadius.circular(30), borderRadius: BorderRadius.circular(30),
), ),
child: Text( child: const Text(
"完结", "完结",
style: TextStyle( style: TextStyle(
fontSize: 10, fontSize: 10,
@ -313,13 +313,13 @@ final iconLabelStyle = TextStyle(
color: Colors.pink.shade400, color: Colors.pink.shade400,
height: 1.2, height: 1.2,
); );
final iconLabelStrutStyle = StrutStyle( const iconLabelStrutStyle = StrutStyle(
height: 1.2, height: 1.2,
); );
final iconPage = const iconPage =
Icon(Icons.ballot_outlined, size: _iconSize, color: Colors.grey); Icon(Icons.ballot_outlined, size: _iconSize, color: Colors.grey);
final countLabelStyle = TextStyle( const countLabelStyle = TextStyle(
fontSize: 13, fontSize: 13,
color: Colors.grey, color: Colors.grey,
height: 1.2, height: 1.2,
@ -328,7 +328,7 @@ final countLabelStyle = TextStyle(
final iconMargin = Container(width: 20); final iconMargin = Container(width: 20);
final iconSpacing = Container(width: 5); final iconSpacing = Container(width: 5);
final titleStyle = TextStyle(fontWeight: FontWeight.bold); const titleStyle = TextStyle(fontWeight: FontWeight.bold);
final authorStyle = TextStyle( final authorStyle = TextStyle(
fontSize: 13, fontSize: 13,
color: Colors.pink.shade300, color: Colors.pink.shade300,

View File

@ -85,7 +85,7 @@ class _ComicListState extends State<ComicList> {
return InkWell( return InkWell(
onTap: () {}, onTap: () {},
child: Container( child: Container(
padding: EdgeInsets.all(10), padding: const EdgeInsets.all(10),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
bottom: BorderSide( bottom: BorderSide(
@ -311,7 +311,7 @@ class _ComicListState extends State<ComicList> {
fontSize: titleFontSize, fontSize: titleFontSize,
height: 1.2, height: 1.2,
), ),
strutStyle: StrutStyle(height: 1.2), strutStyle: const StrutStyle(height: 1.2),
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),

View File

@ -14,14 +14,13 @@ import 'ContentLoading.dart';
class ComicPager extends StatefulWidget { class ComicPager extends StatefulWidget {
final Future<ComicsPage> Function(String sort, int page) fetchPage; final Future<ComicsPage> Function(String sort, int page) fetchPage;
const ComicPager({required this.fetchPage}); const ComicPager({required this.fetchPage, Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() => _ComicPagerState(); State<StatefulWidget> createState() => _ComicPagerState();
} }
class _ComicPagerState extends State<ComicPager> { class _ComicPagerState extends State<ComicPager> {
@override @override
void initState() { void initState() {
shadowCategoriesEvent.subscribe(_onShadowChange); shadowCategoriesEvent.subscribe(_onShadowChange);
@ -35,8 +34,7 @@ class _ComicPagerState extends State<ComicPager> {
} }
void _onShadowChange(EventArgs? args) { void _onShadowChange(EventArgs? args) {
setState(() { setState(() {});
});
} }
@override @override
@ -89,10 +87,10 @@ class _ControllerComicPagerState extends State<ControllerComicPager> {
future: _pageFuture, future: _pageFuture,
builder: (BuildContext context, AsyncSnapshot<ComicsPage> snapshot) { builder: (BuildContext context, AsyncSnapshot<ComicsPage> snapshot) {
if (snapshot.connectionState == ConnectionState.none) { if (snapshot.connectionState == ConnectionState.none) {
return Text('初始化'); return const Text('初始化');
} }
if (snapshot.connectionState != ConnectionState.done) { if (snapshot.connectionState != ConnectionState.done) {
return ContentLoading(label: '加载中'); return const ContentLoading(label: '加载中');
} }
if (snapshot.hasError) { if (snapshot.hasError) {
return ContentError( return ContentError(
@ -115,7 +113,7 @@ class _ControllerComicPagerState extends State<ControllerComicPager> {
PreferredSize _buildAppBar(ComicsPage comicsPage, BuildContext context) { PreferredSize _buildAppBar(ComicsPage comicsPage, BuildContext context) {
return PreferredSize( return PreferredSize(
preferredSize: Size.fromHeight(40), preferredSize: const Size.fromHeight(40),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
@ -169,7 +167,7 @@ class _ControllerComicPagerState extends State<ControllerComicPager> {
onPressed: () { onPressed: () {
Navigator.pop(context); Navigator.pop(context);
}, },
child: Text('取消'), child: const Text('取消'),
), ),
MaterialButton( MaterialButton(
onPressed: () { onPressed: () {
@ -185,7 +183,7 @@ class _ControllerComicPagerState extends State<ControllerComicPager> {
_currentPage = num; _currentPage = num;
_load(); _load();
}, },
child: Text('确定'), child: const Text('确定'),
), ),
], ],
); );
@ -208,7 +206,7 @@ class _ControllerComicPagerState extends State<ControllerComicPager> {
_load(); _load();
} }
}, },
child: Text('上一页'), child: const Text('上一页'),
), ),
MaterialButton( MaterialButton(
minWidth: 0, minWidth: 0,
@ -218,7 +216,7 @@ class _ControllerComicPagerState extends State<ControllerComicPager> {
_load(); _load();
} }
}, },
child: Text('下一页'), child: const Text('下一页'),
) )
], ],
), ),
@ -298,7 +296,7 @@ class _StreamComicPagerState extends State<StreamComicPager> {
} catch (e, s) { } catch (e, s) {
_error = true; _error = true;
print("$e\n$s"); print("$e\n$s");
throw e; rethrow;
} finally { } finally {
setState(() { setState(() {
_loading = false; _loading = false;
@ -334,7 +332,7 @@ class _StreamComicPagerState extends State<StreamComicPager> {
PreferredSize _buildAppBar(BuildContext context) { PreferredSize _buildAppBar(BuildContext context) {
return PreferredSize( return PreferredSize(
preferredSize: Size.fromHeight(40), preferredSize: const Size.fromHeight(40),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(

View File

@ -12,7 +12,7 @@ class ComicTagsCard extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
var theme = Theme.of(context); var theme = Theme.of(context);
return Container( return Container(
padding: EdgeInsets.only(top: 5, bottom: 5), padding: const EdgeInsets.only(top: 5, bottom: 5),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
bottom: BorderSide( bottom: BorderSide(
@ -27,13 +27,13 @@ class ComicTagsCard extends StatelessWidget {
navPushOrReplace(context, (context) => ComicsScreen(tag: e)); navPushOrReplace(context, (context) => ComicsScreen(tag: e));
}, },
child: Container( child: Container(
padding: EdgeInsets.only( padding: const EdgeInsets.only(
left: 10, left: 10,
right: 10, right: 10,
top: 3, top: 3,
bottom: 3, bottom: 3,
), ),
margin: EdgeInsets.only( margin: const EdgeInsets.only(
left: 5, left: 5,
right: 5, right: 5,
top: 3, top: 3,

View File

@ -129,7 +129,7 @@ class _CommentListState extends State<CommentList> {
), ),
), ),
), ),
padding: EdgeInsets.all(30), padding: const EdgeInsets.all(30),
child: Center( child: Center(
child: Text('我有话要讲'), child: Text('我有话要讲'),
), ),
@ -147,7 +147,7 @@ class _CommentListState extends State<CommentList> {
}); });
}, },
child: Container( child: Container(
padding: EdgeInsets.all(30), padding: const EdgeInsets.all(30),
child: Center( child: Center(
child: Text('上一页'), child: Text('上一页'),
), ),
@ -167,7 +167,7 @@ class _CommentListState extends State<CommentList> {
}); });
}, },
child: Container( child: Container(
padding: EdgeInsets.all(30), padding: const EdgeInsets.all(30),
child: Center( child: Center(
child: Text('下一页'), child: Text('下一页'),
), ),

View File

@ -43,8 +43,8 @@ class _ContinueReadButtonState extends State<ContinueReadButton> {
text = '开始阅读'; text = '开始阅读';
} }
return Container( return Container(
padding: EdgeInsets.only(left: 10, right: 10), padding: const EdgeInsets.only(left: 10, right: 10),
margin: EdgeInsets.only(bottom: 10), margin: const EdgeInsets.only(bottom: 10),
width: width, width: width,
child: MaterialButton( child: MaterialButton(
onPressed: onPressed, onPressed: onPressed,
@ -57,7 +57,7 @@ class _ContinueReadButtonState extends State<ContinueReadButton> {
.bodyText1! .bodyText1!
.color! .color!
.withOpacity(.05), .withOpacity(.05),
padding: EdgeInsets.all(10), padding: const EdgeInsets.all(10),
child: Text( child: Text(
text, text,
textAlign: TextAlign.center, textAlign: TextAlign.center,

View File

@ -63,7 +63,7 @@ class _DesktopCropperState extends State<DesktopCropper> {
baseSizeImage = baseSizeImage =
image.copyResize(baseSizeImage, height: 200, width: 200); image.copyResize(baseSizeImage, height: 200, width: 200);
} }
var f = image.encodeJpg(baseSizeImage!); var f = image.encodeJpg(baseSizeImage);
Navigator.of(context).pop(f); Navigator.of(context).pop(f);
} }
} }

View File

@ -46,7 +46,7 @@ class DownloadInfoCard extends StatelessWidget {
List<dynamic> categories = json.decode(task.categories); List<dynamic> categories = json.decode(task.categories);
var categoriesString = categories.map((e) => "$e").join(" "); var categoriesString = categories.map((e) => "$e").join(" ");
return Container( return Container(
padding: EdgeInsets.all(5), padding: const EdgeInsets.all(5),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
bottom: BorderSide( bottom: BorderSide(
@ -57,7 +57,7 @@ class DownloadInfoCard extends StatelessWidget {
child: Row( child: Row(
children: [ children: [
Container( Container(
padding: EdgeInsets.only(right: 10), padding: const EdgeInsets.only(right: 10),
child: task.thumbLocalPath == "" child: task.thumbLocalPath == ""
? RemoteImage( ? RemoteImage(
fileServer: task.thumbFileServer, fileServer: task.thumbFileServer,

View File

@ -63,7 +63,7 @@ class GameTitleCard extends StatelessWidget {
), ),
Container( Container(
margin: EdgeInsets.only(right: iconMargin), margin: EdgeInsets.only(right: iconMargin),
// padding: EdgeInsets.only( // padding: const EdgeInsets.only(
// left: platformMargin, // left: platformMargin,
// right: platformMargin, // right: platformMargin,
// ), // ),

View File

@ -417,7 +417,7 @@ abstract class _ImageReaderContentState extends State<_ImageReaderContent> {
bottomRight: Radius.circular(10), bottomRight: Radius.circular(10),
), ),
), ),
padding: EdgeInsets.only(top: 10, bottom: 10, left: 6, right: 5), padding: const EdgeInsets.only(top: 10, bottom: 10, left: 6, right: 5),
child: Center( child: Center(
child: _buildSliderWidget(Axis.vertical), child: _buildSliderWidget(Axis.vertical),
), ),
@ -441,7 +441,7 @@ abstract class _ImageReaderContentState extends State<_ImageReaderContent> {
bottomLeft: Radius.circular(10), bottomLeft: Radius.circular(10),
), ),
), ),
padding: EdgeInsets.only(top: 10, bottom: 10, left: 5, right: 6), padding: const EdgeInsets.only(top: 10, bottom: 10, left: 5, right: 6),
child: Center( child: Center(
child: _buildSliderWidget(Axis.vertical), child: _buildSliderWidget(Axis.vertical),
), ),
@ -481,7 +481,7 @@ abstract class _ImageReaderContentState extends State<_ImageReaderContent> {
tooltip: FlutterSliderTooltip(custom: (value) { tooltip: FlutterSliderTooltip(custom: (value) {
double a = value + 1; double a = value + 1;
return Container( return Container(
padding: EdgeInsets.all(8), padding: const EdgeInsets.all(8),
decoration: ShapeDecoration( decoration: ShapeDecoration(
color: Colors.black.withAlpha(0xCC), color: Colors.black.withAlpha(0xCC),
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
@ -526,8 +526,8 @@ abstract class _ImageReaderContentState extends State<_ImageReaderContent> {
child: Material( child: Material(
color: Colors.transparent, color: Colors.transparent,
child: Container( child: Container(
padding: EdgeInsets.only(left: 10, right: 10, top: 4, bottom: 4), padding: const EdgeInsets.only(left: 10, right: 10, top: 4, bottom: 4),
margin: EdgeInsets.only(bottom: 10), margin: const EdgeInsets.only(bottom: 10),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
topRight: Radius.circular(10), topRight: Radius.circular(10),
@ -1082,7 +1082,7 @@ class _WebToonReaderState extends _ImageReaderContentState {
}, },
textColor: Colors.white, textColor: Colors.white,
child: Container( child: Container(
padding: EdgeInsets.only(top: 40, bottom: 40), padding: const EdgeInsets.only(top: 40, bottom: 40),
child: Text(super._hasNextEp() ? '下一章' : '结束阅读'), child: Text(super._hasNextEp() ? '下一章' : '结束阅读'),
), ),
), ),
@ -1379,7 +1379,7 @@ class _ListViewReaderState extends _ImageReaderContentState
return Container(); return Container();
} }
return Container( return Container(
padding: EdgeInsets.all(20), padding: const EdgeInsets.all(20),
child: MaterialButton( child: MaterialButton(
onPressed: () { onPressed: () {
if (super._hasNextEp()) { if (super._hasNextEp()) {
@ -1390,7 +1390,7 @@ class _ListViewReaderState extends _ImageReaderContentState
}, },
textColor: Colors.white, textColor: Colors.white,
child: Container( child: Container(
padding: EdgeInsets.only(top: 40, bottom: 40), padding: const EdgeInsets.only(top: 40, bottom: 40),
child: Text(super._hasNextEp() ? '下一章' : '结束阅读'), child: Text(super._hasNextEp() ? '下一章' : '结束阅读'),
), ),
), ),
@ -1571,8 +1571,8 @@ class _GalleryReaderState extends _ImageReaderContentState {
child: Material( child: Material(
color: Colors.transparent, color: Colors.transparent,
child: Container( child: Container(
margin: EdgeInsets.only(bottom: 10), margin: const EdgeInsets.only(bottom: 10),
padding: EdgeInsets.only(left: 10, right: 10, top: 4, bottom: 4), padding: const EdgeInsets.only(left: 10, right: 10, top: 4, bottom: 4),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
topLeft: Radius.circular(10), topLeft: Radius.circular(10),

View File

@ -293,7 +293,7 @@ Widget buildMock(double? width, double? height) {
var widget = Container( var widget = Container(
width: width, width: width,
height: height, height: height,
padding: EdgeInsets.all(10), padding: const EdgeInsets.all(10),
child: Center( child: Center(
child: SvgPicture.asset( child: SvgPicture.asset(
'lib/assets/unknown.svg', 'lib/assets/unknown.svg',

View File

@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
class RightClickPop extends StatelessWidget {
final Widget child;
const RightClickPop(this.child, {Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return GestureDetector(
onSecondaryTap: () => Navigator.of(context).pop(),
child: child,
);
}
}