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;
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)";

View File

@@ -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<SnippetProvider>();
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(

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/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<void> doUpdate(BuildContext context, {bool force = false}) async {
return;
}
locator<AppProvider>().newestBuild = newest;
Providers.app.newestBuild = newest;
if (!force && newest <= BuildData.build) {
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: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<AppProvider>();
Future<bool> shareFiles(BuildContext context, List<String> filePaths) async {
for (final filePath in filePaths) {
if (!await File(filePath).exists()) {
@@ -25,10 +22,10 @@ Future<bool> shareFiles(BuildContext context, List<String> 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<String?> 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;
}

View File

@@ -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 ||

View File

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

View File

@@ -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;

View File

@@ -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;
}

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(DockerProvider());
locator.registerSingleton(ServerProvider());
locator.registerSingleton(VirtualKeyboard());
locator.registerSingleton(VirtKeyProvider());
locator.registerSingleton(SnippetProvider());
locator.registerSingleton(PrivateKeyProvider());
locator.registerSingleton(SftpProvider());

View File

@@ -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<void> main() async {
_runInZone(() async {
await initApp();
@@ -45,7 +44,7 @@ Future<void> main() async {
ChangeNotifierProvider(create: (_) => locator<DockerProvider>()),
ChangeNotifierProvider(create: (_) => locator<ServerProvider>()),
ChangeNotifierProvider(create: (_) => locator<SnippetProvider>()),
ChangeNotifierProvider(create: (_) => locator<VirtualKeyboard>()),
ChangeNotifierProvider(create: (_) => locator<VirtKeyProvider>()),
ChangeNotifierProvider(create: (_) => locator<PrivateKeyProvider>()),
ChangeNotifierProvider(create: (_) => locator<SftpProvider>()),
],
@@ -77,9 +76,6 @@ Future<void> initApp() async {
// Base of all data.
await _initHive();
await setupLocator();
// Setup [DebugProvider] first to catch all logs.
_debug = locator<DebugProvider>();
_setupLogger();
_setupProviders();
@@ -101,8 +97,8 @@ Future<void> initApp() async {
}
void _setupProviders() {
locator<SnippetProvider>().loadData();
locator<PrivateKeyProvider>().loadData();
Providers.snippet.loadData();
Providers.key.loadData();
}
Future<void> _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);

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/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<DockerManagePage> {
final _docker = locator<DockerProvider>();
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<DockerManagePage> {
@override
void initState() {
super.initState();
final client = locator<ServerProvider>().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<DockerManagePage> {
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<DockerManagePage> {
],
),
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 {
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<DockerManagePage> {
}
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<DockerManagePage> {
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<DockerManagePage> {
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<DockerManagePage> {
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<DockerManagePage> {
}
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<DockerManagePage> {
child: CircularProgressIndicator(),
),
UIs.height13,
Text(_docker.runLog ?? '...'),
Text(Providers.docker.runLog ?? '...'),
],
),
);
@@ -334,8 +330,8 @@ class _DockerManagePageState extends State<DockerManagePage> {
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<DockerManagePage> {
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<DockerManagePage> {
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<DockerManagePage> {
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<DockerManagePage> {
Widget _buildEditHost() {
final children = <Widget>[];
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<DockerManagePage> {
void _onSaveDockerHost(String val) {
context.pop();
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/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<FullScreenPage> with AfterLayoutMixin {
late int _rotateQuarter;
final _pageController = PageController(initialPage: 0);
final _serverProvider = locator<ServerProvider>();
@override
void initState() {
@@ -372,8 +371,8 @@ class _FullScreenPageState extends State<FullScreenPage> 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();
}

View File

@@ -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<HomePage>
AutomaticKeepAliveClientMixin,
AfterLayoutMixin,
WidgetsBindingObserver {
final _serverProvider = locator<ServerProvider>();
final _app = locator<AppProvider>();
late final PageController _pageController;
final _selectIndex = ValueNotifier(0);
@@ -73,7 +68,7 @@ class _HomePageState extends State<HomePage>
void dispose() {
super.dispose();
WidgetsBinding.instance.removeObserver(this);
_serverProvider.closeServer();
Providers.server.closeServer();
_pageController.dispose();
}
@@ -84,20 +79,20 @@ class _HomePageState extends State<HomePage>
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<HomePage>
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<HomePage>
}
updateHomeWidget();
await GetIt.I.allReady();
await _serverProvider.loadLocalData();
await _serverProvider.refreshData();
await Providers.server.loadLocalData();
await Providers.server.refreshData();
if (!Analysis.enabled) {
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/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<PingPage>
with AutomaticKeepAliveClientMixin, AfterLayoutMixin {
late TextEditingController _textEditingController;
final _results = ValueNotifier(<PingResult>[]);
final _serverProvider = locator<ServerProvider>();
late S _s;
bool get isInit => _results.value.isEmpty;
@@ -176,7 +174,7 @@ class _PingPageState extends State<PingPage>
return;
}
if (_serverProvider.servers.isEmpty) {
if (Providers.server.servers.isEmpty) {
context.showSnackBar(_s.pingNoServer);
return;
}
@@ -187,7 +185,7 @@ class _PingPageState extends State<PingPage>
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<PingPage>
@override
Future<FutureOr<void>> 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();
}
}
}

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/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<PrivateKeyEditPage> {
final _pwdNode = FocusNode();
late FocusScopeNode _focusScope;
final _provider = locator<PrivateKeyProvider>();
late S _s;
Widget? _loading;
@@ -99,7 +97,7 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage> {
actions: [
TextButton(
onPressed: () {
_provider.delete(widget.pki!);
Providers.key.delete(widget.pki!);
context.pop();
context.pop();
},
@@ -139,9 +137,9 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage> {
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());

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/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<ProcessPage> {
ProcSortMode _procSortMode = ProcSortMode.cpu;
List<ProcSortMode> _sortModes = List.from(ProcSortMode.values);
final _serverProvider = locator<ServerProvider>();
@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());

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/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<ServerEditPage> {
late FocusScopeNode _focusScope;
late S _s;
final _srvs = locator<ServerProvider>();
final _keys = locator<PrivateKeyProvider>();
final _keyIdx = ValueNotifier<int?>(null);
final _autoConnect = ValueNotifier(true);
@@ -63,7 +59,7 @@ class _ServerEditPageState extends State<ServerEditPage> {
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<ServerEditPage> {
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<ServerEditPage> {
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<ServerEditPage> {
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<ServerEditPage> {
);
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();

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/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<ServerPage>
late S _s;
final _flipedCardIds = <String>{};
final _serverProvider = locator<ServerProvider>();
String? _tag;
bool _useDoubleColumn = false;
@@ -96,7 +95,7 @@ class _ServerPageState extends State<ServerPage>
}
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<ServerPage>
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<ServerPage>
@override
Future<void> 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<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/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<SettingPage> {
final _keyboardTypeKey = GlobalKey<PopupMenuButtonState<int>>();
final _rotateQuarterKey = GlobalKey<PopupMenuButtonState<int>>();
final _netViewTypeKey = GlobalKey<PopupMenuButtonState<NetViewType>>();
final _serverProvider = locator<ServerProvider>();
final _setting = Stores.setting;
late S _s;
@@ -108,8 +106,8 @@ class _SettingPageState extends State<SettingPage> {
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<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) {
_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<SettingPage> {
child: Text(_s.sureDelete(e)),
actions: [
TextButton(
onPressed: () => _serverProvider.delServer(e),
onPressed: () => Providers.server.delServer(e),
child: Text(_s.ok),
)
],

View File

@@ -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<ServerOrderPage> {
final _provider = locator<ServerProvider>();
late S _s;
@override
@@ -40,7 +37,7 @@ class _ServerOrderPageState extends State<ServerOrderPage> {
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<ServerOrderPage> {
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();
}

View File

@@ -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<SnippetEditPage>
final _noteController = TextEditingController();
final _scriptNode = FocusNode();
late SnippetProvider _provider;
late S _s;
List<String> _tags = [];
@override
void initState() {
super.initState();
_provider = locator<SnippetProvider>();
}
@override
void dispose() {
super.dispose();
@@ -72,7 +64,7 @@ class _SnippetEditPageState extends State<SnippetEditPage>
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<SnippetEditPage>
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<SnippetEditPage>
_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(

View File

@@ -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<SnippetListPage> {
}
Future<void> _runSnippet(Snippet snippet) async {
final provider = locator<ServerProvider>();
final servers = await showDialog<List<Server>>(
context: context,
builder: (_) => TagPicker<Server>(
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(

View File

@@ -37,7 +37,7 @@ class SSHPage extends StatefulWidget {
}
class _SSHPageState extends State<SSHPage> {
final _keyboard = locator<VirtualKeyboard>();
final _keyboard = locator<VirtKeyProvider>();
late final _terminal = Terminal(inputHandler: _keyboard);
final TerminalController _terminalController = TerminalController();
final List<List<VirtKey>> _virtKeysList = [];
@@ -146,7 +146,7 @@ class _SSHPageState extends State<SSHPage> {
child: Container(
color: _terminalTheme.background,
height: _virtKeysHeight,
child: Consumer<VirtualKeyboard>(
child: Consumer<VirtKeyProvider>(
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/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<LocalStoragePage> {
title: Text(_s.upload),
onTap: () async {
context.pop();
final serverProvider = locator<ServerProvider>();
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<LocalStoragePage> {
],
);
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<LocalStoragePage> {
if (remotePath == null) {
return;
}
locator<SftpProvider>().add(SftpReq(
Providers.sftp.add(SftpReq(
spi,
'$remotePath/$fileName',
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/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<SftpPage> with AfterLayoutMixin {
final SftpBrowserStatus _status = SftpBrowserStatus();
final _sftp = locator<SftpProvider>();
late S _s;
SSHClient? _client;
@@ -66,8 +62,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
@override
void initState() {
super.initState();
final serverProvider = locator<ServerProvider>();
_client = serverProvider.servers[widget.spi.id]?.client;
_client = Providers.server.servers[widget.spi.id]?.client;
}
@override
@@ -184,7 +179,7 @@ class _SftpPageState extends State<SftpPage> 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<SftpPage> 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<bool>(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<SftpPage> with AfterLayoutMixin {
context.pop();
final remotePath = _getRemotePath(name);
_sftp.add(
Providers.sftp.add(
SftpReq(
widget.spi,
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/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<SftpMissionPage> {
actions: [
TextButton(
onPressed: () {
locator<SftpProvider>().cancel(id);
Providers.sftp.cancel(id);
context.pop();
},
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/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<SnippetProvider>();
final snippets = await showDialog<List<Snippet>>(
context: context,
builder: (_) => TagPicker<Snippet>(
items: provider.snippets,
tags: provider.tags.toSet(),
items: Providers.snippet.snippets,
tags: Providers.server.tags.toSet(),
),
);
if (snippets == null) {
return;
}
final result =
await locator<ServerProvider>().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<void> _gotoSSH(
}
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) {
context.showSnackBar(msg);
return false;
@@ -205,7 +201,7 @@ bool _checkClient(BuildContext context, String id, String msg) {
}
Future<void> _onPkg(BuildContext context, S s, ServerPrivateInfo spi) async {
final server = locator<ServerProvider>().servers[spi.id];
final server = spi.findServer;
if (server == null) {
context.showSnackBar(s.noClient);
return;

View File

@@ -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;