From c07958fa737b26bc88e873b8f154b26ebb7045f8 Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Thu, 14 Sep 2023 15:13:11 +0800 Subject: [PATCH] new: `Providers` --- ios/Runner.xcodeproj/project.pbxproj | 24 +++--- lib/core/extension/context/dialog.dart | 12 ++- lib/core/update.dart | 4 +- lib/core/utils/misc.dart | 13 ++-- .../model/server/server_private_info.dart | 4 + lib/data/provider/server.dart | 2 +- lib/data/provider/virtual_keyboard.dart | 4 +- lib/data/res/build_data.dart | 6 +- lib/data/res/provider.dart | 22 ++++++ lib/locator.dart | 2 +- lib/main.dart | 18 ++--- lib/view/page/docker.dart | 74 +++++++++---------- lib/view/page/full_screen.dart | 7 +- lib/view/page/home.dart | 25 +++---- lib/view/page/ping.dart | 16 ++-- lib/view/page/private_key/edit.dart | 10 +-- lib/view/page/process.dart | 7 +- lib/view/page/server/edit.dart | 20 ++--- lib/view/page/server/tab.dart | 13 ++-- lib/view/page/setting/entry.dart | 33 +++++++-- lib/view/page/setting/srv_seq.dart | 13 ++-- lib/view/page/snippet/edit.dart | 20 ++--- lib/view/page/snippet/list.dart | 10 +-- lib/view/page/ssh_term.dart | 4 +- lib/view/page/storage/local.dart | 11 +-- lib/view/page/storage/sftp.dart | 18 ++--- lib/view/page/storage/sftp_mission.dart | 4 +- lib/view/widget/server_func_btns.dart | 16 ++-- macos/Runner.xcodeproj/project.pbxproj | 12 +-- 29 files changed, 206 insertions(+), 218 deletions(-) create mode 100644 lib/data/res/provider.dart diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index de7578f4..90f275d4 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -472,7 +472,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 550; + CURRENT_PROJECT_VERSION = 551; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -480,7 +480,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.550; + MARKETING_VERSION = 1.0.551; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -604,7 +604,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/RunnerDebug.entitlements; - CURRENT_PROJECT_VERSION = 550; + CURRENT_PROJECT_VERSION = 551; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -612,7 +612,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.550; + MARKETING_VERSION = 1.0.551; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -630,7 +630,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 550; + CURRENT_PROJECT_VERSION = 551; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -638,7 +638,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.550; + MARKETING_VERSION = 1.0.551; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -659,7 +659,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 550; + CURRENT_PROJECT_VERSION = 551; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -672,7 +672,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.550; + MARKETING_VERSION = 1.0.551; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; @@ -698,7 +698,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 550; + CURRENT_PROJECT_VERSION = 551; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -711,7 +711,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.550; + MARKETING_VERSION = 1.0.551; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -734,7 +734,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 550; + CURRENT_PROJECT_VERSION = 551; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -747,7 +747,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.550; + MARKETING_VERSION = 1.0.551; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/lib/core/extension/context/dialog.dart b/lib/core/extension/context/dialog.dart index 376ed3f7..42e29079 100644 --- a/lib/core/extension/context/dialog.dart +++ b/lib/core/extension/context/dialog.dart @@ -1,11 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:toolbox/core/extension/context/common.dart'; +import 'package:toolbox/data/res/provider.dart'; import '../../../data/model/server/snippet.dart'; -import '../../../data/provider/snippet.dart'; import '../../../data/res/ui.dart'; -import '../../../locator.dart'; import '../../../view/widget/input_field.dart'; import '../../../view/widget/picker.dart'; import '../../route.dart'; @@ -59,8 +58,7 @@ extension DialogX on BuildContext { S s, void Function(Snippet s) onSelected, ) { - final provider = locator(); - if (provider.snippets.isEmpty) { + if (Providers.snippet.snippets.isEmpty) { showRoundDialog( child: Text(s.noSavedSnippet), actions: [ @@ -80,12 +78,12 @@ extension DialogX on BuildContext { return; } - var snippet = provider.snippets.first; + var snippet = Providers.snippet.snippets.first; showRoundDialog( title: Text(s.choose), child: Picker( - items: provider.snippets.map((e) => Text(e.name)).toList(), - onSelected: (idx) => snippet = provider.snippets[idx], + items: Providers.snippet.snippets.map((e) => Text(e.name)).toList(), + onSelected: (idx) => snippet = Providers.snippet.snippets[idx], ), actions: [ TextButton( diff --git a/lib/core/update.dart b/lib/core/update.dart index 1d297a2e..d920bc3f 100644 --- a/lib/core/update.dart +++ b/lib/core/update.dart @@ -10,8 +10,8 @@ import 'package:toolbox/core/extension/context/snackbar.dart'; import 'package:toolbox/data/model/app/update.dart'; import 'package:toolbox/data/res/logger.dart'; import 'package:toolbox/data/res/path.dart'; +import 'package:toolbox/data/res/provider.dart'; -import '../data/provider/app.dart'; import '../data/res/build_data.dart'; import '../data/service/app.dart'; import '../locator.dart'; @@ -39,7 +39,7 @@ Future doUpdate(BuildContext context, {bool force = false}) async { return; } - locator().newestBuild = newest; + Providers.app.newestBuild = newest; if (!force && newest <= BuildData.build) { Loggers.app.info('Update ignored: ${BuildData.build} >= $newest'); diff --git a/lib/core/utils/misc.dart b/lib/core/utils/misc.dart index c8876871..a1b881a3 100644 --- a/lib/core/utils/misc.dart +++ b/lib/core/utils/misc.dart @@ -6,13 +6,10 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:plain_notification_token/plain_notification_token.dart'; import 'package:share_plus/share_plus.dart'; +import 'package:toolbox/data/res/provider.dart'; -import '../../data/provider/app.dart'; -import '../../locator.dart'; import 'platform.dart'; -final _app = locator(); - Future shareFiles(BuildContext context, List filePaths) async { for (final filePath in filePaths) { if (!await File(filePath).exists()) { @@ -25,10 +22,10 @@ Future shareFiles(BuildContext context, List filePaths) async { } else { text = '${filePaths.length} ${S.of(context)!.files}'; } - _app.moveBg = false; + Providers.app.moveBg = false; // ignore: deprecated_member_use await Share.shareFiles(filePaths, subject: 'ServerBox -> $text'); - _app.moveBg = true; + Providers.app.moveBg = true; return filePaths.isNotEmpty; } @@ -37,9 +34,9 @@ void copy2Clipboard(String text) { } Future pickOneFile() async { - _app.moveBg = false; + Providers.app.moveBg = false; final result = await FilePicker.platform.pickFiles(type: FileType.any); - _app.moveBg = true; + Providers.app.moveBg = true; return result?.files.single.path; } diff --git a/lib/data/model/server/server_private_info.dart b/lib/data/model/server/server_private_info.dart index a116fb3a..ecc093ca 100644 --- a/lib/data/model/server/server_private_info.dart +++ b/lib/data/model/server/server_private_info.dart @@ -1,4 +1,6 @@ import 'package:hive_flutter/hive_flutter.dart'; +import 'package:toolbox/data/model/server/server.dart'; +import 'package:toolbox/data/res/provider.dart'; import '../app/error.dart'; @@ -68,6 +70,8 @@ class ServerPrivateInfo { return data; } + Server? get findServer => Providers.server.servers[id]; + bool shouldReconnect(ServerPrivateInfo old) { return id != old.id || pwd != old.pwd || diff --git a/lib/data/provider/server.dart b/lib/data/provider/server.dart index ec9eade1..5a4af49b 100644 --- a/lib/data/provider/server.dart +++ b/lib/data/provider/server.dart @@ -325,7 +325,7 @@ class ServerProvider extends ChangeNotifier { return await client.run(snippets.map((e) => e.script).join('&&')).string; } - Future> runSnippetsOnMulti( + Future> runSnippetsMulti( List ids, List snippets, ) async { diff --git a/lib/data/provider/virtual_keyboard.dart b/lib/data/provider/virtual_keyboard.dart index 11bd41ea..729720eb 100644 --- a/lib/data/provider/virtual_keyboard.dart +++ b/lib/data/provider/virtual_keyboard.dart @@ -2,8 +2,8 @@ import 'package:flutter/widgets.dart'; import 'package:toolbox/data/res/store.dart'; import 'package:xterm/core.dart'; -class VirtualKeyboard extends TerminalInputHandler with ChangeNotifier { - VirtualKeyboard(); +class VirtKeyProvider extends TerminalInputHandler with ChangeNotifier { + VirtKeyProvider(); bool _ctrl = false; bool get ctrl => _ctrl; diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index 8943f966..f3bd6490 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -2,9 +2,9 @@ class BuildData { static const String name = "ServerBox"; - static const int build = 550; + static const int build = 551; static const String engine = "3.13.2"; - static const String buildAt = "2023-09-13 15:19:48"; - static const int modifications = 45; + static const String buildAt = "2023-09-13 16:03:39"; + static const int modifications = 31; static const int script = 15; } diff --git a/lib/data/res/provider.dart b/lib/data/res/provider.dart new file mode 100644 index 00000000..65fcafb6 --- /dev/null +++ b/lib/data/res/provider.dart @@ -0,0 +1,22 @@ +import 'package:toolbox/data/provider/app.dart'; +import 'package:toolbox/data/provider/debug.dart'; +import 'package:toolbox/data/provider/docker.dart'; +import 'package:toolbox/data/provider/private_key.dart'; +import 'package:toolbox/data/provider/server.dart'; +import 'package:toolbox/data/provider/sftp.dart'; +import 'package:toolbox/data/provider/snippet.dart'; +import 'package:toolbox/data/provider/virtual_keyboard.dart'; +import 'package:toolbox/locator.dart'; + +class Providers { + const Providers._(); + + static final app = locator(); + static final debug = locator(); + static final docker = locator(); + static final key = locator(); + static final server = locator(); + static final sftp = locator(); + static final snippet = locator(); + static final virtKey = locator(); +} diff --git a/lib/locator.dart b/lib/locator.dart index 282f70cc..99935a70 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -27,7 +27,7 @@ void _setupLocatorForProviders() { locator.registerSingleton(DebugProvider()); locator.registerSingleton(DockerProvider()); locator.registerSingleton(ServerProvider()); - locator.registerSingleton(VirtualKeyboard()); + locator.registerSingleton(VirtKeyProvider()); locator.registerSingleton(SnippetProvider()); locator.registerSingleton(PrivateKeyProvider()); locator.registerSingleton(SftpProvider()); diff --git a/lib/main.dart b/lib/main.dart index fbdb309e..b07b6ecb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,6 +6,7 @@ import 'package:logging/logging.dart'; import 'package:macos_window_utils/window_manipulator.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/store.dart'; import 'app.dart'; @@ -32,8 +33,6 @@ import 'locator.dart'; import 'view/widget/custom_appbar.dart'; import 'view/widget/rebuild.dart'; -DebugProvider? _debug; - Future main() async { _runInZone(() async { await initApp(); @@ -45,7 +44,7 @@ Future main() async { ChangeNotifierProvider(create: (_) => locator()), ChangeNotifierProvider(create: (_) => locator()), ChangeNotifierProvider(create: (_) => locator()), - ChangeNotifierProvider(create: (_) => locator()), + ChangeNotifierProvider(create: (_) => locator()), ChangeNotifierProvider(create: (_) => locator()), ChangeNotifierProvider(create: (_) => locator()), ], @@ -77,9 +76,6 @@ Future initApp() async { // Base of all data. await _initHive(); await setupLocator(); - - // Setup [DebugProvider] first to catch all logs. - _debug = locator(); _setupLogger(); _setupProviders(); @@ -101,8 +97,8 @@ Future initApp() async { } void _setupProviders() { - locator().loadData(); - locator().loadData(); + Providers.snippet.loadData(); + Providers.key.loadData(); } Future _initHive() async { @@ -119,14 +115,14 @@ void _setupLogger() { Logger.root.level = Level.ALL; Logger.root.onRecord.listen((record) { var str = '[${record.loggerName}][${record.level.name}]: ${record.message}'; - _debug?.addText(str); + Providers.debug.addText(str); if (record.error != null) { str += '\n${record.error}'; - _debug?.addMultiline(record.error.toString(), Colors.red); + Providers.debug.addMultiline(record.error.toString(), Colors.red); } if (record.stackTrace != null) { str += '\n${record.stackTrace}'; - _debug?.addMultiline(record.stackTrace.toString(), Colors.white); + Providers.debug.addMultiline(record.stackTrace.toString(), Colors.white); } // ignore: avoid_print print(str); diff --git a/lib/view/page/docker.dart b/lib/view/page/docker.dart index 9204826d..f817b1d1 100644 --- a/lib/view/page/docker.dart +++ b/lib/view/page/docker.dart @@ -6,18 +6,17 @@ import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/context/snackbar.dart'; import 'package:toolbox/core/route.dart'; import 'package:toolbox/data/model/docker/image.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/view/widget/input_field.dart'; import '../../data/model/docker/ps.dart'; import '../../data/model/server/server_private_info.dart'; import '../../data/provider/docker.dart'; -import '../../data/provider/server.dart'; import '../../data/model/app/error.dart'; import '../../data/model/app/menu.dart'; import '../../data/res/ui.dart'; import '../../data/res/url.dart'; -import '../../locator.dart'; import '../widget/custom_appbar.dart'; import '../widget/popup_menu.dart'; import '../widget/round_rect_card.dart'; @@ -33,14 +32,13 @@ class DockerManagePage extends StatefulWidget { } class _DockerManagePageState extends State { - final _docker = locator(); final _textController = TextEditingController(); late S _s; @override void dispose() { super.dispose(); - _docker.clear(); + Providers.docker.clear(); _textController.dispose(); } @@ -53,17 +51,19 @@ class _DockerManagePageState extends State { @override void initState() { super.initState(); - final client = locator().servers[widget.spi.id]?.client; + final client = widget.spi.findServer?.client; if (client == null) { return; } - _docker.init( - client, - widget.spi.user, - (user) async => await context.showPwdDialog(user), - widget.spi.id, - context, - ); + Providers.docker + ..init( + client, + widget.spi.user, + (user) async => await context.showPwdDialog(user), + widget.spi.id, + context, + ) + ..refresh(); } @override @@ -77,7 +77,7 @@ class _DockerManagePageState extends State { IconButton( onPressed: () async { context.showLoadingDialog(); - await _docker.refresh(); + await Providers.docker.refresh(); context.pop(); }, icon: const Icon(Icons.refresh), @@ -85,7 +85,8 @@ class _DockerManagePageState extends State { ], ), body: _buildMain(), - floatingActionButton: _docker.error == null ? _buildFAB() : null, + floatingActionButton: + Providers.docker.error == null ? _buildFAB() : null, ); }); } @@ -162,7 +163,7 @@ class _DockerManagePageState extends State { onPressed: () async { context.pop(); context.showLoadingDialog(); - final result = await _docker.run(cmd); + final result = await Providers.docker.run(cmd); context.pop(); if (result != null) { context.showSnackBar(result.message ?? _s.unknownError); @@ -188,7 +189,7 @@ class _DockerManagePageState extends State { } Widget _buildMain() { - if (_docker.error != null && _docker.items == null) { + if (Providers.docker.error != null && Providers.docker.items == null) { return SizedBox.expand( child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -199,22 +200,17 @@ class _DockerManagePageState extends State { size: 37, ), const SizedBox(height: 27), - Text(_docker.error?.message ?? _s.unknownError), + Text(Providers.docker.error?.message ?? _s.unknownError), const SizedBox(height: 27), Padding( padding: const EdgeInsets.all(17), - child: _buildSolution(_docker.error!), + child: _buildSolution(Providers.docker.error!), ) ], ), ); } - if (_docker.items == null || _docker.images == null) { - Future.delayed(const Duration(milliseconds: 37), () { - if (mounted) { - _docker.refresh(); - } - }); + if (Providers.docker.items == null || Providers.docker.images == null) { return UIs.centerLoading; } @@ -236,12 +232,12 @@ class _DockerManagePageState extends State { ListTile( title: Text(_s.imagesList), subtitle: Text( - _s.dockerImagesFmt(_docker.images!.length), + _s.dockerImagesFmt(Providers.docker.images!.length), style: UIs.textGrey, ), ), ]; - items.addAll(_docker.images!.map(_buildImageItem)); + items.addAll(Providers.docker.images!.map(_buildImageItem)); return Column(children: items); } @@ -270,7 +266,7 @@ class _DockerManagePageState extends State { TextButton( onPressed: () async { context.pop(); - final result = await _docker.run( + final result = await Providers.docker.run( 'docker rmi ${e.id} -f', ); if (result != null) { @@ -284,7 +280,7 @@ class _DockerManagePageState extends State { } Widget _buildLoading() { - if (_docker.runLog == null) return UIs.placeholder; + if (Providers.docker.runLog == null) return UIs.placeholder; return Padding( padding: const EdgeInsets.all(17), child: Column( @@ -293,7 +289,7 @@ class _DockerManagePageState extends State { child: CircularProgressIndicator(), ), UIs.height13, - Text(_docker.runLog ?? '...'), + Text(Providers.docker.runLog ?? '...'), ], ), ); @@ -334,8 +330,8 @@ class _DockerManagePageState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(_docker.edition ?? _s.unknown), - Text(_docker.version ?? _s.unknown), + Text(Providers.docker.edition ?? _s.unknown), + Text(Providers.docker.version ?? _s.unknown), ], ), ); @@ -346,12 +342,12 @@ class _DockerManagePageState extends State { ListTile( title: Text(_s.containerStatus), subtitle: Text( - _buildPsCardSubtitle(_docker.items!), + _buildPsCardSubtitle(Providers.docker.items!), style: UIs.textGrey, ), ), ]; - items.addAll(_docker.items!.map(_buildPsItem)); + items.addAll(Providers.docker.items!.map(_buildPsItem)); return Column( mainAxisSize: MainAxisSize.min, children: items, @@ -387,7 +383,7 @@ class _DockerManagePageState extends State { onPressed: () async { context.pop(); context.showLoadingDialog(); - await _docker.delete(dItem.containerId); + await Providers.docker.delete(dItem.containerId); context.pop(); }, child: Text(_s.ok), @@ -397,17 +393,17 @@ class _DockerManagePageState extends State { break; case DockerMenuType.start: context.showLoadingDialog(); - await _docker.start(dItem.containerId); + await Providers.docker.start(dItem.containerId); context.pop(); break; case DockerMenuType.stop: context.showLoadingDialog(); - await _docker.stop(dItem.containerId); + await Providers.docker.stop(dItem.containerId); context.pop(); break; case DockerMenuType.restart: context.showLoadingDialog(); - await _docker.restart(dItem.containerId); + await Providers.docker.restart(dItem.containerId); context.pop(); break; case DockerMenuType.logs: @@ -456,7 +452,7 @@ class _DockerManagePageState extends State { Widget _buildEditHost() { final children = []; - if (_docker.items!.isEmpty && _docker.images!.isEmpty) { + if (Providers.docker.items!.isEmpty && Providers.docker.images!.isEmpty) { children.add(Padding( padding: const EdgeInsets.fromLTRB(17, 17, 17, 0), child: Text( @@ -499,6 +495,6 @@ class _DockerManagePageState extends State { void _onSaveDockerHost(String val) { context.pop(); Stores.docker.put(widget.spi.id, val.trim()); - _docker.refresh(); + Providers.docker.refresh(); } } diff --git a/lib/view/page/full_screen.dart b/lib/view/page/full_screen.dart index 2f576da6..e5aff381 100644 --- a/lib/view/page/full_screen.dart +++ b/lib/view/page/full_screen.dart @@ -10,9 +10,9 @@ import 'package:provider/provider.dart'; import 'package:toolbox/core/route.dart'; import 'package:toolbox/data/model/server/disk.dart'; import 'package:toolbox/data/provider/server.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/data/res/ui.dart'; -import 'package:toolbox/locator.dart'; import '../../core/analysis.dart'; import '../../core/update.dart'; @@ -38,7 +38,6 @@ class _FullScreenPageState extends State with AfterLayoutMixin { late int _rotateQuarter; final _pageController = PageController(initialPage: 0); - final _serverProvider = locator(); @override void initState() { @@ -372,8 +371,8 @@ class _FullScreenPageState extends State with AfterLayoutMixin { doUpdate(context); } await GetIt.I.allReady(); - await _serverProvider.loadLocalData(); - await _serverProvider.refreshData(); + await Providers.server.loadLocalData(); + await Providers.server.refreshData(); if (!Analysis.enabled) { await Analysis.init(); } diff --git a/lib/view/page/home.dart b/lib/view/page/home.dart index 6c663f6c..df0fe83d 100644 --- a/lib/view/page/home.dart +++ b/lib/view/page/home.dart @@ -7,6 +7,7 @@ import 'package:get_it/get_it.dart'; import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/data/res/github_id.dart'; import 'package:toolbox/data/res/logger.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/store.dart'; import '../../core/analysis.dart'; @@ -16,13 +17,10 @@ import '../../core/utils/platform.dart'; import '../../core/utils/ui.dart'; import '../../data/model/app/github_id.dart'; import '../../data/model/app/tab.dart'; -import '../../data/provider/app.dart'; -import '../../data/provider/server.dart'; import '../../data/res/build_data.dart'; import '../../data/res/misc.dart'; import '../../data/res/ui.dart'; import '../../data/res/url.dart'; -import '../../locator.dart'; import '../widget/custom_appbar.dart'; import '../widget/round_rect_card.dart'; import '../widget/url_text.dart'; @@ -40,9 +38,6 @@ class _HomePageState extends State AutomaticKeepAliveClientMixin, AfterLayoutMixin, WidgetsBindingObserver { - final _serverProvider = locator(); - final _app = locator(); - late final PageController _pageController; final _selectIndex = ValueNotifier(0); @@ -73,7 +68,7 @@ class _HomePageState extends State void dispose() { super.dispose(); WidgetsBinding.instance.removeObserver(this); - _serverProvider.closeServer(); + Providers.server.closeServer(); _pageController.dispose(); } @@ -84,20 +79,20 @@ class _HomePageState extends State switch (state) { case AppLifecycleState.resumed: - if (!_serverProvider.isAutoRefreshOn) { - _serverProvider.startAutoRefresh(); + if (!Providers.server.isAutoRefreshOn) { + Providers.server.startAutoRefresh(); } updateHomeWidget(); break; case AppLifecycleState.paused: // Keep running in background on Android device if (isAndroid && Stores.setting.bgRun.fetch()) { - if (_app.moveBg) { + if (Providers.app.moveBg) { Miscs.bgRunChannel.invokeMethod('sendToBackground'); } } else { - _serverProvider.setDisconnected(); - _serverProvider.stopAutoRefresh(); + Providers.server.setDisconnected(); + Providers.server.stopAutoRefresh(); } break; default: @@ -148,7 +143,7 @@ class _HomePageState extends State return IconButton( icon: const Icon(Icons.refresh, size: 23), tooltip: 'Refresh', - onPressed: () => _serverProvider.refreshData(onlyFailed: true), + onPressed: () => Providers.server.refreshData(onlyFailed: true), ); }, ), @@ -346,8 +341,8 @@ class _HomePageState extends State } updateHomeWidget(); await GetIt.I.allReady(); - await _serverProvider.loadLocalData(); - await _serverProvider.refreshData(); + await Providers.server.loadLocalData(); + await Providers.server.refreshData(); if (!Analysis.enabled) { Analysis.init(); } diff --git a/lib/view/page/ping.dart b/lib/view/page/ping.dart index 6eb93f05..c93509c9 100644 --- a/lib/view/page/ping.dart +++ b/lib/view/page/ping.dart @@ -6,15 +6,14 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:toolbox/core/extension/context/common.dart'; import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/context/snackbar.dart'; +import 'package:toolbox/core/extension/uint8list.dart'; import 'package:toolbox/core/utils/misc.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/view/widget/value_notifier.dart'; -import '../../core/extension/uint8list.dart'; import '../../data/model/server/ping_result.dart'; -import '../../data/provider/server.dart'; import '../../data/res/color.dart'; import '../../data/res/ui.dart'; -import '../../locator.dart'; import '../widget/input_field.dart'; import '../widget/round_rect_card.dart'; @@ -32,7 +31,6 @@ class _PingPageState extends State with AutomaticKeepAliveClientMixin, AfterLayoutMixin { late TextEditingController _textEditingController; final _results = ValueNotifier([]); - final _serverProvider = locator(); late S _s; bool get isInit => _results.value.isEmpty; @@ -176,7 +174,7 @@ class _PingPageState extends State return; } - if (_serverProvider.servers.isEmpty) { + if (Providers.server.servers.isEmpty) { context.showSnackBar(_s.pingNoServer); return; } @@ -187,7 +185,7 @@ class _PingPageState extends State return; } - await Future.wait(_serverProvider.servers.values.map((e) async { + await Future.wait(Providers.server.servers.values.map((e) async { if (e.client == null) { return; } @@ -207,9 +205,9 @@ class _PingPageState extends State @override Future> afterFirstLayout(BuildContext context) async { - if (_serverProvider.servers.isEmpty) { - await _serverProvider.loadLocalData(); - await _serverProvider.refreshData(); + if (Providers.server.servers.isEmpty) { + await Providers.server.loadLocalData(); + await Providers.server.refreshData(); } } } diff --git a/lib/view/page/private_key/edit.dart b/lib/view/page/private_key/edit.dart index d5450448..cf1af09f 100644 --- a/lib/view/page/private_key/edit.dart +++ b/lib/view/page/private_key/edit.dart @@ -10,13 +10,12 @@ import 'package:toolbox/core/extension/context/snackbar.dart'; import 'package:toolbox/core/extension/numx.dart'; import 'package:toolbox/core/utils/misc.dart'; import 'package:toolbox/data/res/misc.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/view/widget/input_field.dart'; import '../../../core/utils/server.dart'; import '../../../data/model/server/private_key_info.dart'; -import '../../../data/provider/private_key.dart'; import '../../../data/res/ui.dart'; -import '../../../locator.dart'; import '../../widget/custom_appbar.dart'; const _format = 'text/plain'; @@ -39,7 +38,6 @@ class _PrivateKeyEditPageState extends State { final _pwdNode = FocusNode(); late FocusScopeNode _focusScope; - final _provider = locator(); late S _s; Widget? _loading; @@ -99,7 +97,7 @@ class _PrivateKeyEditPageState extends State { actions: [ TextButton( onPressed: () { - _provider.delete(widget.pki!); + Providers.key.delete(widget.pki!); context.pop(); context.pop(); }, @@ -139,9 +137,9 @@ class _PrivateKeyEditPageState extends State { final decrypted = await compute(decyptPem, [key, pwd]); final pki = PrivateKeyInfo(id: name, key: decrypted); if (widget.pki != null) { - _provider.update(widget.pki!, pki); + Providers.key.update(widget.pki!, pki); } else { - _provider.add(pki); + Providers.key.add(pki); } } catch (e) { context.showSnackBar(e.toString()); diff --git a/lib/view/page/process.dart b/lib/view/page/process.dart index 9152532d..234e2621 100644 --- a/lib/view/page/process.dart +++ b/lib/view/page/process.dart @@ -8,14 +8,13 @@ import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/context/snackbar.dart'; import 'package:toolbox/core/extension/uint8list.dart'; import 'package:toolbox/core/utils/misc.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/store.dart'; import '../../data/model/app/shell_func.dart'; import '../../data/model/server/proc.dart'; import '../../data/model/server/server_private_info.dart'; -import '../../data/provider/server.dart'; import '../../data/res/ui.dart'; -import '../../locator.dart'; import '../widget/custom_appbar.dart'; import '../widget/round_rect_card.dart'; import '../widget/two_line_text.dart'; @@ -44,12 +43,10 @@ class _ProcessPageState extends State { ProcSortMode _procSortMode = ProcSortMode.cpu; List _sortModes = List.from(ProcSortMode.values); - final _serverProvider = locator(); - @override void initState() { super.initState(); - _client = _serverProvider.servers[widget.spi.id]?.client; + _client = Providers.server.servers[widget.spi.id]?.client; final duration = Duration(seconds: Stores.setting.serverStatusUpdateInterval.fetch()); _timer = Timer.periodic(duration, (_) => _refresh()); diff --git a/lib/view/page/server/edit.dart b/lib/view/page/server/edit.dart index dbc50b3c..49e1be7e 100644 --- a/lib/view/page/server/edit.dart +++ b/lib/view/page/server/edit.dart @@ -4,14 +4,13 @@ import 'package:provider/provider.dart'; import 'package:toolbox/core/extension/context/common.dart'; import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/context/snackbar.dart'; +import 'package:toolbox/data/res/provider.dart'; import '../../../core/route.dart'; import '../../../data/model/server/private_key_info.dart'; import '../../../data/model/server/server_private_info.dart'; import '../../../data/provider/private_key.dart'; -import '../../../data/provider/server.dart'; import '../../../data/res/ui.dart'; -import '../../../locator.dart'; import '../../widget/custom_appbar.dart'; import '../../widget/input_field.dart'; import '../../widget/round_rect_card.dart'; @@ -43,9 +42,6 @@ class _ServerEditPageState extends State { late FocusScopeNode _focusScope; late S _s; - final _srvs = locator(); - final _keys = locator(); - final _keyIdx = ValueNotifier(null); final _autoConnect = ValueNotifier(true); @@ -63,7 +59,7 @@ class _ServerEditPageState extends State { if (widget.spi?.pubKeyId == null) { _passwordController.text = widget.spi?.pwd ?? ''; } else { - _keyIdx.value = _keys.pkis.indexWhere( + _keyIdx.value = Providers.key.pkis.indexWhere( (e) => e.id == widget.spi!.pubKeyId, ); } @@ -121,7 +117,7 @@ class _ServerEditPageState extends State { actions: [ TextButton( onPressed: () { - _srvs.delServer(widget.spi!.id); + Providers.server.delServer(widget.spi!.id); context.pop(); context.pop(true); }, @@ -190,8 +186,8 @@ class _ServerEditPageState extends State { tags: _tags, onChanged: (p0) => _tags = p0, s: _s, - allTags: [..._srvs.tags], - onRenameTag: _srvs.renameTag, + allTags: [...Providers.server.tags], + onRenameTag: Providers.server.renameTag, ), _buildAuth(), ListTile( @@ -364,7 +360,7 @@ class _ServerEditPageState extends State { user: _usernameController.text, pwd: _passwordController.text.isEmpty ? null : _passwordController.text, pubKeyId: _keyIdx.value != null - ? _keys.pkis.elementAt(_keyIdx.value!).id + ? Providers.key.pkis.elementAt(_keyIdx.value!).id : null, tags: _tags, alterUrl: _altUrlController.text.isEmpty ? null : _altUrlController.text, @@ -372,9 +368,9 @@ class _ServerEditPageState extends State { ); if (widget.spi == null) { - _srvs.addServer(spi); + Providers.server.addServer(spi); } else { - _srvs.updateServer(widget.spi!, spi); + Providers.server.updateServer(widget.spi!, spi); } context.pop(); diff --git a/lib/view/page/server/tab.dart b/lib/view/page/server/tab.dart index 6ffa25e9..96797eb0 100644 --- a/lib/view/page/server/tab.dart +++ b/lib/view/page/server/tab.dart @@ -8,6 +8,7 @@ import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/media_queryx.dart'; import 'package:toolbox/core/extension/ssh_client.dart'; import 'package:toolbox/data/model/app/shell_func.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/store.dart'; import '../../../core/route.dart'; @@ -21,7 +22,6 @@ import '../../../data/model/server/server_status.dart'; import '../../../data/provider/server.dart'; import '../../../data/res/color.dart'; import '../../../data/res/ui.dart'; -import '../../../locator.dart'; import '../../widget/round_rect_card.dart'; import '../../widget/server_func_btns.dart'; import '../../widget/tag.dart'; @@ -39,7 +39,6 @@ class _ServerPageState extends State late S _s; final _flipedCardIds = {}; - final _serverProvider = locator(); String? _tag; bool _useDoubleColumn = false; @@ -96,7 +95,7 @@ class _ServerPageState extends State } return RefreshIndicator( onRefresh: () async => - await _serverProvider.refreshData(onlyFailed: true), + await Providers.server.refreshData(onlyFailed: true), child: child, ); } @@ -308,7 +307,7 @@ class _ServerPageState extends State Widget? rightCorner; if (!(spi.autoConnect ?? true) && cs == ServerState.disconnected) { rightCorner = InkWell( - onTap: () => _serverProvider.refreshData(spi: spi), + onTap: () => Providers.server.refreshData(spi: spi), child: const Padding( padding: EdgeInsets.symmetric(horizontal: 7), child: Icon( @@ -459,10 +458,10 @@ class _ServerPageState extends State @override Future afterFirstLayout(BuildContext context) async { await GetIt.I.allReady(); - if (_serverProvider.servers.isEmpty) { - await _serverProvider.loadLocalData(); + if (Providers.server.servers.isEmpty) { + await Providers.server.loadLocalData(); } - _serverProvider.startAutoRefresh(); + Providers.server.startAutoRefresh(); } List _filterServers(ServerProvider pro) => pro.serverOrder diff --git a/lib/view/page/setting/entry.dart b/lib/view/page/setting/entry.dart index dd1a4cfd..10532491 100644 --- a/lib/view/page/setting/entry.dart +++ b/lib/view/page/setting/entry.dart @@ -12,6 +12,7 @@ import 'package:toolbox/core/extension/context/snackbar.dart'; import 'package:toolbox/core/extension/locale.dart'; import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/stringx.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/store.dart'; import '../../../core/persistant_store.dart'; @@ -21,12 +22,10 @@ import '../../../core/utils/platform.dart'; import '../../../core/update.dart'; import '../../../data/model/app/net_view.dart'; import '../../../data/provider/app.dart'; -import '../../../data/provider/server.dart'; import '../../../data/res/build_data.dart'; import '../../../data/res/color.dart'; import '../../../data/res/path.dart'; import '../../../data/res/ui.dart'; -import '../../../locator.dart'; import '../../widget/color_picker.dart'; import '../../widget/custom_appbar.dart'; import '../../widget/future_widget.dart'; @@ -52,7 +51,6 @@ class _SettingPageState extends State { final _keyboardTypeKey = GlobalKey>(); final _rotateQuarterKey = GlobalKey>(); final _netViewTypeKey = GlobalKey>(); - final _serverProvider = locator(); final _setting = Stores.setting; late S _s; @@ -108,8 +106,8 @@ class _SettingPageState extends State { appBar: CustomAppBar( title: Text(_s.setting), actions: [ - IconButton( - onPressed: () => context.showRoundDialog( + InkWell( + onTap: () => context.showRoundDialog( title: Text(_s.attention), child: Text(_s.sureDelete(_s.all)), actions: [ @@ -123,7 +121,26 @@ class _SettingPageState extends State { ), ], ), - icon: const Icon(Icons.delete), + onDoubleTap: () => context.showRoundDialog( + title: Text(_s.attention), + child: Text(_s.sureDelete(_s.all)), + actions: [ + TextButton( + onPressed: () { + Stores.docker.box.deleteFromDisk(); + Stores.server.box.deleteFromDisk(); + Stores.setting.box.deleteFromDisk(); + Stores.history.box.deleteFromDisk(); + Stores.snippet.box.deleteFromDisk(); + Stores.key.box.deleteFromDisk(); + context.pop(); + context.showSnackBar(_s.success); + }, + child: Text(_s.ok, style: const TextStyle(color: Colors.red)), + ), + ], + ), + child: const Icon(Icons.delete), ), ], ), @@ -282,7 +299,7 @@ class _SettingPageState extends State { onSelected: (int val) { _updateInterval.value = val; _setting.serverStatusUpdateInterval.put(val); - _serverProvider.startAutoRefresh(); + Providers.server.startAutoRefresh(); if (val == 0) { context.showSnackBar(_s.updateIntervalEqual0); } @@ -968,7 +985,7 @@ class _SettingPageState extends State { child: Text(_s.sureDelete(e)), actions: [ TextButton( - onPressed: () => _serverProvider.delServer(e), + onPressed: () => Providers.server.delServer(e), child: Text(_s.ok), ) ], diff --git a/lib/view/page/setting/srv_seq.dart b/lib/view/page/setting/srv_seq.dart index b706c995..21887bbd 100644 --- a/lib/view/page/setting/srv_seq.dart +++ b/lib/view/page/setting/srv_seq.dart @@ -1,11 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:toolbox/core/extension/order.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/view/widget/round_rect_card.dart'; -import '../../../data/provider/server.dart'; -import '../../../locator.dart'; import '../../widget/custom_appbar.dart'; class ServerOrderPage extends StatefulWidget { @@ -16,8 +15,6 @@ class ServerOrderPage extends StatefulWidget { } class _ServerOrderPageState extends State { - final _provider = locator(); - late S _s; @override @@ -40,7 +37,7 @@ class _ServerOrderPageState extends State { return ReorderableListView.builder( footer: const SizedBox(height: 77), onReorder: (oldIndex, newIndex) => setState(() { - _provider.serverOrder.move( + Providers.server.serverOrder.move( oldIndex, newIndex, property: Stores.setting.serverOrder, @@ -49,13 +46,13 @@ class _ServerOrderPageState extends State { padding: const EdgeInsets.symmetric(horizontal: 7, vertical: 3), buildDefaultDragHandles: false, itemBuilder: (_, index) => - _buildItem(index, _provider.serverOrder[index]), - itemCount: _provider.serverOrder.length, + _buildItem(index, Providers.server.serverOrder[index]), + itemCount: Providers.server.serverOrder.length, ); } Widget _buildItem(int index, String id) { - final spi = _provider.servers[id]?.spi; + final spi = Providers.server.servers[id]?.spi; if (spi == null) { return const SizedBox(); } diff --git a/lib/view/page/snippet/edit.dart b/lib/view/page/snippet/edit.dart index 5ef486db..ffd6aa2f 100644 --- a/lib/view/page/snippet/edit.dart +++ b/lib/view/page/snippet/edit.dart @@ -3,12 +3,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:toolbox/core/extension/context/common.dart'; import 'package:toolbox/core/extension/context/snackbar.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/view/widget/input_field.dart'; import '../../../data/model/server/snippet.dart'; -import '../../../data/provider/snippet.dart'; import '../../../data/res/ui.dart'; -import '../../../locator.dart'; import '../../widget/custom_appbar.dart'; import '../../widget/tag.dart'; @@ -28,17 +27,10 @@ class _SnippetEditPageState extends State final _noteController = TextEditingController(); final _scriptNode = FocusNode(); - late SnippetProvider _provider; late S _s; List _tags = []; - @override - void initState() { - super.initState(); - _provider = locator(); - } - @override void dispose() { super.dispose(); @@ -72,7 +64,7 @@ class _SnippetEditPageState extends State return [ IconButton( onPressed: () { - _provider.del(widget.snippet!); + Providers.snippet.del(widget.snippet!); context.pop(); }, tooltip: _s.delete, @@ -100,9 +92,9 @@ class _SnippetEditPageState extends State note: note.isEmpty ? null : note, ); if (widget.snippet != null) { - _provider.update(widget.snippet!, snippet); + Providers.snippet.update(widget.snippet!, snippet); } else { - _provider.add(snippet); + Providers.snippet.add(snippet); } context.pop(); }, @@ -135,9 +127,9 @@ class _SnippetEditPageState extends State _tags = p0; }), s: _s, - allTags: [..._provider.tags], + allTags: [...Providers.server.tags], onRenameTag: (old, n) => setState(() { - _provider.renameTag(old, n); + Providers.server.renameTag(old, n); }), ), Input( diff --git a/lib/view/page/snippet/list.dart b/lib/view/page/snippet/list.dart index a7638f71..d0f0721d 100644 --- a/lib/view/page/snippet/list.dart +++ b/lib/view/page/snippet/list.dart @@ -3,14 +3,13 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:provider/provider.dart'; import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/order.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/store.dart'; import '../../../core/utils/misc.dart'; import '../../../data/model/server/server.dart'; import '../../../data/model/server/snippet.dart'; -import '../../../data/provider/server.dart'; import '../../../data/res/ui.dart'; -import '../../../locator.dart'; import '../../widget/tag.dart'; import '/core/route.dart'; import '/data/provider/snippet.dart'; @@ -130,19 +129,18 @@ class _SnippetListPageState extends State { } Future _runSnippet(Snippet snippet) async { - final provider = locator(); final servers = await showDialog>( context: context, builder: (_) => TagPicker( - items: provider.servers.values.toList(), - tags: provider.tags.toSet(), + items: Providers.server.servers.values.toList(), + tags: Providers.server.tags.toSet(), ), ); if (servers == null) { return; } final ids = servers.map((e) => e.spi.id).toList(); - final results = await provider.runSnippetsOnMulti(ids, [snippet]); + final results = await Providers.server.runSnippetsMulti(ids, [snippet]); if (results.isNotEmpty) { // SERVER_NAME: RESULT final result = Map.fromIterables( diff --git a/lib/view/page/ssh_term.dart b/lib/view/page/ssh_term.dart index 871bfcfb..44a66afa 100644 --- a/lib/view/page/ssh_term.dart +++ b/lib/view/page/ssh_term.dart @@ -37,7 +37,7 @@ class SSHPage extends StatefulWidget { } class _SSHPageState extends State { - final _keyboard = locator(); + final _keyboard = locator(); late final _terminal = Terminal(inputHandler: _keyboard); final TerminalController _terminalController = TerminalController(); final List> _virtKeysList = []; @@ -146,7 +146,7 @@ class _SSHPageState extends State { child: Container( color: _terminalTheme.background, height: _virtKeysHeight, - child: Consumer( + child: Consumer( builder: (_, __, ___) => _buildVirtualKey(), ), ), diff --git a/lib/view/page/storage/local.dart b/lib/view/page/storage/local.dart index da28548e..72f159f9 100644 --- a/lib/view/page/storage/local.dart +++ b/lib/view/page/storage/local.dart @@ -6,10 +6,8 @@ import 'package:toolbox/core/extension/context/common.dart'; import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/context/snackbar.dart'; import 'package:toolbox/data/model/sftp/req.dart'; -import 'package:toolbox/data/provider/server.dart'; -import 'package:toolbox/data/provider/sftp.dart'; import 'package:toolbox/data/res/misc.dart'; -import 'package:toolbox/locator.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/view/widget/input_field.dart'; import 'package:toolbox/view/widget/picker.dart'; import 'package:toolbox/view/widget/round_rect_card.dart'; @@ -284,8 +282,7 @@ class _LocalStoragePageState extends State { title: Text(_s.upload), onTap: () async { context.pop(); - final serverProvider = locator(); - final ids = serverProvider.serverOrder; + final ids = Providers.server.serverOrder; var idx = 0; await context.showRoundDialog( title: Text(_s.server), @@ -299,7 +296,7 @@ class _LocalStoragePageState extends State { ], ); final id = ids[idx]; - final spi = serverProvider.servers[id]?.spi; + final spi = Providers.server.servers[id]?.spi; if (spi == null) { return; } @@ -310,7 +307,7 @@ class _LocalStoragePageState extends State { if (remotePath == null) { return; } - locator().add(SftpReq( + Providers.sftp.add(SftpReq( spi, '$remotePath/$fileName', file.absolute.path, diff --git a/lib/view/page/storage/sftp.dart b/lib/view/page/storage/sftp.dart index 01f54482..ae898966 100644 --- a/lib/view/page/storage/sftp.dart +++ b/lib/view/page/storage/sftp.dart @@ -10,6 +10,7 @@ import 'package:toolbox/core/extension/context/snackbar.dart'; import 'package:toolbox/core/extension/sftpfile.dart'; import 'package:toolbox/data/res/logger.dart'; import 'package:toolbox/data/res/misc.dart'; +import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/view/widget/round_rect_card.dart'; @@ -22,11 +23,8 @@ import '../../../data/model/server/server_private_info.dart'; import '../../../data/model/sftp/absolute_path.dart'; import '../../../data/model/sftp/browser_status.dart'; import '../../../data/model/sftp/req.dart'; -import '../../../data/provider/server.dart'; -import '../../../data/provider/sftp.dart'; import '../../../data/res/path.dart'; import '../../../data/res/ui.dart'; -import '../../../locator.dart'; import '../../widget/custom_appbar.dart'; import '../../widget/fade_in.dart'; import '../../widget/input_field.dart'; @@ -51,8 +49,6 @@ class SftpPage extends StatefulWidget { class _SftpPageState extends State with AfterLayoutMixin { final SftpBrowserStatus _status = SftpBrowserStatus(); - final _sftp = locator(); - late S _s; SSHClient? _client; @@ -66,8 +62,7 @@ class _SftpPageState extends State with AfterLayoutMixin { @override void initState() { super.initState(); - final serverProvider = locator(); - _client = serverProvider.servers[widget.spi.id]?.client; + _client = Providers.server.servers[widget.spi.id]?.client; } @override @@ -184,7 +179,7 @@ class _SftpPageState extends State with AfterLayoutMixin { context.showSnackBar('remote path is null'); return; } - _sftp.add( + Providers.sftp.add( SftpReq( widget.spi, '$remotePath/${path.split('/').last}', @@ -382,14 +377,15 @@ class _SftpPageState extends State with AfterLayoutMixin { localPath, SftpReqType.download, ); - _sftp.add(req, completer: completer); + Providers.sftp.add(req, completer: completer); context.showLoadingDialog(); await completer.future; context.pop(); final result = await AppRoute.editor(path: localPath).go(context); if (result != null && result) { - _sftp.add(SftpReq(req.spi, remotePath, localPath, SftpReqType.upload)); + Providers.sftp + .add(SftpReq(req.spi, remotePath, localPath, SftpReqType.upload)); context.showSnackBar(_s.added2List); } } @@ -408,7 +404,7 @@ class _SftpPageState extends State with AfterLayoutMixin { context.pop(); final remotePath = _getRemotePath(name); - _sftp.add( + Providers.sftp.add( SftpReq( widget.spi, remotePath, diff --git a/lib/view/page/storage/sftp_mission.dart b/lib/view/page/storage/sftp_mission.dart index 7e04500b..761b800e 100644 --- a/lib/view/page/storage/sftp_mission.dart +++ b/lib/view/page/storage/sftp_mission.dart @@ -5,7 +5,7 @@ import 'package:toolbox/core/extension/context/common.dart'; import 'package:toolbox/core/extension/datetime.dart'; import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/route.dart'; -import 'package:toolbox/locator.dart'; +import 'package:toolbox/data/res/provider.dart'; import '../../../core/extension/numx.dart'; import '../../../core/utils/misc.dart'; @@ -149,7 +149,7 @@ class _SftpMissionPageState extends State { actions: [ TextButton( onPressed: () { - locator().cancel(id); + Providers.sftp.cancel(id); context.pop(); }, child: Text(_s.ok), diff --git a/lib/view/widget/server_func_btns.dart b/lib/view/widget/server_func_btns.dart index 3b684082..137a7e6e 100644 --- a/lib/view/widget/server_func_btns.dart +++ b/lib/view/widget/server_func_btns.dart @@ -9,6 +9,7 @@ import 'package:toolbox/core/extension/ssh_client.dart'; import 'package:toolbox/core/extension/uint8list.dart'; import 'package:toolbox/data/model/pkg/manager.dart'; import 'package:toolbox/data/model/server/dist.dart'; +import 'package:toolbox/data/res/provider.dart'; import '../../core/route.dart'; import '../../core/utils/misc.dart'; @@ -18,9 +19,6 @@ import '../../data/model/app/menu.dart'; import '../../data/model/pkg/upgrade_info.dart'; import '../../data/model/server/server_private_info.dart'; import '../../data/model/server/snippet.dart'; -import '../../data/provider/server.dart'; -import '../../data/provider/snippet.dart'; -import '../../locator.dart'; import 'popup_menu.dart'; import 'tag.dart'; @@ -102,19 +100,17 @@ void _onTapMoreBtns( ); break; case ServerTabMenuType.snippet: - final provider = locator(); final snippets = await showDialog>( context: context, builder: (_) => TagPicker( - items: provider.snippets, - tags: provider.tags.toSet(), + items: Providers.snippet.snippets, + tags: Providers.server.tags.toSet(), ), ); if (snippets == null) { return; } - final result = - await locator().runSnippets(spi.id, snippets); + final result = await Providers.server.runSnippets(spi.id, snippets); if (result != null && result.isNotEmpty) { context.showRoundDialog( title: Text(s.result), @@ -196,7 +192,7 @@ Future _gotoSSH( } bool _checkClient(BuildContext context, String id, String msg) { - final server = locator().servers[id]; + final server = Providers.server.servers[id]; if (server == null || server.client == null) { context.showSnackBar(msg); return false; @@ -205,7 +201,7 @@ bool _checkClient(BuildContext context, String id, String msg) { } Future _onPkg(BuildContext context, S s, ServerPrivateInfo spi) async { - final server = locator().servers[spi.id]; + final server = spi.findServer; if (server == null) { context.showSnackBar(s.noClient); return; diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 0a1bd111..44874021 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -476,9 +476,9 @@ baseConfigurationReference = C1C758C41C4E208965A68933 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 550; + CURRENT_PROJECT_VERSION = 551; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.550; + MARKETING_VERSION = 1.0.551; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -491,9 +491,9 @@ baseConfigurationReference = 15AF97DF993E8968098D6EBE /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 550; + CURRENT_PROJECT_VERSION = 551; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.550; + MARKETING_VERSION = 1.0.551; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -506,9 +506,9 @@ baseConfigurationReference = 7CFA7DE7FABA75685DFB6948 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 550; + CURRENT_PROJECT_VERSION = 551; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.550; + MARKETING_VERSION = 1.0.551; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0;