This commit is contained in:
lollipopkit
2023-12-20 11:34:18 +08:00
parent eec13678a1
commit 6924290626
20 changed files with 104 additions and 105 deletions

View File

@@ -24,6 +24,9 @@ linter:
rules: rules:
library_private_types_in_public_api: false library_private_types_in_public_api: false
use_build_context_synchronously: false use_build_context_synchronously: false
prefer_final_locals: true
unnecessary_parenthesis: true
implicit_call_tearoffs: true
# avoid_print: false # Uncomment to disable the `avoid_print` rule # avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule

View File

@@ -586,7 +586,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 682; CURRENT_PROJECT_VERSION = 683;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -596,7 +596,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.682; MARKETING_VERSION = 1.0.683;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -720,7 +720,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 682; CURRENT_PROJECT_VERSION = 683;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -730,7 +730,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.682; MARKETING_VERSION = 1.0.683;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -748,7 +748,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 682; CURRENT_PROJECT_VERSION = 683;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -758,7 +758,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.682; MARKETING_VERSION = 1.0.683;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -779,7 +779,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 682; CURRENT_PROJECT_VERSION = 683;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@@ -792,7 +792,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.0.682; MARKETING_VERSION = 1.0.683;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
@@ -818,7 +818,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 682; CURRENT_PROJECT_VERSION = 683;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@@ -831,7 +831,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.0.682; MARKETING_VERSION = 1.0.683;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -854,7 +854,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 682; CURRENT_PROJECT_VERSION = 683;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@@ -867,7 +867,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.0.682; MARKETING_VERSION = 1.0.683;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -890,7 +890,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 682; CURRENT_PROJECT_VERSION = 683;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -902,7 +902,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.682; MARKETING_VERSION = 1.0.683;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
@@ -931,7 +931,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 682; CURRENT_PROJECT_VERSION = 683;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -943,7 +943,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.682; MARKETING_VERSION = 1.0.683;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
PRODUCT_NAME = ServerBox; PRODUCT_NAME = ServerBox;
@@ -969,7 +969,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 682; CURRENT_PROJECT_VERSION = 683;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -981,7 +981,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.682; MARKETING_VERSION = 1.0.683;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
PRODUCT_NAME = ServerBox; PRODUCT_NAME = ServerBox;

View File

@@ -6,7 +6,7 @@ enum _BuildMode {
profile, profile,
} }
final _buildMode = (() { final _buildMode = () {
if (const bool.fromEnvironment('dart.vm.product')) { if (const bool.fromEnvironment('dart.vm.product')) {
return _BuildMode.release; return _BuildMode.release;
} }
@@ -16,7 +16,7 @@ final _buildMode = (() {
return true; return true;
}()); }());
return result; return result;
}()); }();
class BuildMode { class BuildMode {
static bool isDebug = (_buildMode == _BuildMode.debug); static bool isDebug = (_buildMode == _BuildMode.debug);

View File

@@ -15,4 +15,18 @@ extension StringX on String {
} }
Uint8List get uint8List => Uint8List.fromList(utf8.encode(this)); Uint8List get uint8List => Uint8List.fromList(utf8.encode(this));
/// Upper the first letter.
String get upperFirst {
if (isEmpty) {
return this;
}
final runes = codeUnits;
if (runes[0] >= 97 && runes[0] <= 122) {
final origin = String.fromCharCode(runes[0]);
final upper = origin.toUpperCase();
return replaceFirst(origin, upper);
}
return this;
}
} }

View File

