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

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