mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 15:24:35 +01:00
#86 fix: docker loading forever
This commit is contained in:
@@ -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<T?> showRoundDialog<T>({
|
||||
);
|
||||
}
|
||||
|
||||
void showLoadingDialog(BuildContext context, {bool barrierDismiss = false}) {
|
||||
showRoundDialog(
|
||||
context: context,
|
||||
child: centerSizedLoading,
|
||||
barrierDismiss: barrierDismiss,
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildSwitch(
|
||||
BuildContext context,
|
||||
StoreProperty<bool> prop, {
|
||||
|
||||
@@ -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<DockerStore>();
|
||||
|
||||
SSHClient? client;
|
||||
@@ -56,9 +56,6 @@ class DockerProvider extends BusyProvider {
|
||||
}
|
||||
|
||||
Future<void> 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 = <String>[];
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -70,7 +70,11 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
||||
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<DockerManagePage> {
|
||||
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<DockerManagePage> {
|
||||
}
|
||||
|
||||
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<DockerManagePage> {
|
||||
'${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<DockerManagePage> {
|
||||
)
|
||||
.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<DockerManagePage> {
|
||||
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<DockerManagePage> {
|
||||
);
|
||||
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(
|
||||
|
||||
@@ -395,7 +395,7 @@ class _SftpPageState extends State<SftpPage> {
|
||||
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<SftpPage> {
|
||||
TextButton(
|
||||
onPressed: () async {
|
||||
context.pop();
|
||||
showRoundDialog(
|
||||
context: context,
|
||||
child: centerSizedLoading,
|
||||
barrierDismiss: false,
|
||||
showLoadingDialog(
|
||||
context
|
||||
);
|
||||
final remotePath = _getRemotePath(file);
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user