From bd949288edc292f742dfab7bd5a89be5e5037c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lollipopkit=F0=9F=8F=B3=EF=B8=8F=E2=80=8D=E2=9A=A7?= =?UTF-8?q?=EF=B8=8F?= <10864310+lollipopkit@users.noreply.github.com> Date: Fri, 10 Oct 2025 09:14:41 +0800 Subject: [PATCH] fix: code editor tool bar (#933) --- lib/app.dart | 2 + lib/data/provider/app.dart | 21 --- lib/data/provider/app.freezed.dart | 206 --------------------- lib/data/provider/app.g.dart | 62 ------- lib/data/provider/providers.dart | 2 +- lib/intro.dart | 37 ---- lib/view/page/server/connection_stats.dart | 2 + lib/view/page/server/tab/tab.dart | 1 + lib/view/page/server/tab/top_bar.dart | 6 +- lib/view/page/setting/entries/app.dart | 6 +- lib/view/page/setting/entries/server.dart | 6 +- pubspec.lock | 12 +- pubspec.yaml | 8 +- 13 files changed, 26 insertions(+), 345 deletions(-) delete mode 100644 lib/data/provider/app.dart delete mode 100644 lib/data/provider/app.freezed.dart delete mode 100644 lib/data/provider/app.g.dart diff --git a/lib/app.dart b/lib/app.dart index 1440d7fe..67bb4650 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -57,8 +57,10 @@ class MyApp extends StatelessWidget { final darkTheme = ThemeData(useMaterial3: true, brightness: Brightness.dark, colorScheme: dark); if (context.isDark && dark != null) { UIs.primaryColor = dark.primary; + UIs.colorSeed = dark.primary; } else if (!context.isDark && light != null) { UIs.primaryColor = light.primary; + UIs.colorSeed = light.primary; } return _buildApp(context, light: lightTheme, dark: darkTheme); diff --git a/lib/data/provider/app.dart b/lib/data/provider/app.dart deleted file mode 100644 index eb3b2f69..00000000 --- a/lib/data/provider/app.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:riverpod_annotation/riverpod_annotation.dart'; - -part 'app.g.dart'; -part 'app.freezed.dart'; - -@freezed -abstract class AppState with _$AppState { - const factory AppState() = _AppState; -} - -@Riverpod(keepAlive: true) -class AppStates extends _$AppStates { - static BuildContext? ctx; - - @override - AppState build() { - return const AppState(); - } -} diff --git a/lib/data/provider/app.freezed.dart b/lib/data/provider/app.freezed.dart deleted file mode 100644 index 4394db85..00000000 --- a/lib/data/provider/app.freezed.dart +++ /dev/null @@ -1,206 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND -// coverage:ignore-file -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'app.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -// dart format off -T _$identity(T value) => value; -/// @nodoc -mixin _$AppState { - - - - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is AppState); -} - - -@override -int get hashCode => runtimeType.hashCode; - -@override -String toString() { - return 'AppState()'; -} - - -} - -/// @nodoc -class $AppStateCopyWith<$Res> { -$AppStateCopyWith(AppState _, $Res Function(AppState) __); -} - - -/// Adds pattern-matching-related methods to [AppState]. -extension AppStatePatterns on AppState { -/// A variant of `map` that fallback to returning `orElse`. -/// -/// It is equivalent to doing: -/// ```dart -/// switch (sealedClass) { -/// case final Subclass value: -/// return ...; -/// case _: -/// return orElse(); -/// } -/// ``` - -@optionalTypeArgs TResult maybeMap(TResult Function( _AppState value)? $default,{required TResult orElse(),}){ -final _that = this; -switch (_that) { -case _AppState() when $default != null: -return $default(_that);case _: - return orElse(); - -} -} -/// A `switch`-like method, using callbacks. -/// -/// Callbacks receives the raw object, upcasted. -/// It is equivalent to doing: -/// ```dart -/// switch (sealedClass) { -/// case final Subclass value: -/// return ...; -/// case final Subclass2 value: -/// return ...; -/// } -/// ``` - -@optionalTypeArgs TResult map(TResult Function( _AppState value) $default,){ -final _that = this; -switch (_that) { -case _AppState(): -return $default(_that);case _: - throw StateError('Unexpected subclass'); - -} -} -/// A variant of `map` that fallback to returning `null`. -/// -/// It is equivalent to doing: -/// ```dart -/// switch (sealedClass) { -/// case final Subclass value: -/// return ...; -/// case _: -/// return null; -/// } -/// ``` - -@optionalTypeArgs TResult? mapOrNull(TResult? Function( _AppState value)? $default,){ -final _that = this; -switch (_that) { -case _AppState() when $default != null: -return $default(_that);case _: - return null; - -} -} -/// A variant of `when` that fallback to an `orElse` callback. -/// -/// It is equivalent to doing: -/// ```dart -/// switch (sealedClass) { -/// case Subclass(:final field): -/// return ...; -/// case _: -/// return orElse(); -/// } -/// ``` - -@optionalTypeArgs TResult maybeWhen(TResult Function()? $default,{required TResult orElse(),}) {final _that = this; -switch (_that) { -case _AppState() when $default != null: -return $default();case _: - return orElse(); - -} -} -/// A `switch`-like method, using callbacks. -/// -/// As opposed to `map`, this offers destructuring. -/// It is equivalent to doing: -/// ```dart -/// switch (sealedClass) { -/// case Subclass(:final field): -/// return ...; -/// case Subclass2(:final field2): -/// return ...; -/// } -/// ``` - -@optionalTypeArgs TResult when(TResult Function() $default,) {final _that = this; -switch (_that) { -case _AppState(): -return $default();case _: - throw StateError('Unexpected subclass'); - -} -} -/// A variant of `when` that fallback to returning `null` -/// -/// It is equivalent to doing: -/// ```dart -/// switch (sealedClass) { -/// case Subclass(:final field): -/// return ...; -/// case _: -/// return null; -/// } -/// ``` - -@optionalTypeArgs TResult? whenOrNull(TResult? Function()? $default,) {final _that = this; -switch (_that) { -case _AppState() when $default != null: -return $default();case _: - return null; - -} -} - -} - -/// @nodoc - - -class _AppState implements AppState { - const _AppState(); - - - - - - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppState); -} - - -@override -int get hashCode => runtimeType.hashCode; - -@override -String toString() { - return 'AppState()'; -} - - -} - - - - -// dart format on diff --git a/lib/data/provider/app.g.dart b/lib/data/provider/app.g.dart deleted file mode 100644 index 5be19682..00000000 --- a/lib/data/provider/app.g.dart +++ /dev/null @@ -1,62 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'app.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint, type=warning - -@ProviderFor(AppStates) -const appStatesProvider = AppStatesProvider._(); - -final class AppStatesProvider extends $NotifierProvider { - const AppStatesProvider._() - : super( - from: null, - argument: null, - retry: null, - name: r'appStatesProvider', - isAutoDispose: false, - dependencies: null, - $allTransitiveDependencies: null, - ); - - @override - String debugGetCreateSourceHash() => _$appStatesHash(); - - @$internal - @override - AppStates create() => AppStates(); - - /// {@macro riverpod.override_with_value} - Override overrideWithValue(AppState value) { - return $ProviderOverride( - origin: this, - providerOverride: $SyncValueProvider(value), - ); - } -} - -String _$appStatesHash() => r'ef96f10f6fff0f3dd6d3128ebf070ad79cbc8bc9'; - -abstract class _$AppStates extends $Notifier { - AppState build(); - @$mustCallSuper - @override - void runBuild() { - final created = build(); - final ref = this.ref as $Ref; - final element = - ref.element - as $ClassProviderElement< - AnyNotifier, - AppState, - Object?, - Object? - >; - element.handleValue(ref, created); - } -} diff --git a/lib/data/provider/providers.dart b/lib/data/provider/providers.dart index c0cf326f..841fef49 100644 --- a/lib/data/provider/providers.dart +++ b/lib/data/provider/providers.dart @@ -1,7 +1,7 @@ +import 'package:fl_lib/fl_lib.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/misc.dart'; -import 'package:server_box/data/provider/app.dart'; import 'package:server_box/data/provider/private_key.dart'; import 'package:server_box/data/provider/server/all.dart'; import 'package:server_box/data/provider/sftp.dart'; diff --git a/lib/intro.dart b/lib/intro.dart index f210316e..1b19a4fe 100644 --- a/lib/intro.dart +++ b/lib/intro.dart @@ -33,43 +33,6 @@ final class _IntroPage extends StatelessWidget { SizedBox(height: padTop), IntroPage.title(text: libL10n.init, big: true), SizedBox(height: padTop), - // Prompt to set backup password after migration or on first launch - ListTile( - leading: const Icon(Icons.lock), - title: Text(l10n.backupPassword), - subtitle: Text(l10n.backupPasswordTip, style: UIs.textGrey), - trailing: const Icon(Icons.keyboard_arrow_right), - onTap: () async { - final currentPwd = await SecureStoreProps.bakPwd.read(); - final controller = TextEditingController(text: currentPwd ?? ''); - final result = await ctx.showRoundDialog( - title: l10n.backupPassword, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text(l10n.backupPasswordTip, style: UIs.textGrey), - UIs.height13, - Input( - label: l10n.backupPassword, - controller: controller, - obscureText: true, - onSubmitted: (_) => ctx.pop(true), - ), - ], - ), - actions: Btnx.oks, - ); - if (result == true) { - final pwd = controller.text.trim(); - if (pwd.isEmpty) { - ctx.showSnackBar(libL10n.empty); - return; - } - await SecureStoreProps.bakPwd.write(pwd); - ctx.showSnackBar(l10n.backupPasswordSet); - } - }, - ).cardx, ListTile( leading: const Icon(IonIcons.language), title: Text(libL10n.language), diff --git a/lib/view/page/server/connection_stats.dart b/lib/view/page/server/connection_stats.dart index 80705d3e..5c47577b 100644 --- a/lib/view/page/server/connection_stats.dart +++ b/lib/view/page/server/connection_stats.dart @@ -7,6 +7,8 @@ import 'package:server_box/data/res/store.dart'; class ConnectionStatsPage extends StatefulWidget { const ConnectionStatsPage({super.key}); + static const route = AppRouteNoArg(page: ConnectionStatsPage.new, path: '/server/conn_stats'); + @override State createState() => _ConnectionStatsPageState(); } diff --git a/lib/view/page/server/tab/tab.dart b/lib/view/page/server/tab/tab.dart index eb64a21e..d0aaf57c 100644 --- a/lib/view/page/server/tab/tab.dart +++ b/lib/view/page/server/tab/tab.dart @@ -21,6 +21,7 @@ import 'package:server_box/data/provider/server/all.dart'; import 'package:server_box/data/provider/server/single.dart'; import 'package:server_box/data/res/build_data.dart'; import 'package:server_box/data/res/store.dart'; +import 'package:server_box/view/page/server/connection_stats.dart'; import 'package:server_box/view/page/server/detail/view.dart'; import 'package:server_box/view/page/server/edit/edit.dart'; import 'package:server_box/view/page/setting/entry.dart'; diff --git a/lib/view/page/server/tab/top_bar.dart b/lib/view/page/server/tab/top_bar.dart index 5476fb3b..5f730d9e 100644 --- a/lib/view/page/server/tab/top_bar.dart +++ b/lib/view/page/server/tab/top_bar.dart @@ -42,9 +42,9 @@ final class _TopBar extends ConsumerWidget implements PreferredSizeWidget { } final total = order.length; final connectionText = '$connected/$total ${context.l10n.conn}'; - leading = Text( - connectionText, - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600), + leading = InkWell( + onTap: () => ConnectionStatsPage.route.go(context), + child: Text(connectionText, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600)), ); } diff --git a/lib/view/page/setting/entries/app.dart b/lib/view/page/setting/entries/app.dart index 2e051252..cc940483 100644 --- a/lib/view/page/setting/entries/app.dart +++ b/lib/view/page/setting/entries/app.dart @@ -89,9 +89,8 @@ extension _App on _AppSettingsPageState { return ListTile( leading: const Icon(Icons.colorize), title: Text(libL10n.primaryColorSeed), - trailing: _setting.colorSeed.listenable().listenVal((val) { - final c = Color(val); - return ClipOval(child: Container(color: c, height: 27, width: 27)); + trailing: _setting.colorSeed.listenable().listenVal((_) { + return ClipOval(child: Container(color: UIs.primaryColor, height: 27, width: 27)); }), onTap: () async { final ctrl = TextEditingController(text: UIs.primaryColor.toHex); @@ -137,7 +136,6 @@ extension _App on _AppSettingsPageState { UIs.colorSeed = color; _setting.colorSeed.put(color.value255); context.pop(); - Future.delayed(Durations.medium1, RNodes.app.notify); } Widget _buildMaxRetry() { diff --git a/lib/view/page/setting/entries/server.dart b/lib/view/page/setting/entries/server.dart index 7710e66a..8495eaf9 100644 --- a/lib/view/page/setting/entries/server.dart +++ b/lib/view/page/setting/entries/server.dart @@ -46,11 +46,7 @@ extension _Server on _AppSettingsPageState { subtitle: Text(l10n.connectionStatsDesc), trailing: const Icon(Icons.keyboard_arrow_right), onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => const ConnectionStatsPage(), - ), - ); + ConnectionStatsPage.route.go(context); }, ); } diff --git a/pubspec.lock b/pubspec.lock index f974cbaa..70bb3dfe 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -505,8 +505,8 @@ packages: dependency: "direct main" description: path: "." - ref: "v1.0.351" - resolved-ref: "98d480eb0128805b5b3361bcfb07c3b46b9f1391" + ref: "v1.0.355" + resolved-ref: "73d5f2603859a9f70459d798ed2d267b1d9a86e5" url: "https://github.com/lppcg/fl_lib" source: git version: "0.0.1" @@ -648,6 +648,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + flutter_staggered_grid_view: + dependency: transitive + description: + name: flutter_staggered_grid_view + sha256: "19e7abb550c96fbfeb546b23f3ff356ee7c59a019a651f8f102a4ba9b7349395" + url: "https://pub.dev" + source: hosted + version: "0.7.0" flutter_svg: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 558d9662..c79d9e65 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,17 +19,19 @@ dependencies: easy_isolate: ^1.3.0 extended_image: ^10.0.0 file_picker: ^10.1.9 + flutter_gbk2utf8: ^1.0.1 flutter_riverpod: ^3.0.1 flutter_highlight: ^0.7.0 flutter_displaymode: ^0.7.0 fl_chart: ^1.0.0 freezed_annotation: ^3.0.0 + get_it: ^8.2.0 highlight: ^0.7.0 hive_ce_flutter: ^2.3.1 intl: ^0.20.2 json_annotation: ^4.9.0 - responsive_framework: ^1.5.1 re_editor: ^0.8.0 + responsive_framework: ^1.5.1 riverpod_annotation: ^3.0.1 shared_preferences: ^2.1.1 wakelock_plus: ^1.2.4 @@ -63,9 +65,7 @@ dependencies: fl_lib: git: url: https://github.com/lppcg/fl_lib - ref: v1.0.351 - flutter_gbk2utf8: ^1.0.1 - get_it: ^8.2.0 + ref: v1.0.355 dependency_overrides: # webdav_client_plus: