diff --git a/lib/core/utils/ui.dart b/lib/core/utils/ui.dart index d47dbd1a..c7887202 100644 --- a/lib/core/utils/ui.dart +++ b/lib/core/utils/ui.dart @@ -9,6 +9,7 @@ import 'package:url_launcher/url_launcher.dart'; import '../../data/model/server/snippet.dart'; import '../../data/provider/snippet.dart'; +import '../../data/res/ui.dart'; import '../../locator.dart'; import '../../view/page/snippet/edit.dart'; import '../../view/widget/picker.dart'; @@ -69,6 +70,14 @@ Future showRoundDialog({ ); } +void showLoadingDialog(BuildContext context, {bool barrierDismiss = false}) { + showRoundDialog( + context: context, + child: centerSizedLoading, + barrierDismiss: barrierDismiss, + ); +} + Widget buildSwitch( BuildContext context, StoreProperty prop, { diff --git a/lib/data/provider/docker.dart b/lib/data/provider/docker.dart index d7b8b844..f396227f 100644 --- a/lib/data/provider/docker.dart +++ b/lib/data/provider/docker.dart @@ -2,10 +2,10 @@ import 'dart:async'; import 'dart:typed_data'; import 'package:dartssh2/dartssh2.dart'; +import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:toolbox/core/extension/ssh_client.dart'; import 'package:toolbox/core/extension/stringx.dart'; -import 'package:toolbox/core/provider_base.dart'; import 'package:toolbox/data/model/app/shell_func.dart'; import 'package:toolbox/data/model/docker/image.dart'; import 'package:toolbox/data/model/docker/ps.dart'; @@ -22,7 +22,7 @@ final _dockerPrefixReg = RegExp(r'(sudo )?docker '); final _logger = Logger('DOCKER'); -class DockerProvider extends BusyProvider { +class DockerProvider extends ChangeNotifier { final _dockerStore = locator(); SSHClient? client; @@ -56,9 +56,6 @@ class DockerProvider extends BusyProvider { } Future refresh() async { - if (isBusy) return; - setBusyState(); - var raw = ''; await client!.exec( AppShellFuncType.docker.exec, @@ -68,7 +65,7 @@ class DockerProvider extends BusyProvider { if (raw.contains(_dockerNotFound)) { error = DockerErr(type: DockerErrType.notInstalled); - setBusyState(false); + notifyListeners(); return; } @@ -76,7 +73,7 @@ class DockerProvider extends BusyProvider { final segments = raw.split(seperator); if (segments.length != dockerCmds.length) { error = DockerErr(type: DockerErrType.segmentsNotMatch); - setBusyState(false); + notifyListeners(); return; } @@ -98,9 +95,8 @@ class DockerProvider extends BusyProvider { message: '$psRaw\n-\n$e', ); _logger.warning('parse docker ps: $psRaw', e); - rethrow; } finally { - setBusyState(false); + notifyListeners(); } // Parse docker images @@ -116,9 +112,8 @@ class DockerProvider extends BusyProvider { message: '$imageRaw\n-\n$e', ); _logger.warning('parse docker images: $imageRaw', e); - rethrow; } finally { - setBusyState(false); + notifyListeners(); } // Parse docker stats @@ -141,9 +136,8 @@ class DockerProvider extends BusyProvider { message: '$statsRaw\n-\n$e', ); _logger.warning('parse docker stats: $statsRaw', e); - rethrow; } finally { - setBusyState(false); + notifyListeners(); } } @@ -175,7 +169,6 @@ class DockerProvider extends BusyProvider { if (!cmd.startsWith(_dockerPrefixReg)) { return DockerErr(type: DockerErrType.cmdNoPrefix); } - setBusyState(); runLog = ''; final errs = []; @@ -191,16 +184,15 @@ class DockerProvider extends BusyProvider { }, ); runLog = null; + notifyListeners(); if (code != 0) { - setBusyState(false); return DockerErr( type: DockerErrType.unknown, message: errs.join('\n').trim(), ); } await refresh(); - setBusyState(false); return null; } diff --git a/lib/view/page/docker.dart b/lib/view/page/docker.dart index 906046af..3a9bed91 100644 --- a/lib/view/page/docker.dart +++ b/lib/view/page/docker.dart @@ -70,7 +70,11 @@ class _DockerManagePageState extends State { title: TwoLineText(up: 'Docker', down: widget.spi.name), actions: [ IconButton( - onPressed: _docker.refresh, + onPressed: () async { + showLoadingDialog(context); + await _docker.refresh(); + context.pop(); + }, icon: const Icon(Icons.refresh), ) ], @@ -153,7 +157,9 @@ class _DockerManagePageState extends State { TextButton( onPressed: () async { context.pop(); + showLoadingDialog(context); final result = await _docker.run(cmd); + context.pop(); if (result != null) { showSnackBar(context, Text(result.message ?? _s.unknownError)); } @@ -331,7 +337,7 @@ class _DockerManagePageState extends State { } Widget _buildLoading() { - if (!_docker.isBusy) return nil; + if (_docker.runLog == null) return nil; return Padding( padding: const EdgeInsets.all(17), child: Column( @@ -409,11 +415,11 @@ class _DockerManagePageState extends State { '${item.name} - ${item.status}', style: textSize13Grey, ), - trailing: _buildMoreBtn(item, _docker.isBusy), + trailing: _buildMoreBtn(item), ); } - Widget _buildMoreBtn(DockerPsItem dItem, bool busy) { + Widget _buildMoreBtn(DockerPsItem dItem) { return PopupMenu( items: DockerMenuType.items(dItem.running) .map( @@ -421,10 +427,6 @@ class _DockerManagePageState extends State { ) .toList(), onSelected: (DockerMenuType item) async { - if (busy) { - showSnackBar(context, Text(_s.isBusy)); - return; - } switch (item) { case DockerMenuType.rm: showRoundDialog( @@ -433,9 +435,11 @@ class _DockerManagePageState extends State { child: Text(_s.sureDelete(dItem.name)), actions: [ TextButton( - onPressed: () { + onPressed: () async { + context.pop(); + showLoadingDialog(context); + await _docker.delete(dItem.containerId); context.pop(); - _docker.delete(dItem.containerId); }, child: Text(_s.ok), ) @@ -443,13 +447,19 @@ class _DockerManagePageState extends State { ); break; case DockerMenuType.start: - _docker.start(dItem.containerId); + showLoadingDialog(context); + await _docker.start(dItem.containerId); + context.pop(); break; case DockerMenuType.stop: - _docker.stop(dItem.containerId); + showLoadingDialog(context); + await _docker.stop(dItem.containerId); + context.pop(); break; case DockerMenuType.restart: - _docker.restart(dItem.containerId); + showLoadingDialog(context); + await _docker.restart(dItem.containerId); + context.pop(); break; case DockerMenuType.logs: AppRoute( diff --git a/lib/view/page/storage/sftp.dart b/lib/view/page/storage/sftp.dart index dd321cb0..a6c0061a 100644 --- a/lib/view/page/storage/sftp.dart +++ b/lib/view/page/storage/sftp.dart @@ -395,7 +395,7 @@ class _SftpPageState extends State { SftpReqType.download, ); _sftp.add(req, completer: completer); - showRoundDialog(context: context, child: centerSizedLoading); + showLoadingDialog(context); await completer.future; context.pop(); @@ -458,10 +458,8 @@ class _SftpPageState extends State { TextButton( onPressed: () async { context.pop(); - showRoundDialog( - context: context, - child: centerSizedLoading, - barrierDismiss: false, + showLoadingDialog( + context ); final remotePath = _getRemotePath(file); try {