new: Providers

This commit is contained in:
lollipopkit
2023-09-14 15:13:11 +08:00
parent eb158e63a2
commit c07958fa73
29 changed files with 206 additions and 218 deletions

View File

@@ -472,7 +472,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 550; CURRENT_PROJECT_VERSION = 551;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -480,7 +480,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.550; MARKETING_VERSION = 1.0.551;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -604,7 +604,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/RunnerDebug.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/RunnerDebug.entitlements;
CURRENT_PROJECT_VERSION = 550; CURRENT_PROJECT_VERSION = 551;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -612,7 +612,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.550; MARKETING_VERSION = 1.0.551;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -630,7 +630,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 550; CURRENT_PROJECT_VERSION = 551;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -638,7 +638,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.550; MARKETING_VERSION = 1.0.551;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -659,7 +659,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 550; CURRENT_PROJECT_VERSION = 551;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@@ -672,7 +672,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.0.550; MARKETING_VERSION = 1.0.551;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
@@ -698,7 +698,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 550; CURRENT_PROJECT_VERSION = 551;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@@ -711,7 +711,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.0.550; MARKETING_VERSION = 1.0.551;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -734,7 +734,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 550; CURRENT_PROJECT_VERSION = 551;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@@ -747,7 +747,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.0.550; MARKETING_VERSION = 1.0.551;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";

View File