@@ -1,6 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:toolbox/core/extension/stringx.dart';
enum OS { enum OS {
android, android,
@@ -12,7 +13,7 @@ enum OS {
fuchsia, fuchsia,
unknown; unknown;
static final _os = () { static final type = () {
if (kIsWeb) { if (kIsWeb) {
return OS.web; return OS.web;
} }
@@ -37,48 +38,26 @@ enum OS {
return OS.unknown; return OS.unknown;
}(); }();
static OS get type => _os;
@override @override
String toString() { String toString() => switch (this) {
switch (this) { OS.macos => 'macOS',
case OS.android: OS.ios => 'iOS',
return 'Android'; final val => val.name.upperFirst,
case OS.ios: };
return 'iOS';
case OS.linux:
return 'Linux';
case OS.macos:
return 'macOS';
case OS.windows:
return 'Windows';
case OS.web:
return 'Web';
case OS.fuchsia:
return 'Fuchsia';
case OS.unknown:
return 'Unknown';
}
}
/// Whether has platform specific settings. /// Whether has platform specific settings.
static bool get hasSettings { static final hasSpecSetting = switch (type) {
switch (type) { OS.android || OS.ios => true,
case OS.android: _ => false,
case OS.ios: };
return true;
default:
return false;
}
}
} }
bool get isAndroid => OS.type == OS.android; final isAndroid = OS.type == OS.android;
bool get isIOS => OS.type == OS.ios; final isIOS = OS.type == OS.ios;
bool get isLinux => OS.type == OS.linux; final isLinux = OS.type == OS.linux;
bool get isMacOS => OS.type == OS.macos; final isMacOS = OS.type == OS.macos;
bool get isWindows => OS.type == OS.windows; final isWindows = OS.type == OS.windows;
bool get isWeb => OS.type == OS.web; final isWeb = OS.type == OS.web;
bool get isMobile => OS.type == OS.ios || OS.type == OS.android; final isMobile = OS.type == OS.ios || OS.type == OS.android;
bool get isDesktop => final isDesktop =
OS.type == OS.linux || OS.type == OS.macos || OS.type == OS.windows; OS.type == OS.linux || OS.type == OS.macos || OS.type == OS.windows;

View File

@@ -9,6 +9,7 @@ import 'package:toolbox/data/res/store.dart';
import 'package:webdav_client/webdav_client.dart'; import 'package:webdav_client/webdav_client.dart';
abstract final class Webdav { abstract final class Webdav {
/// Some WebDAV provider only support non-root path
static const _prefix = 'srvbox/'; static const _prefix = 'srvbox/';
static var _client = WebdavClient( static var _client = WebdavClient(

View File

@@ -30,7 +30,7 @@ Future<void> loadFontFile(String localPath) async {
if (name == null) return; if (name == null) return;
final file = File(localPath); final file = File(localPath);
if (!await file.exists()) return; if (!await file.exists()) return;
var fontLoader = FontLoader(name); final fontLoader = FontLoader(name);
fontLoader.addFont(file.readAsBytes().byteData); fontLoader.addFont(file.readAsBytes().byteData);
await fontLoader.load(); await fontLoader.load();
} }

View File

@@ -37,8 +37,8 @@ class DiskIO extends TimeSeq<DiskIOPiece> {
final sectorsRead = now.sectorsRead - pre.sectorsRead; final sectorsRead = now.sectorsRead - pre.sectorsRead;
final sectorsWrite = now.sectorsWrite - pre.sectorsWrite; final sectorsWrite = now.sectorsWrite - pre.sectorsWrite;
final time = now.time - pre.time; final time = now.time - pre.time;
final read = (sectorsRead / time * 512); final read = sectorsRead / time * 512;
final write = (sectorsWrite / time * 512); final write = sectorsWrite / time * 512;
return (read, write); return (read, write);
} }

View File

@@ -77,19 +77,19 @@ class SftpReqStatus {
void onNotify(dynamic event) { void onNotify(dynamic event) {
var shouldDispose = false; var shouldDispose = false;
switch (event) { switch (event) {
case SftpWorkerStatus val: case final SftpWorkerStatus val:
status = val; status = val;
if (status == SftpWorkerStatus.finished) { if (status == SftpWorkerStatus.finished) {
dispose(); dispose();
} }
break; break;
case double val: case final double val:
progress = val; progress = val;
break; break;
case int val: case final int val:
size = val; size = val;
break; break;
case Duration d: case final Duration d:
spentTime = d; spentTime = d;
break; break;
default: default:

View File

@@ -56,7 +56,7 @@ Future<void> isolateMessageHandler(
SendErrorFunction sendError, SendErrorFunction sendError,
) async { ) async {
switch (data) { switch (data) {
case SftpReq val: case final SftpReq val:
switch (val.type) { switch (val.type) {
case SftpReqType.download: case SftpReqType.download:
await _download(data, mainSendPort, sendError); await _download(data, mainSendPort, sendError);

View File

@@ -2,9 +2,9 @@
class BuildData { class BuildData {
static const String name = "ServerBox"; static const String name = "ServerBox";
static const int build = 682; static const int build = 683;
static const String engine = "3.16.4"; static const String engine = "3.16.4";
static const String buildAt = "2023-12-19 15:18:22"; static const String buildAt = "2023-12-19 15:25:07";
static const int modifications = 10; static const int modifications = 1;
static const int script = 32; static const int script = 32;
} }

View File

@@ -34,11 +34,12 @@ class DockerManagePage extends StatefulWidget {
class _DockerManagePageState extends State<DockerManagePage> { class _DockerManagePageState extends State<DockerManagePage> {
final _textController = TextEditingController(); final _textController = TextEditingController();
final _docker = Pros.docker;
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
Pros.docker.clear(); _docker.clear();
_textController.dispose(); _textController.dispose();
} }
@@ -49,7 +50,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
if (client == null) { if (client == null) {
return; return;
} }
Pros.docker _docker
..init( ..init(
client, client,
widget.spi.user, widget.spi.user,
@@ -71,7 +72,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
IconButton( IconButton(
onPressed: () async { onPressed: () async {
context.showLoadingDialog(); context.showLoadingDialog();
await Pros.docker.refresh(); await _docker.refresh();
context.pop(); context.pop();
}, },
icon: const Icon(Icons.refresh), icon: const Icon(Icons.refresh),
@@ -79,7 +80,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
], ],
), ),
body: _buildMain(), body: _buildMain(),
floatingActionButton: Pros.docker.error == null ? _buildFAB() : null, floatingActionButton: _docker.error == null ? _buildFAB() : null,
); );
}); });
} }
@@ -156,7 +157,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
onPressed: () async { onPressed: () async {
context.pop(); context.pop();
context.showLoadingDialog(); context.showLoadingDialog();
final result = await Pros.docker.run(cmd); final result = await _docker.run(cmd);
context.pop(); context.pop();
if (result != null) { if (result != null) {
context.showSnackBar(result.message ?? l10n.unknownError); context.showSnackBar(result.message ?? l10n.unknownError);
@@ -182,7 +183,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
} }
Widget _buildMain() { Widget _buildMain() {
if (Pros.docker.error != null && Pros.docker.items == null) { if (_docker.error != null && _docker.items == null) {
return SizedBox.expand( return SizedBox.expand(
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
@@ -193,18 +194,18 @@ class _DockerManagePageState extends State<DockerManagePage> {
size: 37, size: 37,
), ),
const SizedBox(height: 27), const SizedBox(height: 27),
Text(Pros.docker.error?.message ?? l10n.unknownError), Text(_docker.error?.message ?? l10n.unknownError),
const SizedBox(height: 27), const SizedBox(height: 27),
Padding( Padding(
padding: const EdgeInsets.all(17), padding: const EdgeInsets.all(17),
child: _buildSolution(Pros.docker.error!), child: _buildSolution(_docker.error!),
), ),
_buildEditHost(), _buildEditHost(),
], ],
), ),
); );
} }
if (Pros.docker.items == null || Pros.docker.images == null) { if (_docker.items == null || _docker.images == null) {
return UIs.centerLoading; return UIs.centerLoading;
} }
@@ -225,10 +226,11 @@ class _DockerManagePageState extends State<DockerManagePage> {
return ExpandTile( return ExpandTile(
title: Text(l10n.imagesList), title: Text(l10n.imagesList),
subtitle: Text( subtitle: Text(
l10n.dockerImagesFmt(Pros.docker.images!.length), l10n.dockerImagesFmt(_docker.images!.length),
style: UIs.textGrey, style: UIs.textGrey,
), ),
children: Pros.docker.images?.map(_buildImageItem).toList() ?? [], initiallyExpanded: (_docker.images?.length ?? 0) <= 3,
children: _docker.images?.map(_buildImageItem).toList() ?? [],
); );
} }
@@ -280,7 +282,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
child: CircularProgressIndicator(), child: CircularProgressIndicator(),
), ),
UIs.height13, UIs.height13,
Text(Pros.docker.runLog ?? '...'), Text(_docker.runLog ?? '...'),
], ],
), ),
); );
@@ -321,8 +323,8 @@ class _DockerManagePageState extends State<DockerManagePage> {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text(Pros.docker.edition ?? l10n.unknown), Text(_docker.edition ?? l10n.unknown),
Text(Pros.docker.version ?? l10n.unknown), Text(_docker.version ?? l10n.unknown),
], ],
), ),
); );
@@ -380,7 +382,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
onPressed: () async { onPressed: () async {
context.pop(); context.pop();
context.showLoadingDialog(); context.showLoadingDialog();
final result = await Pros.docker.delete( final result = await _docker.delete(
dItem.containerId, dItem.containerId,
force, force,
); );
@@ -399,7 +401,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
break; break;
case DockerMenuType.start: case DockerMenuType.start:
context.showLoadingDialog(); context.showLoadingDialog();
final result = await Pros.docker.start(dItem.containerId); final result = await _docker.start(dItem.containerId);
context.pop(); context.pop();
if (result != null) { if (result != null) {
context.showRoundDialog( context.showRoundDialog(
@@ -410,7 +412,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
break; break;
case DockerMenuType.stop: case DockerMenuType.stop:
context.showLoadingDialog(); context.showLoadingDialog();
final result = await Pros.docker.stop(dItem.containerId); final result = await _docker.stop(dItem.containerId);
context.pop(); context.pop();
if (result != null) { if (result != null) {
context.showRoundDialog( context.showRoundDialog(
@@ -421,7 +423,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
break; break;
case DockerMenuType.restart: case DockerMenuType.restart:
context.showLoadingDialog(); context.showLoadingDialog();
final result = await Pros.docker.restart(dItem.containerId); final result = await _docker.restart(dItem.containerId);
context.pop(); context.pop();
if (result != null) { if (result != null) {
context.showRoundDialog( context.showRoundDialog(
@@ -476,8 +478,8 @@ class _DockerManagePageState extends State<DockerManagePage> {
Widget _buildEditHost() { Widget _buildEditHost() {
final children = <Widget>[]; final children = <Widget>[];
final emptyImgs = Pros.docker.images?.isEmpty ?? false; final emptyImgs = _docker.images?.isEmpty ?? false;
final emptyPs = Pros.docker.items?.isEmpty ?? false; final emptyPs = _docker.items?.isEmpty ?? false;
if (emptyPs && emptyImgs) { if (emptyPs && emptyImgs) {
children.add(Padding( children.add(Padding(
padding: const EdgeInsets.fromLTRB(17, 17, 17, 0), padding: const EdgeInsets.fromLTRB(17, 17, 17, 0),
@@ -522,6 +524,6 @@ class _DockerManagePageState extends State<DockerManagePage> {
void _onSaveDockerHost(String val) { void _onSaveDockerHost(String val) {
context.pop(); context.pop();
Stores.docker.put(widget.spi.id, val.trim()); Stores.docker.put(widget.spi.id, val.trim());
Pros.docker.refresh(); _docker.refresh();
} }
} }

View File

@@ -69,7 +69,7 @@ class _FullScreenPageState extends State<FullScreenPage> with AfterLayoutMixin {
double get _offset { double get _offset {
// based on screen width // based on screen width
final x = _screenWidth * 0.03; final x = _screenWidth * 0.03;
var r = Random().nextDouble(); final r = Random().nextDouble();
final n = Random().nextBool() ? -1 : 1; final n = Random().nextBool() ? -1 : 1;
return n * x * r; return n * x * r;
} }

View File

@@ -580,7 +580,7 @@ class _ServerPageState extends State<ServerPage>
if (Stores.setting.moveOutServerTabFuncBtns.fetch() && if (Stores.setting.moveOutServerTabFuncBtns.fetch() &&
// Discussion #146 // Discussion #146
!Stores.setting.serverTabUseOldUI.fetch()) { !Stores.setting.serverTabUseOldUI.fetch()) {
return 135; return 132;
} }
return 106; return 106;
} }

View File

@@ -181,7 +181,7 @@ class _SettingPageState extends State<SettingPage> {
]; ];
/// Platform specific settings /// Platform specific settings
if (OS.hasSettings) { if (OS.hasSpecSetting) {
children.add(_buildPlatformSetting()); children.add(_buildPlatformSetting());
} }
return Column( return Column(

View File

@@ -134,10 +134,10 @@ class _LocalStoragePageState extends State<LocalStoragePage> {
itemCount: files.length, itemCount: files.length,
padding: const EdgeInsets.symmetric(vertical: 3, horizontal: 7), padding: const EdgeInsets.symmetric(vertical: 3, horizontal: 7),
itemBuilder: (context, index) { itemBuilder: (context, index) {
var file = files[index]; final file = files[index];
var fileName = file.path.split('/').last; final fileName = file.path.split('/').last;
var stat = file.statSync(); final stat = file.statSync();
var isDir = stat.type == FileSystemEntityType.directory; final isDir = stat.type == FileSystemEntityType.directory;
return CardX( return CardX(
child: ListTile( child: ListTile(

View File

@@ -160,7 +160,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
Widget _buildAddBtn() { Widget _buildAddBtn() {
return IconButton( return IconButton(
onPressed: (() => context.showRoundDialog( onPressed: () => context.showRoundDialog(
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
@@ -176,7 +176,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
), ),
], ],
), ),
)), ),
icon: const Icon(Icons.add), icon: const Icon(Icons.add),
); );
} }

View File

@@ -21,13 +21,13 @@ class OmitStartText extends StatelessWidget {
int len = 0; int len = 0;
for (; !exceeded && len < text.length; len++) { for (; !exceeded && len < text.length; len++) {
// Build the textspan // Build the textspan
var span = TextSpan( final span = TextSpan(
text: 'A' * 7 + text.substring(text.length - len), text: 'A' * 7 + text.substring(text.length - len),
style: style ?? Theme.of(context).textTheme.bodyMedium, style: style ?? Theme.of(context).textTheme.bodyMedium,
); );
// Use a textpainter to determine if it will exceed max lines // Use a textpainter to determine if it will exceed max lines
var tp = TextPainter( final tp = TextPainter(
maxLines: maxLines ?? 1, maxLines: maxLines ?? 1,
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
text: span, text: span,

View File

@@ -205,7 +205,7 @@ Future<void> _gotoSSH(
extraArgs.addAll(["-i", path]); extraArgs.addAll(["-i", path]);
} }
List<String> sshCommand = ["ssh", "${spi.user}@${spi.ip}"] + extraArgs; final sshCommand = ["ssh", "${spi.user}@${spi.ip}"] + extraArgs;
final system = Platform.operatingSystem; final system = Platform.operatingSystem;
switch (system) { switch (system) {
case "windows": case "windows":

View File

@@ -28,7 +28,7 @@ class StoreSwitch extends StatelessWidget {
return Switch( return Switch(
value: value, value: value,
onChanged: (value) async { onChanged: (value) async {
if (validator != null && validator?.call(value) != true) return; if (validator?.call(value) == false) return;
await callback?.call(value); await callback?.call(value);
prop.put(value); prop.put(value);
}, },