opt.: mem usage

This commit is contained in:
lollipopkit
2023-09-13 15:22:48 +08:00
parent 278d5984b2
commit eb158e63a2
44 changed files with 333 additions and 360 deletions

View File

@@ -6,12 +6,7 @@ import 'package:toolbox/data/model/server/server_private_info.dart';
import 'package:toolbox/data/model/server/snippet.dart';
import 'package:toolbox/data/res/logger.dart';
import 'package:toolbox/data/res/path.dart';
import 'package:toolbox/data/store/docker.dart';
import 'package:toolbox/data/store/private_key.dart';
import 'package:toolbox/data/store/server.dart';
import 'package:toolbox/data/store/setting.dart';
import 'package:toolbox/data/store/snippet.dart';
import 'package:toolbox/locator.dart';
import 'package:toolbox/data/res/store.dart';
const backupFormatVersion = 1;
@@ -62,11 +57,11 @@ class Backup {
Backup.loadFromStore()
: version = backupFormatVersion,
date = DateTime.now().toString().split('.').first,
spis = _server.fetch(),
snippets = _snippet.fetch(),
keys = _privateKey.fetch(),
dockerHosts = _dockerHosts.fetchAll(),
settings = _setting.toJson();
spis = Stores.server.fetch(),
snippets = Stores.snippet.fetch(),
keys = Stores.key.fetch(),
dockerHosts = Stores.docker.fetchAll(),
settings = Stores.setting.toJson();
static Future<void> backup() async {
final result = _diyEncrtpt(json.encode(Backup.loadFromStore()));
@@ -75,18 +70,18 @@ class Backup {
Future<void> restore() async {
for (final s in snippets) {
_snippet.put(s);
Stores.snippet.put(s);
}
for (final s in spis) {
_server.put(s);
Stores.server.put(s);
}
for (final s in keys) {
_privateKey.put(s);
Stores.key.put(s);
}
for (final k in dockerHosts.keys) {
final val = dockerHosts[k];
if (val != null && val is String && val.isNotEmpty) {
_dockerHosts.put(k, val);
Stores.docker.put(k, val);
}
}
}
@@ -95,12 +90,6 @@ class Backup {
: this.fromJson(json.decode(_diyDecrypt(raw)));
}
final _server = locator<ServerStore>();
final _snippet = locator<SnippetStore>();
final _privateKey = locator<PrivateKeyStore>();
final _dockerHosts = locator<DockerStore>();
final _setting = locator<SettingStore>();
String _diyEncrtpt(String raw) => json.encode(
raw.codeUnits.map((e) => e * 2 + 1).toList(growable: false),
);

View File

@@ -109,8 +109,8 @@ Cpus parseBsdCpu(String raw) {
.allMatches(raw)
.map((e) => double.parse(e.group(1) ?? '0') * 100)
.toList();
if (percents.length != 3) return initCpuStatus;
return initCpuStatus
if (percents.length != 3) return InitStatus.cpus;
return InitStatus.cpus
..now = [
OneTimeCpuStatus('cpu', percents[0].toInt(), 0, 0,
percents[2].toInt() + percents[1].toInt(), 0, 0, 0)

View File

@@ -1,11 +1,10 @@
import '../../../locator.dart';
import '../../store/setting.dart';
import 'package:toolbox/data/res/store.dart';
class TryLimiter {
final Map<String, int> _triedTimes = {};
bool canTry(String id) {
final maxCount = locator<SettingStore>().maxRetryCount.fetch();
final maxCount = Stores.setting.maxRetryCount.fetch();
if (maxCount <= 0) {
return true;
}

View File

@@ -38,15 +38,9 @@ class DebugProvider extends ChangeNotifier {
}
void addMultiline(Object data, [Color color = Colors.blue]) {
final widget = Text(
'$data',
style: TextStyle(
color: color,
),
);
_addWidget(SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: widget,
child: Text('$data', style: TextStyle(color: color)),
));
}

View File

@@ -9,8 +9,7 @@ import 'package:toolbox/data/model/docker/image.dart';
import 'package:toolbox/data/model/docker/ps.dart';
import 'package:toolbox/data/model/app/error.dart';
import 'package:toolbox/data/res/logger.dart';
import 'package:toolbox/data/store/docker.dart';
import 'package:toolbox/locator.dart';
import 'package:toolbox/data/res/store.dart';
final _dockerNotFound = RegExp(r'command not found|Unknown command');
final _versionReg = RegExp(r'(Version:)\s+([0-9]+\.[0-9]+\.[0-9]+)');
@@ -19,8 +18,6 @@ final _editionReg = RegExp(r'Docker Engine - [a-zA-Z]+');
final _dockerPrefixReg = RegExp(r'(sudo )?docker ');
class DockerProvider extends ChangeNotifier {
final _dockerStore = locator<DockerStore>();
SSHClient? client;
String? userName;
List<DockerPsItem>? items;
@@ -177,7 +174,7 @@ class DockerProvider extends ChangeNotifier {
// judge whether to use DOCKER_HOST
String _wrap(String cmd) {
final dockerHost = _dockerStore.fetch(hostId!);
final dockerHost = Stores.docker.fetch(hostId!);
if (dockerHost == null || dockerHost.isEmpty) {
return cmd.withLangExport;
}

View File

@@ -1,26 +1,24 @@
import 'package:flutter/material.dart';
import 'package:toolbox/data/model/server/private_key_info.dart';
import 'package:toolbox/data/store/private_key.dart';
import 'package:toolbox/locator.dart';
import 'package:toolbox/data/res/store.dart';
class PrivateKeyProvider extends ChangeNotifier {
List<PrivateKeyInfo> get pkis => _pkis;
final _store = locator<PrivateKeyStore>();
late List<PrivateKeyInfo> _pkis;
void loadData() {
_pkis = _store.fetch();
_pkis = Stores.key.fetch();
}
void add(PrivateKeyInfo info) {
_pkis.add(info);
_store.put(info);
Stores.key.put(info);
notifyListeners();
}
void delete(PrivateKeyInfo info) {
_pkis.removeWhere((e) => e.id == info.id);
_store.delete(info);
Stores.key.delete(info);
notifyListeners();
}
@@ -31,7 +29,7 @@ class PrivateKeyProvider extends ChangeNotifier {
} else {
_pkis[idx] = newInfo;
}
_store.put(newInfo);
Stores.key.put(newInfo);
notifyListeners();
}
}

View File

@@ -4,19 +4,17 @@ import 'package:flutter/foundation.dart';
import 'package:toolbox/data/model/app/shell_func.dart';
import 'package:toolbox/data/model/server/system.dart';
import 'package:toolbox/data/res/logger.dart';
import 'package:toolbox/data/res/store.dart';
import '../../core/extension/order.dart';
import '../../core/extension/uint8list.dart';
import '../../core/utils/server.dart';
import '../../locator.dart';
import '../model/server/server.dart';
import '../model/server/server_private_info.dart';
import '../model/server/server_status_update_req.dart';
import '../model/server/snippet.dart';
import '../model/server/try_limiter.dart';
import '../res/status.dart';
import '../store/server.dart';
import '../store/setting.dart';
typedef ServersMap = Map<String, Server>;
@@ -32,20 +30,17 @@ class ServerProvider extends ChangeNotifier {
Timer? _timer;
final _serverStore = locator<ServerStore>();
final _settingStore = locator<SettingStore>();
Future<void> loadLocalData() async {
// Issue #147
// Clear all servers because of restarting app will cause duplicate servers
_servers.clear();
_serverOrder.clear();
final spis = _serverStore.fetch();
final spis = Stores.server.fetch();
for (final spi in spis) {
_servers[spi.id] = genServer(spi);
}
final serverOrder_ = _settingStore.serverOrder.fetch();
final serverOrder_ = Stores.setting.serverOrder.fetch();
if (serverOrder_.isNotEmpty) {
spis.reorder(
order: serverOrder_,
@@ -57,7 +52,7 @@ class ServerProvider extends ChangeNotifier {
}
// Must use [equals] to compare [Order] here.
if (!_serverOrder.equals(serverOrder_)) {
_settingStore.serverOrder.put(_serverOrder);
Stores.setting.serverOrder.put(_serverOrder);
}
_updateTags();
notifyListeners();
@@ -85,13 +80,13 @@ class ServerProvider extends ChangeNotifier {
s.spi.tags![i] = new_;
}
}
_serverStore.update(s.spi, s.spi);
Stores.server.update(s.spi, s.spi);
}
_updateTags();
}
Server genServer(ServerPrivateInfo spi) {
return Server(spi, initStatus, null, ServerState.disconnected);
return Server(spi, InitStatus.status, null, ServerState.disconnected);
}
/// if [spi] is specificed then only refresh this server
@@ -115,7 +110,7 @@ class ServerProvider extends ChangeNotifier {
}
Future<void> startAutoRefresh() async {
final duration = _settingStore.serverStatusUpdateInterval.fetch();
final duration = Stores.setting.serverStatusUpdateInterval.fetch();
stopAutoRefresh();
if (duration == 0) return;
_timer = Timer.periodic(Duration(seconds: duration), (_) async {
@@ -158,9 +153,9 @@ class ServerProvider extends ChangeNotifier {
void addServer(ServerPrivateInfo spi) {
_servers[spi.id] = genServer(spi);
notifyListeners();
_serverStore.put(spi);
Stores.server.put(spi);
_serverOrder.add(spi.id);
_settingStore.serverOrder.put(_serverOrder);
Stores.setting.serverOrder.put(_serverOrder);
_updateTags();
refreshData(spi: spi);
}
@@ -168,19 +163,19 @@ class ServerProvider extends ChangeNotifier {
void delServer(String id) {
_servers.remove(id);
_serverOrder.remove(id);
_settingStore.serverOrder.put(_serverOrder);
Stores.setting.serverOrder.put(_serverOrder);
_updateTags();
notifyListeners();
_serverStore.delete(id);
Stores.server.delete(id);
}
void deleteAll() {
_servers.clear();
_serverOrder.clear();
_settingStore.serverOrder.put(_serverOrder);
Stores.setting.serverOrder.put(_serverOrder);
_updateTags();
notifyListeners();
_serverStore.deleteAll();
Stores.server.deleteAll();
}
Future<void> updateServer(
@@ -188,7 +183,7 @@ class ServerProvider extends ChangeNotifier {
ServerPrivateInfo newSpi,
) async {
if (old != newSpi) {
_serverStore.update(old, newSpi);
Stores.server.update(old, newSpi);
_servers[old.id]?.spi = newSpi;
if (newSpi.id != old.id) {
@@ -196,14 +191,14 @@ class ServerProvider extends ChangeNotifier {
_servers[newSpi.id]?.spi = newSpi;
_servers.remove(old.id);
_serverOrder.update(old.id, newSpi.id);
_settingStore.serverOrder.put(_serverOrder);
Stores.setting.serverOrder.put(_serverOrder);
}
// Only reconnect if neccessary
if (newSpi.shouldReconnect(old)) {
_servers[newSpi.id]?.client = await genClient(
newSpi,
timeout: _settingStore.timeoutD,
timeout: Stores.setting.timeoutD,
);
refreshData(spi: newSpi);
}
@@ -239,7 +234,7 @@ class ServerProvider extends ChangeNotifier {
try {
s.client = await genClient(
spi,
timeout: _settingStore.timeoutD,
timeout: Stores.setting.timeoutD,
);
} catch (e) {
_limiter.inc(sid);

View File

@@ -2,11 +2,9 @@ import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:toolbox/data/model/server/snippet.dart';
import 'package:toolbox/data/store/snippet.dart';
import 'package:toolbox/locator.dart';
import 'package:toolbox/data/res/store.dart';
import '../../core/extension/order.dart';
import '../store/setting.dart';
class SnippetProvider extends ChangeNotifier {
late Order<Snippet> _snippets;
@@ -15,20 +13,17 @@ class SnippetProvider extends ChangeNotifier {
final _tags = <String>[];
List<String> get tags => _tags;
final _store = locator<SnippetStore>();
final _setting = locator<SettingStore>();
void loadData() {
_snippets = _store.fetch();
final order = _setting.snippetOrder.fetch();
_snippets = Stores.snippet.fetch();
final order = Stores.setting.snippetOrder.fetch();
if (order.isNotEmpty) {
final surplus = _snippets.reorder(
order: order,
finder: (n, name) => n.name == name,
);
order.removeWhere((e) => surplus.any((ele) => ele == e));
if (order != _setting.snippetOrder.fetch()) {
_setting.snippetOrder.put(order);
if (order != Stores.setting.snippetOrder.fetch()) {
Stores.setting.snippetOrder.put(order);
}
}
_addInternal();
@@ -36,12 +31,12 @@ class SnippetProvider extends ChangeNotifier {
}
void _addInternal() {
if (!_setting.fTISBM.fetch()) {
if (!Stores.setting.fTISBM.fetch()) {
return;
}
_snippets.add(installSBM);
_store.put(installSBM);
_setting.fTISBM.put(false);
Stores.snippet.put(installSBM);
Stores.setting.fTISBM.put(false);
}
void _updateTags() {
@@ -58,21 +53,21 @@ class SnippetProvider extends ChangeNotifier {
void add(Snippet snippet) {
_snippets.add(snippet);
_store.put(snippet);
Stores.snippet.put(snippet);
_updateTags();
notifyListeners();
}
void del(Snippet snippet) {
_snippets.remove(snippet);
_store.delete(snippet);
Stores.snippet.delete(snippet);
_updateTags();
notifyListeners();
}
void update(Snippet old, Snippet newOne) {
_store.delete(old);
_store.put(newOne);
Stores.snippet.delete(old);
Stores.snippet.put(newOne);
_snippets.remove(old);
_snippets.add(newOne);
_updateTags();
@@ -84,7 +79,7 @@ class SnippetProvider extends ChangeNotifier {
if (s.tags?.contains(old) ?? false) {
s.tags?.remove(old);
s.tags?.add(newOne);
_store.put(s);
Stores.snippet.put(s);
}
}
_updateTags();

View File

@@ -1,9 +1,7 @@
import 'package:flutter/widgets.dart';
import 'package:toolbox/data/res/store.dart';
import 'package:xterm/core.dart';
import '../../locator.dart';
import '../store/setting.dart';
class VirtualKeyboard extends TerminalInputHandler with ChangeNotifier {
VirtualKeyboard();
@@ -25,8 +23,6 @@ class VirtualKeyboard extends TerminalInputHandler with ChangeNotifier {
}
}
final _setting = locator<SettingStore>();
void reset(TerminalKeyboardEvent e) {
if (e.ctrl) {
ctrl = false;
@@ -43,7 +39,7 @@ class VirtualKeyboard extends TerminalInputHandler with ChangeNotifier {
ctrl: event.ctrl || ctrl,
alt: event.alt || alt,
);
if (_setting.sshVirtualKeyAutoOff.fetch()) {
if (Stores.setting.sshVirtualKeyAutoOff.fetch()) {
reset(e);
}
return defaultInputHandler.call(e);

View File

@@ -2,9 +2,9 @@
class BuildData {
static const String name = "ServerBox";
static const int build = 547;
static const int build = 550;
static const String engine = "3.13.2";
static const String buildAt = "2023-09-12 14:04:07.018274";
static const int modifications = 4;
static const int script = 14;
static const String buildAt = "2023-09-13 15:19:48";
static const int modifications = 45;
static const int script = 15;
}

View File

@@ -5,6 +5,8 @@ import '../model/app/dynamic_color.dart';
late Color primaryColor;
class DynamicColors {
const DynamicColors._();
static const content = DynamicColor(Colors.black87, Colors.white70);
static const bg = DynamicColor(Colors.white, Colors.black);
static const progress = DynamicColor(Colors.black12, Colors.white10);

View File

@@ -3,6 +3,8 @@ import 'dart:ui';
import 'package:toolbox/data/model/ssh/virtual_key.dart';
class Defaults {
const Defaults._();
// default server details page cards order
static const detailCardOrder = [
'uptime',

View File

@@ -1,8 +1,10 @@
import 'package:toolbox/data/model/app/github_id.dart';
class GithubIds {
const GithubIds._();
// Thanks
// If you want to change the url, please open an issue.
// If you want to change the url, please open an issue.
static const contributors = <GhId>{
'its-tom',
'RainSunMe',

View File

@@ -33,6 +33,8 @@ import 'package:highlight/languages/xml.dart';
import 'package:highlight/languages/yaml.dart';
class Highlights {
const Highlights._();
/// - KEY: fileNameSuffix
/// - VAL: highlight
static final all = {

View File

@@ -1,6 +1,8 @@
import 'package:logging/logging.dart';
class Loggers {
const Loggers._();
static final app = Logger('App');
static final parse = Logger('Parse');
}

View File

@@ -3,6 +3,8 @@ import 'dart:convert';
import 'package:flutter/services.dart';
class Miscs {
const Miscs._();
/// RegExp for number
static final numReg = RegExp(r'\s{1,}');

View File

@@ -4,6 +4,8 @@ import 'package:path_provider/path_provider.dart';
import 'package:toolbox/core/utils/platform.dart';
class Paths {
const Paths._();
static String? _docDir;
static String? _sftpDir;
static String? _fontDir;

View File

@@ -8,59 +8,61 @@ import '../model/server/server_status.dart';
import '../model/server/conn.dart';
import '../model/server/system.dart';
Memory get _initMemory => const Memory(
total: 1,
free: 1,
cache: 0,
avail: 1,
);
OneTimeCpuStatus get _initOneTimeCpuStatus => OneTimeCpuStatus(
'cpu',
0,
0,
0,
0,
0,
0,
0,
);
Cpus get initCpuStatus => Cpus(
[_initOneTimeCpuStatus],
[_initOneTimeCpuStatus],
);
NetSpeedPart get _initNetSpeedPart => NetSpeedPart(
'',
BigInt.zero,
BigInt.zero,
0,
);
NetSpeed get initNetSpeed => NetSpeed(
[_initNetSpeedPart],
[_initNetSpeedPart],
);
Swap get _initSwap => const Swap(
total: 0,
free: 0,
cached: 0,
);
ServerStatus get initStatus => ServerStatus(
cpu: initCpuStatus,
mem: _initMemory,
sysVer: 'Loading...',
uptime: '',
disk: [
const Disk(
path: '/',
loc: '/',
usedPercent: 0,
used: '0',
size: '0',
avail: '0',
)
],
tcp: const Conn(maxConn: 0, active: 0, passive: 0, fail: 0),
netSpeed: initNetSpeed,
swap: _initSwap,
system: SystemType.linux,
temps: Temperatures(),
);
class InitStatus {
const InitStatus._();
static OneTimeCpuStatus get _initOneTimeCpuStatus => OneTimeCpuStatus(
'cpu',
0,
0,
0,
0,
0,
0,
0,
);
static Cpus get cpus => Cpus(
[_initOneTimeCpuStatus],
[_initOneTimeCpuStatus],
);
static NetSpeedPart get _initNetSpeedPart => NetSpeedPart(
'',
BigInt.zero,
BigInt.zero,
0,
);
static NetSpeed get netSpeed => NetSpeed(
[_initNetSpeedPart],
[_initNetSpeedPart],
);
static ServerStatus get status => ServerStatus(
cpu: cpus,
mem: const Memory(
total: 1,
free: 1,
cache: 0,
avail: 1,
),
sysVer: 'Loading...',
uptime: '',
disk: [
const Disk(
path: '/',
loc: '/',
usedPercent: 0,
used: '0',
size: '0',
avail: '0',
)
],
tcp: const Conn(maxConn: 0, active: 0, passive: 0, fail: 0),
netSpeed: netSpeed,
swap: const Swap(
total: 0,
free: 0,
cached: 0,
),
system: SystemType.linux,
temps: Temperatures(),
);
}

18
lib/data/res/store.dart Normal file
View File

@@ -0,0 +1,18 @@
import 'package:toolbox/data/store/docker.dart';
import 'package:toolbox/data/store/history.dart';
import 'package:toolbox/data/store/private_key.dart';
import 'package:toolbox/data/store/server.dart';
import 'package:toolbox/data/store/setting.dart';
import 'package:toolbox/data/store/snippet.dart';
import 'package:toolbox/locator.dart';
class Stores {
const Stores._();
static final setting = locator<SettingStore>();
static final server = locator<ServerStore>();
static final docker = locator<DockerStore>();
static final history = locator<HistoryStore>();
static final key = locator<PrivateKeyStore>();
static final snippet = locator<SnippetStore>();
}

View File

@@ -1,54 +1,57 @@
import 'package:flutter/material.dart';
import 'package:xterm/ui.dart';
const termDarkTheme = TerminalTheme(
cursor: Color.fromARGB(137, 174, 175, 173),
selection: Color.fromARGB(147, 174, 175, 173),
foreground: Color(0XFFCCCCCC),
background: Colors.black,
searchHitBackground: Color(0XFFFFFF2B),
searchHitBackgroundCurrent: Color(0XFF31FF26),
searchHitForeground: Color(0XFF000000),
red: Color.fromARGB(255, 194, 54, 33),
green: Color.fromARGB(255, 37, 188, 36),
yellow: Color.fromARGB(255, 173, 173, 39),
blue: Color.fromARGB(255, 73, 46, 225),
magenta: Color.fromARGB(255, 211, 56, 211),
cyan: Color.fromARGB(255, 51, 187, 200),
white: Color.fromARGB(255, 203, 204, 205),
brightBlack: Color.fromARGB(255, 129, 131, 131),
brightRed: Color.fromARGB(255, 252, 57, 31),
brightGreen: Color.fromARGB(255, 49, 231, 34),
brightYellow: Color.fromARGB(255, 234, 236, 35),
brightBlue: Color.fromARGB(255, 88, 51, 255),
brightMagenta: Color.fromARGB(255, 249, 53, 248),
brightCyan: Color.fromARGB(255, 20, 240, 240),
brightWhite: Color.fromARGB(255, 233, 235, 235),
black: Colors.black,
);
class TerminalThemes {
const TerminalThemes._();
const termLightTheme = TerminalTheme(
cursor: Color.fromARGB(153, 174, 175, 173),
selection: Color.fromARGB(102, 174, 175, 173),
foreground: Color(0XFF000000),
background: Color(0XFFFFFFFF),
searchHitBackground: Color(0XFFFFFF2B),
searchHitBackgroundCurrent: Color(0XFF31FF26),
searchHitForeground: Color(0XFF000000),
red: Color.fromARGB(255, 194, 54, 33),
green: Color.fromARGB(255, 37, 188, 36),
yellow: Color.fromARGB(255, 173, 173, 39),
blue: Color.fromARGB(255, 73, 46, 225),
magenta: Color.fromARGB(255, 211, 56, 211),
cyan: Color.fromARGB(255, 51, 187, 200),
white: Color.fromARGB(255, 203, 204, 205),
brightBlack: Color.fromARGB(255, 129, 131, 131),
brightRed: Color.fromARGB(255, 252, 57, 31),
brightGreen: Color.fromARGB(255, 49, 231, 34),
brightYellow: Color.fromARGB(255, 234, 236, 35),
brightBlue: Color.fromARGB(255, 88, 51, 255),
brightMagenta: Color.fromARGB(255, 249, 53, 248),
brightCyan: Color.fromARGB(255, 20, 240, 240),
brightWhite: Color.fromARGB(255, 233, 235, 235),
black: Colors.black,
);
static const dark = TerminalTheme(
cursor: Color.fromARGB(137, 174, 175, 173),
selection: Color.fromARGB(147, 174, 175, 173),
foreground: Color(0XFFCCCCCC),
background: Colors.black,
searchHitBackground: Color(0XFFFFFF2B),
searchHitBackgroundCurrent: Color(0XFF31FF26),
searchHitForeground: Color(0XFF000000),
red: Color.fromARGB(255, 194, 54, 33),
green: Color.fromARGB(255, 37, 188, 36),
yellow: Color.fromARGB(255, 173, 173, 39),
blue: Color.fromARGB(255, 73, 46, 225),
magenta: Color.fromARGB(255, 211, 56, 211),
cyan: Color.fromARGB(255, 51, 187, 200),
white: Color.fromARGB(255, 203, 204, 205),
brightBlack: Color.fromARGB(255, 129, 131, 131),
brightRed: Color.fromARGB(255, 252, 57, 31),
brightGreen: Color.fromARGB(255, 49, 231, 34),
brightYellow: Color.fromARGB(255, 234, 236, 35),
brightBlue: Color.fromARGB(255, 88, 51, 255),
brightMagenta: Color.fromARGB(255, 249, 53, 248),
brightCyan: Color.fromARGB(255, 20, 240, 240),
brightWhite: Color.fromARGB(255, 233, 235, 235),
black: Colors.black,
);
static const light = TerminalTheme(
cursor: Color.fromARGB(153, 174, 175, 173),
selection: Color.fromARGB(102, 174, 175, 173),
foreground: Color(0XFF000000),
background: Color(0XFFFFFFFF),
searchHitBackground: Color(0XFFFFFF2B),
searchHitBackgroundCurrent: Color(0XFF31FF26),
searchHitForeground: Color(0XFF000000),
red: Color.fromARGB(255, 194, 54, 33),
green: Color.fromARGB(255, 37, 188, 36),
yellow: Color.fromARGB(255, 173, 173, 39),
blue: Color.fromARGB(255, 73, 46, 225),
magenta: Color.fromARGB(255, 211, 56, 211),
cyan: Color.fromARGB(255, 51, 187, 200),
white: Color.fromARGB(255, 203, 204, 205),
brightBlack: Color.fromARGB(255, 129, 131, 131),
brightRed: Color.fromARGB(255, 252, 57, 31),
brightGreen: Color.fromARGB(255, 49, 231, 34),
brightYellow: Color.fromARGB(255, 234, 236, 35),
brightBlue: Color.fromARGB(255, 88, 51, 255),
brightMagenta: Color.fromARGB(255, 249, 53, 248),
brightCyan: Color.fromARGB(255, 20, 240, 240),
brightWhite: Color.fromARGB(255, 233, 235, 235),
black: Colors.black,
);
}

View File

@@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
class UIs {
const UIs._();
/// Font style
static const textSize9Grey = TextStyle(color: Colors.grey, fontSize: 9);

View File

@@ -1,4 +1,6 @@
class Urls {
const Urls._();
static const resBase = 'https://res.lolli.tech/serverbox';
static const myGithub = 'https://github.com/lollipopkit';
static const appHelp = '$myGithub/flutter_server_box#-help';