@@ -1,11 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:toolbox/core/extension/context/common.dart'; import 'package:toolbox/core/extension/context/common.dart';
import 'package:toolbox/data/res/provider.dart';
import '../../../data/model/server/snippet.dart'; import '../../../data/model/server/snippet.dart';
import '../../../data/provider/snippet.dart';
import '../../../data/res/ui.dart'; import '../../../data/res/ui.dart';
import '../../../locator.dart';
import '../../../view/widget/input_field.dart'; import '../../../view/widget/input_field.dart';
import '../../../view/widget/picker.dart'; import '../../../view/widget/picker.dart';
import '../../route.dart'; import '../../route.dart';
@@ -59,8 +58,7 @@ extension DialogX on BuildContext {
S s, S s,
void Function(Snippet s) onSelected, void Function(Snippet s) onSelected,
) { ) {
final provider = locator<SnippetProvider>(); if (Providers.snippet.snippets.isEmpty) {
if (provider.snippets.isEmpty) {
showRoundDialog( showRoundDialog(
child: Text(s.noSavedSnippet), child: Text(s.noSavedSnippet),
actions: [ actions: [
@@ -80,12 +78,12 @@ extension DialogX on BuildContext {
return; return;
} }
var snippet = provider.snippets.first; var snippet = Providers.snippet.snippets.first;
showRoundDialog( showRoundDialog(
title: Text(s.choose), title: Text(s.choose),
child: Picker( child: Picker(
items: provider.snippets.map((e) => Text(e.name)).toList(), items: Providers.snippet.snippets.map((e) => Text(e.name)).toList(),
onSelected: (idx) => snippet = provider.snippets[idx], onSelected: (idx) => snippet = Providers.snippet.snippets[idx],
), ),
actions: [ actions: [
TextButton( TextButton(

View File

@@ -10,8 +10,8 @@ import 'package:toolbox/core/extension/context/snackbar.dart';
import 'package:toolbox/data/model/app/update.dart'; import 'package:toolbox/data/model/app/update.dart';
import 'package:toolbox/data/res/logger.dart'; import 'package:toolbox/data/res/logger.dart';
import 'package:toolbox/data/res/path.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/res/build_data.dart';
import '../data/service/app.dart'; import '../data/service/app.dart';
import '../locator.dart'; import '../locator.dart';
@@ -39,7 +39,7 @@ Future<void> doUpdate(BuildContext context, {bool force = false}) async {
return; return;
} }
locator<AppProvider>().newestBuild = newest; Providers.app.newestBuild = newest;
if (!force && newest <= BuildData.build) { if (!force && newest <= BuildData.build) {
Loggers.app.info('Update ignored: ${BuildData.build} >= $newest'); Loggers.app.info('Update ignored: ${BuildData.build} >= $newest');

View File

@@ -6,13 +6,10 @@ import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:plain_notification_token/plain_notification_token.dart'; import 'package:plain_notification_token/plain_notification_token.dart';
import 'package:share_plus/share_plus.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'; import 'platform.dart';
final _app = locator<AppProvider>();
Future<bool> shareFiles(BuildContext context, List<String> filePaths) async { Future<bool> shareFiles(BuildContext context, List<String> filePaths) async {
for (final filePath in filePaths) { for (final filePath in filePaths) {
if (!await File(filePath).exists()) { if (!await File(filePath).exists()) {
@@ -25,10 +22,10 @@ Future<bool> shareFiles(BuildContext context, List<String> filePaths) async {
} else { } else {
text = '${filePaths.length} ${S.of(context)!.files}'; text = '${filePaths.length} ${S.of(context)!.files}';
} }
_app.moveBg = false; Providers.app.moveBg = false;
// ignore: deprecated_member_use // ignore: deprecated_member_use
await Share.shareFiles(filePaths, subject: 'ServerBox -> $text'); await Share.shareFiles(filePaths, subject: 'ServerBox -> $text');
_app.moveBg = true; Providers.app.moveBg = true;
return filePaths.isNotEmpty; return filePaths.isNotEmpty;
} }
@@ -37,9 +34,9 @@ void copy2Clipboard(String text) {
} }
Future<String?> pickOneFile() async { Future<String?> pickOneFile() async {
_app.moveBg = false; Providers.app.moveBg = false;
final result = await FilePicker.platform.pickFiles(type: FileType.any); final result = await FilePicker.platform.pickFiles(type: FileType.any);
_app.moveBg = true; Providers.app.moveBg = true;
return result?.files.single.path; return result?.files.single.path;
} }

View File

@@ -1,4 +1,6 @@
import 'package:hive_flutter/hive_flutter.dart'; 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'; import '../app/error.dart';
@@ -68,6 +70,8 @@ class ServerPrivateInfo {
return data; return data;
} }
Server? get findServer => Providers.server.servers[id];
bool shouldReconnect(ServerPrivateInfo old) { bool shouldReconnect(ServerPrivateInfo old) {
return id != old.id || return id != old.id ||
pwd != old.pwd || pwd != old.pwd ||

View File

@@ -325,7 +325,7 @@ class ServerProvider extends ChangeNotifier {
return await client.run(snippets.map((e) => e.script).join('&&')).string; return await client.run(snippets.map((e) => e.script).join('&&')).string;
} }
Future<List<String?>> runSnippetsOnMulti( Future<List<String?>> runSnippetsMulti(
List<String> ids, List<String> ids,
List<Snippet> snippets, List<Snippet> snippets,
) async { ) async {

View File

@@ -2,8 +2,8 @@ import 'package:flutter/widgets.dart';
import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/data/res/store.dart';
import 'package:xterm/core.dart'; import 'package:xterm/core.dart';
class VirtualKeyboard extends TerminalInputHandler with ChangeNotifier { class VirtKeyProvider extends TerminalInputHandler with ChangeNotifier {
VirtualKeyboard(); VirtKeyProvider();
bool _ctrl = false; bool _ctrl = false;
bool get ctrl => _ctrl; bool get ctrl => _ctrl;

View File

@@ -2,9 +2,9 @@
class BuildData { class BuildData {
static const String name = "ServerBox"; 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 engine = "3.13.2";
static const String buildAt = "2023-09-13 15:19:48"; static const String buildAt = "2023-09-13 16:03:39";
static const int modifications = 45; static const int modifications = 31;
static const int script = 15; static const int script = 15;
} }

View File

@@ -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<AppProvider>();
static final debug = locator<DebugProvider>();
static final docker = locator<DockerProvider>();
static final key = locator<PrivateKeyProvider>();
static final server = locator<ServerProvider>();
static final sftp = locator<SftpProvider>();
static final snippet = locator<SnippetProvider>();
static final virtKey = locator<VirtKeyProvider>();
}

View File

@@ -27,7 +27,7 @@ void _setupLocatorForProviders() {
locator.registerSingleton(DebugProvider()); locator.registerSingleton(DebugProvider());
locator.registerSingleton(DockerProvider()); locator.registerSingleton(DockerProvider());
locator.registerSingleton(ServerProvider()); locator.registerSingleton(ServerProvider());
locator.registerSingleton(VirtualKeyboard()); locator.registerSingleton(VirtKeyProvider());
locator.registerSingleton(SnippetProvider()); locator.registerSingleton(SnippetProvider());
locator.registerSingleton(PrivateKeyProvider()); locator.registerSingleton(PrivateKeyProvider());
locator.registerSingleton(SftpProvider()); locator.registerSingleton(SftpProvider());

View File

@@ -6,6 +6,7 @@ import 'package:logging/logging.dart';
import 'package:macos_window_utils/window_manipulator.dart'; import 'package:macos_window_utils/window_manipulator.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:toolbox/data/res/provider.dart';
import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/data/res/store.dart';
import 'app.dart'; import 'app.dart';
@@ -32,8 +33,6 @@ import 'locator.dart';
import 'view/widget/custom_appbar.dart'; import 'view/widget/custom_appbar.dart';
import 'view/widget/rebuild.dart'; import 'view/widget/rebuild.dart';
DebugProvider? _debug;
Future<void> main() async { Future<void> main() async {
_runInZone(() async { _runInZone(() async {
await initApp(); await initApp();
@@ -45,7 +44,7 @@ Future<void> main() async {
ChangeNotifierProvider(create: (_) => locator<DockerProvider>()), ChangeNotifierProvider(create: (_) => locator<DockerProvider>()),
ChangeNotifierProvider(create: (_) => locator<ServerProvider>()), ChangeNotifierProvider(create: (_) => locator<ServerProvider>()),
ChangeNotifierProvider(create: (_) => locator<SnippetProvider>()), ChangeNotifierProvider(create: (_) => locator<SnippetProvider>()),
ChangeNotifierProvider(create: (_) => locator<VirtualKeyboard>()), ChangeNotifierProvider(create: (_) => locator<VirtKeyProvider>()),
ChangeNotifierProvider(create: (_) => locator<PrivateKeyProvider>()), ChangeNotifierProvider(create: (_) => locator<PrivateKeyProvider>()),
ChangeNotifierProvider(create: (_) => locator<SftpProvider>()), ChangeNotifierProvider(create: (_) => locator<SftpProvider>()),
], ],
@@ -77,9 +76,6 @@ Future<void> initApp() async {
// Base of all data. // Base of all data.
await _initHive(); await _initHive();
await setupLocator(); await setupLocator();
// Setup [DebugProvider] first to catch all logs.
_debug = locator<DebugProvider>();
_setupLogger(); _setupLogger();
_setupProviders(); _setupProviders();
@@ -101,8 +97,8 @@ Future<void> initApp() async {
} }
void _setupProviders() { void _setupProviders() {
locator<SnippetProvider>().loadData(); Providers.snippet.loadData();
locator<PrivateKeyProvider>().loadData(); Providers.key.loadData();
} }
Future<void> _initHive() async { Future<void> _initHive() async {
@@ -119,14 +115,14 @@ void _setupLogger() {
Logger.root.level = Level.ALL; Logger.root.level = Level.ALL;
Logger.root.onRecord.listen((record) { Logger.root.onRecord.listen((record) {
var str = '[${record.loggerName}][${record.level.name}]: ${record.message}'; var str = '[${record.loggerName}][${record.level.name}]: ${record.message}';
_debug?.addText(str); Providers.debug.addText(str);
if (record.error != null) { if (record.error != null) {
str += '\n${record.error}'; str += '\n${record.error}';
_debug?.addMultiline(record.error.toString(), Colors.red); Providers.debug.addMultiline(record.error.toString(), Colors.red);
} }
if (record.stackTrace != null) { if (record.stackTrace != null) {
str += '\n${record.stackTrace}'; str += '\n${record.stackTrace}';
_debug?.addMultiline(record.stackTrace.toString(), Colors.white); Providers.debug.addMultiline(record.stackTrace.toString(), Colors.white);
} }
// ignore: avoid_print // ignore: avoid_print
print(str); print(str);

View File

@@ -6,18 +6,17 @@ import 'package:toolbox/core/extension/context/dialog.dart';
import 'package:toolbox/core/extension/context/snackbar.dart'; import 'package:toolbox/core/extension/context/snackbar.dart';
import 'package:toolbox/core/route.dart'; import 'package:toolbox/core/route.dart';
import 'package:toolbox/data/model/docker/image.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/data/res/store.dart';
import 'package:toolbox/view/widget/input_field.dart'; import 'package:toolbox/view/widget/input_field.dart';
import '../../data/model/docker/ps.dart'; import '../../data/model/docker/ps.dart';
import '../../data/model/server/server_private_info.dart'; import '../../data/model/server/server_private_info.dart';
import '../../data/provider/docker.dart'; import '../../data/provider/docker.dart';
import '../../data/provider/server.dart';
import '../../data/model/app/error.dart'; import '../../data/model/app/error.dart';
import '../../data/model/app/menu.dart'; import '../../data/model/app/menu.dart';
import '../../data/res/ui.dart'; import '../../data/res/ui.dart';
import '../../data/res/url.dart'; import '../../data/res/url.dart';
import '../../locator.dart';
import '../widget/custom_appbar.dart'; import '../widget/custom_appbar.dart';
import '../widget/popup_menu.dart'; import '../widget/popup_menu.dart';
import '../widget/round_rect_card.dart'; import '../widget/round_rect_card.dart';
@@ -33,14 +32,13 @@ class DockerManagePage extends StatefulWidget {
} }
class _DockerManagePageState extends State<DockerManagePage> { class _DockerManagePageState extends State<DockerManagePage> {
final _docker = locator<DockerProvider>();
final _textController = TextEditingController(); final _textController = TextEditingController();
late S _s; late S _s;
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
_docker.clear(); Providers.docker.clear();
_textController.dispose(); _textController.dispose();
} }
@@ -53,17 +51,19 @@ class _DockerManagePageState extends State<DockerManagePage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
final client = locator<ServerProvider>().servers[widget.spi.id]?.client; final client = widget.spi.findServer?.client;
if (client == null) { if (client == null) {
return; return;
} }
_docker.init( Providers.docker
..init(
client, client,
widget.spi.user, widget.spi.user,
(user) async => await context.showPwdDialog(user), (user) async => await context.showPwdDialog(user),
widget.spi.id, widget.spi.id,
context, context,
); )
..refresh();
} }
@override @override
@@ -77,7 +77,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
IconButton( IconButton(
onPressed: () async { onPressed: () async {
context.showLoadingDialog(); context.showLoadingDialog();
await _docker.refresh(); await Providers.docker.refresh();
context.pop(); context.pop();
}, },
icon: const Icon(Icons.refresh), icon: const Icon(Icons.refresh),
@@ -85,7 +85,8 @@ class _DockerManagePageState extends State<DockerManagePage> {
], ],
), ),
body: _buildMain(), body: _buildMain(),
floatingActionButton: _docker.error == null ? _buildFAB() : null, floatingActionButton:
Providers.docker.error == null ? _buildFAB() : null,
); );
}); });
} }
@@ -162,7 +163,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
onPressed: () async { onPressed: () async {
context.pop(); context.pop();
context.showLoadingDialog(); context.showLoadingDialog();
final result = await _docker.run(cmd); final result = await Providers.docker.run(cmd);
context.pop(); context.pop();
if (result != null) { if (result != null) {
context.showSnackBar(result.message ?? _s.unknownError); context.showSnackBar(result.message ?? _s.unknownError);
@@ -188,7 +189,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
} }
Widget _buildMain() { Widget _buildMain() {
if (_docker.error != null && _docker.items == null) { if (Providers.docker.error != null && Providers.docker.items == null) {
return SizedBox.expand( return SizedBox.expand(
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
@@ -199,22 +200,17 @@ class _DockerManagePageState extends State<DockerManagePage> {
size: 37, size: 37,
), ),
const SizedBox(height: 27), const SizedBox(height: 27),
Text(_docker.error?.message ?? _s.unknownError), Text(Providers.docker.error?.message ?? _s.unknownError),
const SizedBox(height: 27), const SizedBox(height: 27),
Padding( Padding(
padding: const EdgeInsets.all(17), padding: const EdgeInsets.all(17),
child: _buildSolution(_docker.error!), child: _buildSolution(Providers.docker.error!),
) )
], ],
), ),
); );
} }
if (_docker.items == null || _docker.images == null) { if (Providers.docker.items == null || Providers.docker.images == null) {
Future.delayed(const Duration(milliseconds: 37), () {
if (mounted) {
_docker.refresh();
}
});
return UIs.centerLoading; return UIs.centerLoading;
} }
@@ -236,12 +232,12 @@ class _DockerManagePageState extends State<DockerManagePage> {
ListTile( ListTile(
title: Text(_s.imagesList), title: Text(_s.imagesList),
subtitle: Text( subtitle: Text(
_s.dockerImagesFmt(_docker.images!.length), _s.dockerImagesFmt(Providers.docker.images!.length),
style: UIs.textGrey, style: UIs.textGrey,
), ),
), ),
]; ];
items.addAll(_docker.images!.map(_buildImageItem)); items.addAll(Providers.docker.images!.map(_buildImageItem));
return Column(children: items); return Column(children: items);
} }
@@ -270,7 +266,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
TextButton( TextButton(
onPressed: () async { onPressed: () async {
context.pop(); context.pop();
final result = await _docker.run( final result = await Providers.docker.run(
'docker rmi ${e.id} -f', 'docker rmi ${e.id} -f',
); );
if (result != null) { if (result != null) {
@@ -284,7 +280,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
} }
Widget _buildLoading() { Widget _buildLoading() {
if (_docker.runLog == null) return UIs.placeholder; if (Providers.docker.runLog == null) return UIs.placeholder;
return Padding( return Padding(
padding: const EdgeInsets.all(17), padding: const EdgeInsets.all(17),
child: Column( child: Column(
@@ -293,7 +289,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
child: CircularProgressIndicator(), child: CircularProgressIndicator(),
), ),
UIs.height13, UIs.height13,
Text(_docker.runLog ?? '...'), Text(Providers.docker.runLog ?? '...'),
], ],
), ),
); );
@@ -334,8 +330,8 @@ class _DockerManagePageState extends State<DockerManagePage> {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text(_docker.edition ?? _s.unknown), Text(Providers.docker.edition ?? _s.unknown),
Text(_docker.version ?? _s.unknown), Text(Providers.docker.version ?? _s.unknown),
], ],
), ),
); );
@@ -346,12 +342,12 @@ class _DockerManagePageState extends State<DockerManagePage> {
ListTile( ListTile(
title: Text(_s.containerStatus), title: Text(_s.containerStatus),
subtitle: Text( subtitle: Text(
_buildPsCardSubtitle(_docker.items!), _buildPsCardSubtitle(Providers.docker.items!),
style: UIs.textGrey, style: UIs.textGrey,
), ),
), ),
]; ];
items.addAll(_docker.items!.map(_buildPsItem)); items.addAll(Providers.docker.items!.map(_buildPsItem));
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: items, children: items,
@@ -387,7 +383,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
onPressed: () async { onPressed: () async {
context.pop(); context.pop();
context.showLoadingDialog(); context.showLoadingDialog();
await _docker.delete(dItem.containerId); await Providers.docker.delete(dItem.containerId);
context.pop(); context.pop();
}, },
child: Text(_s.ok), child: Text(_s.ok),
@@ -397,17 +393,17 @@ class _DockerManagePageState extends State<DockerManagePage> {
break; break;
case DockerMenuType.start: case DockerMenuType.start:
context.showLoadingDialog(); context.showLoadingDialog();
await _docker.start(dItem.containerId); await Providers.docker.start(dItem.containerId);
context.pop(); context.pop();
break; break;
case DockerMenuType.stop: case DockerMenuType.stop:
context.showLoadingDialog(); context.showLoadingDialog();
await _docker.stop(dItem.containerId); await Providers.docker.stop(dItem.containerId);
context.pop(); context.pop();
break; break;
case DockerMenuType.restart: case DockerMenuType.restart:
context.showLoadingDialog(); context.showLoadingDialog();
await _docker.restart(dItem.containerId); await Providers.docker.restart(dItem.containerId);
context.pop(); context.pop();
break; break;
case DockerMenuType.logs: case DockerMenuType.logs:
@@ -456,7 +452,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
Widget _buildEditHost() { Widget _buildEditHost() {
final children = <Widget>[]; final children = <Widget>[];
if (_docker.items!.isEmpty && _docker.images!.isEmpty) { if (Providers.docker.items!.isEmpty && Providers.docker.images!.isEmpty) {
children.add(Padding( children.add(Padding(
padding: const EdgeInsets.fromLTRB(17, 17, 17, 0), padding: const EdgeInsets.fromLTRB(17, 17, 17, 0),
child: Text( child: Text(
@@ -499,6 +495,6 @@ class _DockerManagePageState extends State<DockerManagePage> {
void _onSaveDockerHost(String val) { void _onSaveDockerHost(String val) {
context.pop(); context.pop();
Stores.docker.put(widget.spi.id, val.trim()); Stores.docker.put(widget.spi.id, val.trim());
_docker.refresh(); Providers.docker.refresh();
} }
} }

View File

@@ -10,9 +10,9 @@ import 'package:provider/provider.dart';
import 'package:toolbox/core/route.dart'; import 'package:toolbox/core/route.dart';
import 'package:toolbox/data/model/server/disk.dart'; import 'package:toolbox/data/model/server/disk.dart';
import 'package:toolbox/data/provider/server.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/store.dart';
import 'package:toolbox/data/res/ui.dart'; import 'package:toolbox/data/res/ui.dart';
import 'package:toolbox/locator.dart';
import '../../core/analysis.dart'; import '../../core/analysis.dart';
import '../../core/update.dart'; import '../../core/update.dart';
@@ -38,7 +38,6 @@ class _FullScreenPageState extends State<FullScreenPage> with AfterLayoutMixin {
late int _rotateQuarter; late int _rotateQuarter;
final _pageController = PageController(initialPage: 0); final _pageController = PageController(initialPage: 0);
final _serverProvider = locator<ServerProvider>();
@override @override
void initState() { void initState() {
@@ -372,8 +371,8 @@ class _FullScreenPageState extends State<FullScreenPage> with AfterLayoutMixin {
doUpdate(context); doUpdate(context);
} }
await GetIt.I.allReady(); await GetIt.I.allReady();
await _serverProvider.loadLocalData(); await Providers.server.loadLocalData();
await _serverProvider.refreshData(); await Providers.server.refreshData();
if (!Analysis.enabled) { if (!Analysis.enabled) {
await Analysis.init(); await Analysis.init();
} }

View File

@@ -7,6 +7,7 @@ import 'package:get_it/get_it.dart';
import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/context/dialog.dart';
import 'package:toolbox/data/res/github_id.dart'; import 'package:toolbox/data/res/github_id.dart';
import 'package:toolbox/data/res/logger.dart'; import 'package:toolbox/data/res/logger.dart';
import 'package:toolbox/data/res/provider.dart';
import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/data/res/store.dart';
import '../../core/analysis.dart'; import '../../core/analysis.dart';
@@ -16,13 +17,10 @@ import '../../core/utils/platform.dart';
import '../../core/utils/ui.dart'; import '../../core/utils/ui.dart';
import '../../data/model/app/github_id.dart'; import '../../data/model/app/github_id.dart';
import '../../data/model/app/tab.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/build_data.dart';
import '../../data/res/misc.dart'; import '../../data/res/misc.dart';
import '../../data/res/ui.dart'; import '../../data/res/ui.dart';
import '../../data/res/url.dart'; import '../../data/res/url.dart';
import '../../locator.dart';
import '../widget/custom_appbar.dart'; import '../widget/custom_appbar.dart';
import '../widget/round_rect_card.dart'; import '../widget/round_rect_card.dart';
import '../widget/url_text.dart'; import '../widget/url_text.dart';
@@ -40,9 +38,6 @@ class _HomePageState extends State<HomePage>
AutomaticKeepAliveClientMixin, AutomaticKeepAliveClientMixin,
AfterLayoutMixin, AfterLayoutMixin,
WidgetsBindingObserver { WidgetsBindingObserver {
final _serverProvider = locator<ServerProvider>();
final _app = locator<AppProvider>();
late final PageController _pageController; late final PageController _pageController;
final _selectIndex = ValueNotifier(0); final _selectIndex = ValueNotifier(0);
@@ -73,7 +68,7 @@ class _HomePageState extends State<HomePage>
void dispose() { void dispose() {
super.dispose(); super.dispose();
WidgetsBinding.instance.removeObserver(this); WidgetsBinding.instance.removeObserver(this);
_serverProvider.closeServer(); Providers.server.closeServer();
_pageController.dispose(); _pageController.dispose();
} }
@@ -84,20 +79,20 @@ class _HomePageState extends State<HomePage>
switch (state) { switch (state) {
case AppLifecycleState.resumed: case AppLifecycleState.resumed:
if (!_serverProvider.isAutoRefreshOn) { if (!Providers.server.isAutoRefreshOn) {
_serverProvider.startAutoRefresh(); Providers.server.startAutoRefresh();
} }
updateHomeWidget(); updateHomeWidget();
break; break;
case AppLifecycleState.paused: case AppLifecycleState.paused:
// Keep running in background on Android device // Keep running in background on Android device
if (isAndroid && Stores.setting.bgRun.fetch()) { if (isAndroid && Stores.setting.bgRun.fetch()) {
if (_app.moveBg) { if (Providers.app.moveBg) {
Miscs.bgRunChannel.invokeMethod('sendToBackground'); Miscs.bgRunChannel.invokeMethod('sendToBackground');
} }
} else { } else {
_serverProvider.setDisconnected(); Providers.server.setDisconnected();
_serverProvider.stopAutoRefresh(); Providers.server.stopAutoRefresh();
} }
break; break;
default: default:
@@ -148,7 +143,7 @@ class _HomePageState extends State<HomePage>
return IconButton( return IconButton(
icon: const Icon(Icons.refresh, size: 23), icon: const Icon(Icons.refresh, size: 23),
tooltip: 'Refresh', tooltip: 'Refresh',
onPressed: () => _serverProvider.refreshData(onlyFailed: true), onPressed: () => Providers.server.refreshData(onlyFailed: true),
); );
}, },
), ),
@@ -346,8 +341,8 @@ class _HomePageState extends State<HomePage>
} }
updateHomeWidget(); updateHomeWidget();
await GetIt.I.allReady(); await GetIt.I.allReady();
await _serverProvider.loadLocalData(); await Providers.server.loadLocalData();
await _serverProvider.refreshData(); await Providers.server.refreshData();
if (!Analysis.enabled) { if (!Analysis.enabled) {
Analysis.init(); Analysis.init();
} }

View File

@@ -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/common.dart';
import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/context/dialog.dart';
import 'package:toolbox/core/extension/context/snackbar.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/core/utils/misc.dart';
import 'package:toolbox/data/res/provider.dart';
import 'package:toolbox/view/widget/value_notifier.dart'; import 'package:toolbox/view/widget/value_notifier.dart';
import '../../core/extension/uint8list.dart';
import '../../data/model/server/ping_result.dart'; import '../../data/model/server/ping_result.dart';
import '../../data/provider/server.dart';
import '../../data/res/color.dart'; import '../../data/res/color.dart';
import '../../data/res/ui.dart'; import '../../data/res/ui.dart';
import '../../locator.dart';
import '../widget/input_field.dart'; import '../widget/input_field.dart';
import '../widget/round_rect_card.dart'; import '../widget/round_rect_card.dart';
@@ -32,7 +31,6 @@ class _PingPageState extends State<PingPage>
with AutomaticKeepAliveClientMixin, AfterLayoutMixin { with AutomaticKeepAliveClientMixin, AfterLayoutMixin {
late TextEditingController _textEditingController; late TextEditingController _textEditingController;
final _results = ValueNotifier(<PingResult>[]); final _results = ValueNotifier(<PingResult>[]);
final _serverProvider = locator<ServerProvider>();
late S _s; late S _s;
bool get isInit => _results.value.isEmpty; bool get isInit => _results.value.isEmpty;
@@ -176,7 +174,7 @@ class _PingPageState extends State<PingPage>
return; return;
} }
if (_serverProvider.servers.isEmpty) { if (Providers.server.servers.isEmpty) {
context.showSnackBar(_s.pingNoServer); context.showSnackBar(_s.pingNoServer);
return; return;
} }
@@ -187,7 +185,7 @@ class _PingPageState extends State<PingPage>
return; return;
} }
await Future.wait(_serverProvider.servers.values.map((e) async { await Future.wait(Providers.server.servers.values.map((e) async {
if (e.client == null) { if (e.client == null) {
return; return;
} }
@@ -207,9 +205,9 @@ class _PingPageState extends State<PingPage>
@override @override
Future<FutureOr<void>> afterFirstLayout(BuildContext context) async { Future<FutureOr<void>> afterFirstLayout(BuildContext context) async {
if (_serverProvider.servers.isEmpty) { if (Providers.server.servers.isEmpty) {
await _serverProvider.loadLocalData(); await Providers.server.loadLocalData();
await _serverProvider.refreshData(); await Providers.server.refreshData();
} }
} }
} }

View File

@@ -10,13 +10,12 @@ import 'package:toolbox/core/extension/context/snackbar.dart';
import 'package:toolbox/core/extension/numx.dart'; import 'package:toolbox/core/extension/numx.dart';
import 'package:toolbox/core/utils/misc.dart'; import 'package:toolbox/core/utils/misc.dart';
import 'package:toolbox/data/res/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 'package:toolbox/view/widget/input_field.dart';
import '../../../core/utils/server.dart'; import '../../../core/utils/server.dart';
import '../../../data/model/server/private_key_info.dart'; import '../../../data/model/server/private_key_info.dart';
import '../../../data/provider/private_key.dart';
import '../../../data/res/ui.dart'; import '../../../data/res/ui.dart';
import '../../../locator.dart';
import '../../widget/custom_appbar.dart'; import '../../widget/custom_appbar.dart';
const _format = 'text/plain'; const _format = 'text/plain';
@@ -39,7 +38,6 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage> {
final _pwdNode = FocusNode(); final _pwdNode = FocusNode();
late FocusScopeNode _focusScope; late FocusScopeNode _focusScope;
final _provider = locator<PrivateKeyProvider>();
late S _s; late S _s;
Widget? _loading; Widget? _loading;
@@ -99,7 +97,7 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage> {
actions: [ actions: [
TextButton( TextButton(
onPressed: () { onPressed: () {
_provider.delete(widget.pki!); Providers.key.delete(widget.pki!);
context.pop(); context.pop();
context.pop(); context.pop();
}, },
@@ -139,9 +137,9 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage> {
final decrypted = await compute(decyptPem, [key, pwd]); final decrypted = await compute(decyptPem, [key, pwd]);
final pki = PrivateKeyInfo(id: name, key: decrypted); final pki = PrivateKeyInfo(id: name, key: decrypted);
if (widget.pki != null) { if (widget.pki != null) {
_provider.update(widget.pki!, pki); Providers.key.update(widget.pki!, pki);
} else { } else {
_provider.add(pki); Providers.key.add(pki);
} }
} catch (e) { } catch (e) {
context.showSnackBar(e.toString()); context.showSnackBar(e.toString());

View File

@@ -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/context/snackbar.dart';
import 'package:toolbox/core/extension/uint8list.dart'; import 'package:toolbox/core/extension/uint8list.dart';
import 'package:toolbox/core/utils/misc.dart'; import 'package:toolbox/core/utils/misc.dart';
import 'package:toolbox/data/res/provider.dart';
import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/data/res/store.dart';
import '../../data/model/app/shell_func.dart'; import '../../data/model/app/shell_func.dart';
import '../../data/model/server/proc.dart'; import '../../data/model/server/proc.dart';
import '../../data/model/server/server_private_info.dart'; import '../../data/model/server/server_private_info.dart';
import '../../data/provider/server.dart';
import '../../data/res/ui.dart'; import '../../data/res/ui.dart';
import '../../locator.dart';
import '../widget/custom_appbar.dart'; import '../widget/custom_appbar.dart';
import '../widget/round_rect_card.dart'; import '../widget/round_rect_card.dart';
import '../widget/two_line_text.dart'; import '../widget/two_line_text.dart';
@@ -44,12 +43,10 @@ class _ProcessPageState extends State<ProcessPage> {
ProcSortMode _procSortMode = ProcSortMode.cpu; ProcSortMode _procSortMode = ProcSortMode.cpu;
List<ProcSortMode> _sortModes = List.from(ProcSortMode.values); List<ProcSortMode> _sortModes = List.from(ProcSortMode.values);
final _serverProvider = locator<ServerProvider>();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_client = _serverProvider.servers[widget.spi.id]?.client; _client = Providers.server.servers[widget.spi.id]?.client;
final duration = final duration =
Duration(seconds: Stores.setting.serverStatusUpdateInterval.fetch()); Duration(seconds: Stores.setting.serverStatusUpdateInterval.fetch());
_timer = Timer.periodic(duration, (_) => _refresh()); _timer = Timer.periodic(duration, (_) => _refresh());

View File

@@ -4,14 +4,13 @@ import 'package:provider/provider.dart';
import 'package:toolbox/core/extension/context/common.dart'; import 'package:toolbox/core/extension/context/common.dart';
import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/context/dialog.dart';
import 'package:toolbox/core/extension/context/snackbar.dart'; import 'package:toolbox/core/extension/context/snackbar.dart';
import 'package:toolbox/data/res/provider.dart';
import '../../../core/route.dart'; import '../../../core/route.dart';
import '../../../data/model/server/private_key_info.dart'; import '../../../data/model/server/private_key_info.dart';
import '../../../data/model/server/server_private_info.dart'; import '../../../data/model/server/server_private_info.dart';
import '../../../data/provider/private_key.dart'; import '../../../data/provider/private_key.dart';
import '../../../data/provider/server.dart';
import '../../../data/res/ui.dart'; import '../../../data/res/ui.dart';
import '../../../locator.dart';
import '../../widget/custom_appbar.dart'; import '../../widget/custom_appbar.dart';
import '../../widget/input_field.dart'; import '../../widget/input_field.dart';
import '../../widget/round_rect_card.dart'; import '../../widget/round_rect_card.dart';
@@ -43,9 +42,6 @@ class _ServerEditPageState extends State<ServerEditPage> {
late FocusScopeNode _focusScope; late FocusScopeNode _focusScope;
late S _s; late S _s;
final _srvs = locator<ServerProvider>();
final _keys = locator<PrivateKeyProvider>();
final _keyIdx = ValueNotifier<int?>(null); final _keyIdx = ValueNotifier<int?>(null);
final _autoConnect = ValueNotifier(true); final _autoConnect = ValueNotifier(true);
@@ -63,7 +59,7 @@ class _ServerEditPageState extends State<ServerEditPage> {
if (widget.spi?.pubKeyId == null) { if (widget.spi?.pubKeyId == null) {
_passwordController.text = widget.spi?.pwd ?? ''; _passwordController.text = widget.spi?.pwd ?? '';
} else { } else {
_keyIdx.value = _keys.pkis.indexWhere( _keyIdx.value = Providers.key.pkis.indexWhere(
(e) => e.id == widget.spi!.pubKeyId, (e) => e.id == widget.spi!.pubKeyId,
); );
} }
@@ -121,7 +117,7 @@ class _ServerEditPageState extends State<ServerEditPage> {
actions: [ actions: [
TextButton( TextButton(
onPressed: () { onPressed: () {
_srvs.delServer(widget.spi!.id); Providers.server.delServer(widget.spi!.id);
context.pop(); context.pop();
context.pop(true); context.pop(true);
}, },
@@ -190,8 +186,8 @@ class _ServerEditPageState extends State<ServerEditPage> {
tags: _tags, tags: _tags,
onChanged: (p0) => _tags = p0, onChanged: (p0) => _tags = p0,
s: _s, s: _s,
allTags: [..._srvs.tags], allTags: [...Providers.server.tags],
onRenameTag: _srvs.renameTag, onRenameTag: Providers.server.renameTag,
), ),
_buildAuth(), _buildAuth(),
ListTile( ListTile(
@@ -364,7 +360,7 @@ class _ServerEditPageState extends State<ServerEditPage> {
user: _usernameController.text, user: _usernameController.text,
pwd: _passwordController.text.isEmpty ? null : _passwordController.text, pwd: _passwordController.text.isEmpty ? null : _passwordController.text,
pubKeyId: _keyIdx.value != null pubKeyId: _keyIdx.value != null
? _keys.pkis.elementAt(_keyIdx.value!).id ? Providers.key.pkis.elementAt(_keyIdx.value!).id
: null, : null,
tags: _tags, tags: _tags,
alterUrl: _altUrlController.text.isEmpty ? null : _altUrlController.text, alterUrl: _altUrlController.text.isEmpty ? null : _altUrlController.text,
@@ -372,9 +368,9 @@ class _ServerEditPageState extends State<ServerEditPage> {
); );
if (widget.spi == null) { if (widget.spi == null) {
_srvs.addServer(spi); Providers.server.addServer(spi);
} else { } else {
_srvs.updateServer(widget.spi!, spi); Providers.server.updateServer(widget.spi!, spi);
} }
context.pop(); context.pop();

View File

@@ -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/media_queryx.dart';
import 'package:toolbox/core/extension/ssh_client.dart'; import 'package:toolbox/core/extension/ssh_client.dart';
import 'package:toolbox/data/model/app/shell_func.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 'package:toolbox/data/res/store.dart';
import '../../../core/route.dart'; import '../../../core/route.dart';
@@ -21,7 +22,6 @@ import '../../../data/model/server/server_status.dart';
import '../../../data/provider/server.dart'; import '../../../data/provider/server.dart';
import '../../../data/res/color.dart'; import '../../../data/res/color.dart';
import '../../../data/res/ui.dart'; import '../../../data/res/ui.dart';
import '../../../locator.dart';
import '../../widget/round_rect_card.dart'; import '../../widget/round_rect_card.dart';
import '../../widget/server_func_btns.dart'; import '../../widget/server_func_btns.dart';
import '../../widget/tag.dart'; import '../../widget/tag.dart';
@@ -39,7 +39,6 @@ class _ServerPageState extends State<ServerPage>
late S _s; late S _s;
final _flipedCardIds = <String>{}; final _flipedCardIds = <String>{};
final _serverProvider = locator<ServerProvider>();
String? _tag; String? _tag;
bool _useDoubleColumn = false; bool _useDoubleColumn = false;
@@ -96,7 +95,7 @@ class _ServerPageState extends State<ServerPage>
} }
return RefreshIndicator( return RefreshIndicator(
onRefresh: () async => onRefresh: () async =>
await _serverProvider.refreshData(onlyFailed: true), await Providers.server.refreshData(onlyFailed: true),
child: child, child: child,
); );
} }
@@ -308,7 +307,7 @@ class _ServerPageState extends State<ServerPage>
Widget? rightCorner; Widget? rightCorner;
if (!(spi.autoConnect ?? true) && cs == ServerState.disconnected) { if (!(spi.autoConnect ?? true) && cs == ServerState.disconnected) {
rightCorner = InkWell( rightCorner = InkWell(
onTap: () => _serverProvider.refreshData(spi: spi), onTap: () => Providers.server.refreshData(spi: spi),
child: const Padding( child: const Padding(
padding: EdgeInsets.symmetric(horizontal: 7), padding: EdgeInsets.symmetric(horizontal: 7),
child: Icon( child: Icon(
@@ -459,10 +458,10 @@ class _ServerPageState extends State<ServerPage>
@override @override
Future<void> afterFirstLayout(BuildContext context) async { Future<void> afterFirstLayout(BuildContext context) async {
await GetIt.I.allReady(); await GetIt.I.allReady();
if (_serverProvider.servers.isEmpty) { if (Providers.server.servers.isEmpty) {
await _serverProvider.loadLocalData(); await Providers.server.loadLocalData();
} }
_serverProvider.startAutoRefresh(); Providers.server.startAutoRefresh();
} }
List<String> _filterServers(ServerProvider pro) => pro.serverOrder List<String> _filterServers(ServerProvider pro) => pro.serverOrder

View File

@@ -12,6 +12,7 @@ import 'package:toolbox/core/extension/context/snackbar.dart';
import 'package:toolbox/core/extension/locale.dart'; import 'package:toolbox/core/extension/locale.dart';
import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/context/dialog.dart';
import 'package:toolbox/core/extension/stringx.dart'; import 'package:toolbox/core/extension/stringx.dart';
import 'package:toolbox/data/res/provider.dart';
import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/data/res/store.dart';
import '../../../core/persistant_store.dart'; import '../../../core/persistant_store.dart';
@@ -21,12 +22,10 @@ import '../../../core/utils/platform.dart';
import '../../../core/update.dart'; import '../../../core/update.dart';
import '../../../data/model/app/net_view.dart'; import '../../../data/model/app/net_view.dart';
import '../../../data/provider/app.dart'; import '../../../data/provider/app.dart';
import '../../../data/provider/server.dart';
import '../../../data/res/build_data.dart'; import '../../../data/res/build_data.dart';
import '../../../data/res/color.dart'; import '../../../data/res/color.dart';
import '../../../data/res/path.dart'; import '../../../data/res/path.dart';
import '../../../data/res/ui.dart'; import '../../../data/res/ui.dart';
import '../../../locator.dart';
import '../../widget/color_picker.dart'; import '../../widget/color_picker.dart';
import '../../widget/custom_appbar.dart'; import '../../widget/custom_appbar.dart';
import '../../widget/future_widget.dart'; import '../../widget/future_widget.dart';
@@ -52,7 +51,6 @@ class _SettingPageState extends State<SettingPage> {
final _keyboardTypeKey = GlobalKey<PopupMenuButtonState<int>>(); final _keyboardTypeKey = GlobalKey<PopupMenuButtonState<int>>();
final _rotateQuarterKey = GlobalKey<PopupMenuButtonState<int>>(); final _rotateQuarterKey = GlobalKey<PopupMenuButtonState<int>>();
final _netViewTypeKey = GlobalKey<PopupMenuButtonState<NetViewType>>(); final _netViewTypeKey = GlobalKey<PopupMenuButtonState<NetViewType>>();
final _serverProvider = locator<ServerProvider>();
final _setting = Stores.setting; final _setting = Stores.setting;
late S _s; late S _s;
@@ -108,8 +106,8 @@ class _SettingPageState extends State<SettingPage> {
appBar: CustomAppBar( appBar: CustomAppBar(
title: Text(_s.setting), title: Text(_s.setting),
actions: [ actions: [
IconButton( InkWell(
onPressed: () => context.showRoundDialog( onTap: () => context.showRoundDialog(
title: Text(_s.attention), title: Text(_s.attention),
child: Text(_s.sureDelete(_s.all)), child: Text(_s.sureDelete(_s.all)),
actions: [ actions: [
@@ -123,7 +121,26 @@ class _SettingPageState extends State<SettingPage> {
), ),
], ],
), ),
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<SettingPage> {
onSelected: (int val) { onSelected: (int val) {
_updateInterval.value = val; _updateInterval.value = val;
_setting.serverStatusUpdateInterval.put(val); _setting.serverStatusUpdateInterval.put(val);
_serverProvider.startAutoRefresh(); Providers.server.startAutoRefresh();
if (val == 0) { if (val == 0) {
context.showSnackBar(_s.updateIntervalEqual0); context.showSnackBar(_s.updateIntervalEqual0);
} }
@@ -968,7 +985,7 @@ class _SettingPageState extends State<SettingPage> {
child: Text(_s.sureDelete(e)), child: Text(_s.sureDelete(e)),
actions: [ actions: [
TextButton( TextButton(
onPressed: () => _serverProvider.delServer(e), onPressed: () => Providers.server.delServer(e),
child: Text(_s.ok), child: Text(_s.ok),
) )
], ],

View File

@@ -1,11 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:toolbox/core/extension/order.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/data/res/store.dart';
import 'package:toolbox/view/widget/round_rect_card.dart'; import 'package:toolbox/view/widget/round_rect_card.dart';
import '../../../data/provider/server.dart';
import '../../../locator.dart';
import '../../widget/custom_appbar.dart'; import '../../widget/custom_appbar.dart';
class ServerOrderPage extends StatefulWidget { class ServerOrderPage extends StatefulWidget {
@@ -16,8 +15,6 @@ class ServerOrderPage extends StatefulWidget {
} }
class _ServerOrderPageState extends State<ServerOrderPage> { class _ServerOrderPageState extends State<ServerOrderPage> {
final _provider = locator<ServerProvider>();
late S _s; late S _s;
@override @override
@@ -40,7 +37,7 @@ class _ServerOrderPageState extends State<ServerOrderPage> {
return ReorderableListView.builder( return ReorderableListView.builder(
footer: const SizedBox(height: 77), footer: const SizedBox(height: 77),
onReorder: (oldIndex, newIndex) => setState(() { onReorder: (oldIndex, newIndex) => setState(() {
_provider.serverOrder.move( Providers.server.serverOrder.move(
oldIndex, oldIndex,
newIndex, newIndex,
property: Stores.setting.serverOrder, property: Stores.setting.serverOrder,
@@ -49,13 +46,13 @@ class _ServerOrderPageState extends State<ServerOrderPage> {
padding: const EdgeInsets.symmetric(horizontal: 7, vertical: 3), padding: const EdgeInsets.symmetric(horizontal: 7, vertical: 3),
buildDefaultDragHandles: false, buildDefaultDragHandles: false,
itemBuilder: (_, index) => itemBuilder: (_, index) =>
_buildItem(index, _provider.serverOrder[index]), _buildItem(index, Providers.server.serverOrder[index]),
itemCount: _provider.serverOrder.length, itemCount: Providers.server.serverOrder.length,
); );
} }
Widget _buildItem(int index, String id) { Widget _buildItem(int index, String id) {
final spi = _provider.servers[id]?.spi; final spi = Providers.server.servers[id]?.spi;
if (spi == null) { if (spi == null) {
return const SizedBox(); return const SizedBox();
} }

View File

@@ -3,12 +3,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:toolbox/core/extension/context/common.dart'; import 'package:toolbox/core/extension/context/common.dart';
import 'package:toolbox/core/extension/context/snackbar.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 'package:toolbox/view/widget/input_field.dart';
import '../../../data/model/server/snippet.dart'; import '../../../data/model/server/snippet.dart';
import '../../../data/provider/snippet.dart';
import '../../../data/res/ui.dart'; import '../../../data/res/ui.dart';
import '../../../locator.dart';
import '../../widget/custom_appbar.dart'; import '../../widget/custom_appbar.dart';
import '../../widget/tag.dart'; import '../../widget/tag.dart';
@@ -28,17 +27,10 @@ class _SnippetEditPageState extends State<SnippetEditPage>
final _noteController = TextEditingController(); final _noteController = TextEditingController();
final _scriptNode = FocusNode(); final _scriptNode = FocusNode();
late SnippetProvider _provider;
late S _s; late S _s;
List<String> _tags = []; List<String> _tags = [];
@override
void initState() {
super.initState();
_provider = locator<SnippetProvider>();
}
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
@@ -72,7 +64,7 @@ class _SnippetEditPageState extends State<SnippetEditPage>
return [ return [
IconButton( IconButton(
onPressed: () { onPressed: () {
_provider.del(widget.snippet!); Providers.snippet.del(widget.snippet!);
context.pop(); context.pop();
}, },
tooltip: _s.delete, tooltip: _s.delete,
@@ -100,9 +92,9 @@ class _SnippetEditPageState extends State<SnippetEditPage>
note: note.isEmpty ? null : note, note: note.isEmpty ? null : note,
); );
if (widget.snippet != null) { if (widget.snippet != null) {
_provider.update(widget.snippet!, snippet); Providers.snippet.update(widget.snippet!, snippet);
} else { } else {
_provider.add(snippet); Providers.snippet.add(snippet);
} }
context.pop(); context.pop();
}, },
@@ -135,9 +127,9 @@ class _SnippetEditPageState extends State<SnippetEditPage>
_tags = p0; _tags = p0;
}), }),
s: _s, s: _s,
allTags: [..._provider.tags], allTags: [...Providers.server.tags],
onRenameTag: (old, n) => setState(() { onRenameTag: (old, n) => setState(() {
_provider.renameTag(old, n); Providers.server.renameTag(old, n);
}), }),
), ),
Input( Input(

View File

@@ -3,14 +3,13 @@ import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/context/dialog.dart';
import 'package:toolbox/core/extension/order.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/data/res/store.dart';
import '../../../core/utils/misc.dart'; import '../../../core/utils/misc.dart';
import '../../../data/model/server/server.dart'; import '../../../data/model/server/server.dart';
import '../../../data/model/server/snippet.dart'; import '../../../data/model/server/snippet.dart';
import '../../../data/provider/server.dart';
import '../../../data/res/ui.dart'; import '../../../data/res/ui.dart';
import '../../../locator.dart';
import '../../widget/tag.dart'; import '../../widget/tag.dart';
import '/core/route.dart'; import '/core/route.dart';
import '/data/provider/snippet.dart'; import '/data/provider/snippet.dart';
@@ -130,19 +129,18 @@ class _SnippetListPageState extends State<SnippetListPage> {
} }
Future<void> _runSnippet(Snippet snippet) async { Future<void> _runSnippet(Snippet snippet) async {
final provider = locator<ServerProvider>();
final servers = await showDialog<List<Server>>( final servers = await showDialog<List<Server>>(
context: context, context: context,
builder: (_) => TagPicker<Server>( builder: (_) => TagPicker<Server>(
items: provider.servers.values.toList(), items: Providers.server.servers.values.toList(),
tags: provider.tags.toSet(), tags: Providers.server.tags.toSet(),
), ),
); );
if (servers == null) { if (servers == null) {
return; return;
} }
final ids = servers.map((e) => e.spi.id).toList(); 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) { if (results.isNotEmpty) {
// SERVER_NAME: RESULT // SERVER_NAME: RESULT
final result = Map.fromIterables( final result = Map.fromIterables(

View File

@@ -37,7 +37,7 @@ class SSHPage extends StatefulWidget {
} }
class _SSHPageState extends State<SSHPage> { class _SSHPageState extends State<SSHPage> {
final _keyboard = locator<VirtualKeyboard>(); final _keyboard = locator<VirtKeyProvider>();
late final _terminal = Terminal(inputHandler: _keyboard); late final _terminal = Terminal(inputHandler: _keyboard);
final TerminalController _terminalController = TerminalController(); final TerminalController _terminalController = TerminalController();
final List<List<VirtKey>> _virtKeysList = []; final List<List<VirtKey>> _virtKeysList = [];
@@ -146,7 +146,7 @@ class _SSHPageState extends State<SSHPage> {
child: Container( child: Container(
color: _terminalTheme.background, color: _terminalTheme.background,
height: _virtKeysHeight, height: _virtKeysHeight,
child: Consumer<VirtualKeyboard>( child: Consumer<VirtKeyProvider>(
builder: (_, __, ___) => _buildVirtualKey(), builder: (_, __, ___) => _buildVirtualKey(),
), ),
), ),

View File

@@ -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/dialog.dart';
import 'package:toolbox/core/extension/context/snackbar.dart'; import 'package:toolbox/core/extension/context/snackbar.dart';
import 'package:toolbox/data/model/sftp/req.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/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/input_field.dart';
import 'package:toolbox/view/widget/picker.dart'; import 'package:toolbox/view/widget/picker.dart';
import 'package:toolbox/view/widget/round_rect_card.dart'; import 'package:toolbox/view/widget/round_rect_card.dart';
@@ -284,8 +282,7 @@ class _LocalStoragePageState extends State<LocalStoragePage> {
title: Text(_s.upload), title: Text(_s.upload),
onTap: () async { onTap: () async {
context.pop(); context.pop();
final serverProvider = locator<ServerProvider>(); final ids = Providers.server.serverOrder;
final ids = serverProvider.serverOrder;
var idx = 0; var idx = 0;
await context.showRoundDialog( await context.showRoundDialog(
title: Text(_s.server), title: Text(_s.server),
@@ -299,7 +296,7 @@ class _LocalStoragePageState extends State<LocalStoragePage> {
], ],
); );
final id = ids[idx]; final id = ids[idx];
final spi = serverProvider.servers[id]?.spi; final spi = Providers.server.servers[id]?.spi;
if (spi == null) { if (spi == null) {
return; return;
} }
@@ -310,7 +307,7 @@ class _LocalStoragePageState extends State<LocalStoragePage> {
if (remotePath == null) { if (remotePath == null) {
return; return;
} }
locator<SftpProvider>().add(SftpReq( Providers.sftp.add(SftpReq(
spi, spi,
'$remotePath/$fileName', '$remotePath/$fileName',
file.absolute.path, file.absolute.path,

View File

@@ -10,6 +10,7 @@ import 'package:toolbox/core/extension/context/snackbar.dart';
import 'package:toolbox/core/extension/sftpfile.dart'; import 'package:toolbox/core/extension/sftpfile.dart';
import 'package:toolbox/data/res/logger.dart'; import 'package:toolbox/data/res/logger.dart';
import 'package:toolbox/data/res/misc.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/data/res/store.dart';
import 'package:toolbox/view/widget/round_rect_card.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/absolute_path.dart';
import '../../../data/model/sftp/browser_status.dart'; import '../../../data/model/sftp/browser_status.dart';
import '../../../data/model/sftp/req.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/path.dart';
import '../../../data/res/ui.dart'; import '../../../data/res/ui.dart';
import '../../../locator.dart';
import '../../widget/custom_appbar.dart'; import '../../widget/custom_appbar.dart';
import '../../widget/fade_in.dart'; import '../../widget/fade_in.dart';
import '../../widget/input_field.dart'; import '../../widget/input_field.dart';
@@ -51,8 +49,6 @@ class SftpPage extends StatefulWidget {
class _SftpPageState extends State<SftpPage> with AfterLayoutMixin { class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
final SftpBrowserStatus _status = SftpBrowserStatus(); final SftpBrowserStatus _status = SftpBrowserStatus();
final _sftp = locator<SftpProvider>();
late S _s; late S _s;
SSHClient? _client; SSHClient? _client;
@@ -66,8 +62,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
final serverProvider = locator<ServerProvider>(); _client = Providers.server.servers[widget.spi.id]?.client;
_client = serverProvider.servers[widget.spi.id]?.client;
} }
@override @override
@@ -184,7 +179,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
context.showSnackBar('remote path is null'); context.showSnackBar('remote path is null');
return; return;
} }
_sftp.add( Providers.sftp.add(
SftpReq( SftpReq(
widget.spi, widget.spi,
'$remotePath/${path.split('/').last}', '$remotePath/${path.split('/').last}',
@@ -382,14 +377,15 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
localPath, localPath,
SftpReqType.download, SftpReqType.download,
); );
_sftp.add(req, completer: completer); Providers.sftp.add(req, completer: completer);
context.showLoadingDialog(); context.showLoadingDialog();
await completer.future; await completer.future;
context.pop(); context.pop();
final result = await AppRoute.editor(path: localPath).go<bool>(context); final result = await AppRoute.editor(path: localPath).go<bool>(context);
if (result != null && result) { 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); context.showSnackBar(_s.added2List);
} }
} }
@@ -408,7 +404,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
context.pop(); context.pop();
final remotePath = _getRemotePath(name); final remotePath = _getRemotePath(name);
_sftp.add( Providers.sftp.add(
SftpReq( SftpReq(
widget.spi, widget.spi,
remotePath, remotePath,

View File

@@ -5,7 +5,7 @@ import 'package:toolbox/core/extension/context/common.dart';
import 'package:toolbox/core/extension/datetime.dart'; import 'package:toolbox/core/extension/datetime.dart';
import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/context/dialog.dart';
import 'package:toolbox/core/route.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/extension/numx.dart';
import '../../../core/utils/misc.dart'; import '../../../core/utils/misc.dart';
@@ -149,7 +149,7 @@ class _SftpMissionPageState extends State<SftpMissionPage> {
actions: [ actions: [
TextButton( TextButton(
onPressed: () { onPressed: () {
locator<SftpProvider>().cancel(id); Providers.sftp.cancel(id);
context.pop(); context.pop();
}, },
child: Text(_s.ok), child: Text(_s.ok),

View File

@@ -9,6 +9,7 @@ import 'package:toolbox/core/extension/ssh_client.dart';
import 'package:toolbox/core/extension/uint8list.dart'; import 'package:toolbox/core/extension/uint8list.dart';
import 'package:toolbox/data/model/pkg/manager.dart'; import 'package:toolbox/data/model/pkg/manager.dart';
import 'package:toolbox/data/model/server/dist.dart'; import 'package:toolbox/data/model/server/dist.dart';
import 'package:toolbox/data/res/provider.dart';
import '../../core/route.dart'; import '../../core/route.dart';
import '../../core/utils/misc.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/pkg/upgrade_info.dart';
import '../../data/model/server/server_private_info.dart'; import '../../data/model/server/server_private_info.dart';
import '../../data/model/server/snippet.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 'popup_menu.dart';
import 'tag.dart'; import 'tag.dart';
@@ -102,19 +100,17 @@ void _onTapMoreBtns(
); );
break; break;
case ServerTabMenuType.snippet: case ServerTabMenuType.snippet:
final provider = locator<SnippetProvider>();
final snippets = await showDialog<List<Snippet>>( final snippets = await showDialog<List<Snippet>>(
context: context, context: context,
builder: (_) => TagPicker<Snippet>( builder: (_) => TagPicker<Snippet>(
items: provider.snippets, items: Providers.snippet.snippets,
tags: provider.tags.toSet(), tags: Providers.server.tags.toSet(),
), ),
); );
if (snippets == null) { if (snippets == null) {
return; return;
} }
final result = final result = await Providers.server.runSnippets(spi.id, snippets);
await locator<ServerProvider>().runSnippets(spi.id, snippets);
if (result != null && result.isNotEmpty) { if (result != null && result.isNotEmpty) {
context.showRoundDialog( context.showRoundDialog(
title: Text(s.result), title: Text(s.result),
@@ -196,7 +192,7 @@ Future<void> _gotoSSH(
} }
bool _checkClient(BuildContext context, String id, String msg) { bool _checkClient(BuildContext context, String id, String msg) {
final server = locator<ServerProvider>().servers[id]; final server = Providers.server.servers[id];
if (server == null || server.client == null) { if (server == null || server.client == null) {
context.showSnackBar(msg); context.showSnackBar(msg);
return false; return false;
@@ -205,7 +201,7 @@ bool _checkClient(BuildContext context, String id, String msg) {
} }
Future<void> _onPkg(BuildContext context, S s, ServerPrivateInfo spi) async { Future<void> _onPkg(BuildContext context, S s, ServerPrivateInfo spi) async {
final server = locator<ServerProvider>().servers[spi.id]; final server = spi.findServer;
if (server == null) { if (server == null) {
context.showSnackBar(s.noClient); context.showSnackBar(s.noClient);
return; return;

View File

@@ -476,9 +476,9 @@
baseConfigurationReference = C1C758C41C4E208965A68933 /* Pods-RunnerTests.debug.xcconfig */; baseConfigurationReference = C1C758C41C4E208965A68933 /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CURRENT_PROJECT_VERSION = 550; CURRENT_PROJECT_VERSION = 551;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0.550; MARKETING_VERSION = 1.0.551;
PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@@ -491,9 +491,9 @@
baseConfigurationReference = 15AF97DF993E8968098D6EBE /* Pods-RunnerTests.release.xcconfig */; baseConfigurationReference = 15AF97DF993E8968098D6EBE /* Pods-RunnerTests.release.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CURRENT_PROJECT_VERSION = 550; CURRENT_PROJECT_VERSION = 551;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0.550; MARKETING_VERSION = 1.0.551;
PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@@ -506,9 +506,9 @@
baseConfigurationReference = 7CFA7DE7FABA75685DFB6948 /* Pods-RunnerTests.profile.xcconfig */; baseConfigurationReference = 7CFA7DE7FABA75685DFB6948 /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CURRENT_PROJECT_VERSION = 550; CURRENT_PROJECT_VERSION = 551;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0.550; MARKETING_VERSION = 1.0.551;
PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;