This commit is contained in:
lollipopkit
2023-05-08 16:25:31 +08:00
parent a2361da560
commit 7f16c27dcf
25 changed files with 634 additions and 572 deletions

View File

@@ -359,7 +359,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 = 287; CURRENT_PROJECT_VERSION = 288;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -367,7 +367,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.287; MARKETING_VERSION = 1.0.288;
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";
@@ -490,7 +490,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 = 287; CURRENT_PROJECT_VERSION = 288;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -498,7 +498,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.287; MARKETING_VERSION = 1.0.288;
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";
@@ -515,7 +515,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 = 287; CURRENT_PROJECT_VERSION = 288;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -523,7 +523,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.287; MARKETING_VERSION = 1.0.288;
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";

View File

@@ -166,9 +166,9 @@ void showSnippetDialog(
showRoundDialog( showRoundDialog(
context: context, context: context,
title: Text(s.chooseDestination), title: Text(s.chooseDestination),
child: buildPicker( child: Picker(
provider.snippets.map((e) => Text(e.name)).toList(), items: provider.snippets.map((e) => Text(e.name)).toList(),
(idx) => snippet = provider.snippets[idx], onSelected: (idx) => snippet = provider.snippets[idx],
), ),
actions: [ actions: [
TextButton( TextButton(

View File

@@ -5,28 +5,29 @@ import 'package:toolbox/locator.dart';
class PrivateKeyProvider extends BusyProvider { class PrivateKeyProvider extends BusyProvider {
List<PrivateKeyInfo> get infos => _infos; List<PrivateKeyInfo> get infos => _infos;
final _store = locator<PrivateKeyStore>();
late List<PrivateKeyInfo> _infos; late List<PrivateKeyInfo> _infos;
void loadData() { void loadData() {
_infos = locator<PrivateKeyStore>().fetch(); _infos = _store.fetch();
} }
void addInfo(PrivateKeyInfo info) { void addInfo(PrivateKeyInfo info) {
_infos.add(info); _infos.add(info);
locator<PrivateKeyStore>().put(info); _store.put(info);
notifyListeners(); notifyListeners();
} }
void delInfo(PrivateKeyInfo info) { void delInfo(PrivateKeyInfo info) {
_infos.removeWhere((e) => e.id == info.id); _infos.removeWhere((e) => e.id == info.id);
locator<PrivateKeyStore>().delete(info); _store.delete(info);
notifyListeners(); notifyListeners();
} }
void updateInfo(PrivateKeyInfo old, PrivateKeyInfo newInfo) { void updateInfo(PrivateKeyInfo old, PrivateKeyInfo newInfo) {
final idx = _infos.indexWhere((e) => e.id == old.id); final idx = _infos.indexWhere((e) => e.id == old.id);
_infos[idx] = newInfo; _infos[idx] = newInfo;
locator<PrivateKeyStore>().put(newInfo); _store.put(newInfo);
notifyListeners(); notifyListeners();
} }
} }

View File

@@ -22,15 +22,18 @@ typedef ServersMap = Map<String, Server>;
class ServerProvider extends BusyProvider { class ServerProvider extends BusyProvider {
final ServersMap _servers = {}; final ServersMap _servers = {};
ServersMap get servers => _servers; ServersMap get servers => _servers;
final _limiter = TryLimiter(); final _limiter = TryLimiter();
Timer? _timer; Timer? _timer;
final _logger = Logger('SERVER'); final _logger = Logger('SERVER');
final _store = locator<ServerStore>();
Future<void> loadLocalData() async { Future<void> loadLocalData() async {
setBusyState(true); setBusyState(true);
final infos = locator<ServerStore>().fetch(); final infos = _store.fetch();
for (final info in infos) { for (final info in infos) {
_servers[info.id] = genServer(info); _servers[info.id] = genServer(info);
} }
@@ -103,20 +106,20 @@ class ServerProvider extends BusyProvider {
void addServer(ServerPrivateInfo spi) { void addServer(ServerPrivateInfo spi) {
_servers[spi.id] = genServer(spi); _servers[spi.id] = genServer(spi);
notifyListeners(); notifyListeners();
locator<ServerStore>().put(spi); _store.put(spi);
refreshData(spi: spi); refreshData(spi: spi);
} }
void delServer(String id) { void delServer(String id) {
_servers.remove(id); _servers.remove(id);
notifyListeners(); notifyListeners();
locator<ServerStore>().delete(id); _store.delete(id);
} }
Future<void> updateServer( Future<void> updateServer(
ServerPrivateInfo old, ServerPrivateInfo newSpi) async { ServerPrivateInfo old, ServerPrivateInfo newSpi) async {
_servers.remove(old.id); _servers.remove(old.id);
locator<ServerStore>().update(old, newSpi); _store.update(old, newSpi);
_servers[newSpi.id] = genServer(newSpi); _servers[newSpi.id] = genServer(newSpi);
_servers[newSpi.id]?.client = await genClient(newSpi); _servers[newSpi.id]?.client = await genClient(newSpi);
notifyListeners(); notifyListeners();

View File

@@ -7,23 +7,24 @@ import 'package:toolbox/locator.dart';
class SnippetProvider extends BusyProvider { class SnippetProvider extends BusyProvider {
List<Snippet> get snippets => _snippets; List<Snippet> get snippets => _snippets;
final _store = locator<SnippetStore>();
late List<Snippet> _snippets; late List<Snippet> _snippets;
void loadData() { void loadData() {
_snippets = locator<SnippetStore>().fetch(); _snippets = _store.fetch();
} }
void add(Snippet snippet) { void add(Snippet snippet) {
if (have(snippet)) return; if (have(snippet)) return;
_snippets.add(snippet); _snippets.add(snippet);
locator<SnippetStore>().put(snippet); _store.put(snippet);
notifyListeners(); notifyListeners();
} }
void del(Snippet snippet) { void del(Snippet snippet) {
if (!have(snippet)) return; if (!have(snippet)) return;
_snippets.removeAt(index(snippet)); _snippets.removeAt(index(snippet));
locator<SnippetStore>().delete(snippet); _store.delete(snippet);
notifyListeners(); notifyListeners();
} }
@@ -38,7 +39,7 @@ class SnippetProvider extends BusyProvider {
void update(Snippet old, Snippet newOne) { void update(Snippet old, Snippet newOne) {
if (!have(old)) return; if (!have(old)) return;
_snippets[index(old)] = newOne; _snippets[index(old)] = newOne;
locator<SnippetStore>().put(newOne); _store.put(newOne);
notifyListeners(); notifyListeners();
} }

View File

@@ -2,8 +2,8 @@
class BuildData { class BuildData {
static const String name = "ServerBox"; static const String name = "ServerBox";
static const int build = 287; static const int build = 288;
static const String engine = "3.7.11"; static const String engine = "3.7.11";
static const String buildAt = "2023-05-07 18:25:45.312302"; static const String buildAt = "2023-05-07 20:47:03.124092";
static const int modifications = 2; static const int modifications = 1;
} }

View File

@@ -33,3 +33,15 @@ const popMenuChild = Padding(
size: 21, size: 21,
), ),
); );
const centerLoading = Center(child: CircularProgressIndicator());
const centerSizedLoading = SizedBox(
width: 77,
height: 77,
child: Center(
child: CircularProgressIndicator(),
),
);
const loadingIcon = IconButton(onPressed: null, icon: centerLoading);

View File

@@ -6,6 +6,7 @@ const issueUrl = '$myGithub/flutter_server_box/issues';
// Thanks // Thanks
const thanksMap = { const thanksMap = {
'its-tom': 'https://github.com/its-tom',
'RainSunMe': 'https://github.com/RainSunMe', 'RainSunMe': 'https://github.com/RainSunMe',
'fecture': 'https://github.com/fecture', 'fecture': 'https://github.com/fecture',
'Tao173': 'https://github.com/Tao173', 'Tao173': 'https://github.com/Tao173',

View File

@@ -32,13 +32,18 @@ class BackupPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final media = MediaQuery.of(context);
final s = S.of(context)!; final s = S.of(context)!;
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(s.backupAndRestore, style: textSize18), title: Text(s.backupAndRestore, style: textSize18),
), ),
body: Center( body: _buildBody(context, s),
);
}
Widget _buildBody(BuildContext context, S s) {
final media = MediaQuery.of(context);
return Center(
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
@@ -96,8 +101,7 @@ class BackupPage extends StatelessWidget {
}, },
) )
], ],
)), ));
);
} }
Widget _buildCard(String text, IconData icon, MediaQueryData media, Widget _buildCard(String text, IconData icon, MediaQueryData media,

View File

@@ -89,7 +89,7 @@ class _ConvertPageState extends State<ConvertPage>
Widget _buildInputTop() { Widget _buildInputTop() {
return SizedBox( return SizedBox(
height: _media.size.height * 0.33, height: _media.size.height * 0.33,
child: buildInput(controller: _textEditingController), child: Input(controller: _textEditingController),
); );
} }
@@ -163,7 +163,7 @@ class _ConvertPageState extends State<ConvertPage>
Widget _buildResult() { Widget _buildResult() {
return SizedBox( return SizedBox(
height: _media.size.height * 0.33, height: _media.size.height * 0.33,
child: buildInput(controller: _textEditingControllerResult), child: Input(controller: _textEditingControllerResult),
); );
} }

View File

@@ -15,7 +15,6 @@ import '../../data/res/ui.dart';
import '../../data/res/url.dart'; import '../../data/res/url.dart';
import '../../data/store/docker.dart'; import '../../data/store/docker.dart';
import '../../locator.dart'; import '../../locator.dart';
import '../widget/center_loading.dart';
import '../widget/dropdown_menu.dart'; import '../widget/dropdown_menu.dart';
import '../widget/round_rect_card.dart'; import '../widget/round_rect_card.dart';
import '../widget/two_line_text.dart'; import '../widget/two_line_text.dart';
@@ -95,26 +94,23 @@ class _DockerManagePageState extends State<DockerManagePage> {
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
buildInput( Input(
type: TextInputType.text, type: TextInputType.text,
label: _s.dockerImage, label: _s.dockerImage,
hint: 'xxx:1.1', hint: 'xxx:1.1',
controller: imageCtrl, controller: imageCtrl,
autoCorrect: false,
), ),
buildInput( Input(
type: TextInputType.text, type: TextInputType.text,
controller: nameCtrl, controller: nameCtrl,
label: _s.dockerContainerName, label: _s.dockerContainerName,
hint: 'xxx', hint: 'xxx',
autoCorrect: false,
), ),
buildInput( Input(
type: TextInputType.text, type: TextInputType.text,
controller: argsCtrl, controller: argsCtrl,
label: _s.extraArgs, label: _s.extraArgs,
hint: '-p 2222:22 -v ~/.xxx/:/xxx', hint: '-p 2222:22 -v ~/.xxx/:/xxx',
autoCorrect: false,
), ),
], ],
), ),
@@ -206,7 +202,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
await showRoundDialog( await showRoundDialog(
context: context, context: context,
title: Text(widget.spi.user), title: Text(widget.spi.user),
child: buildInput( child: Input(
controller: _textController, controller: _textController,
type: TextInputType.visiblePassword, type: TextInputType.visiblePassword,
obscureText: true, obscureText: true,
@@ -379,9 +375,8 @@ class _DockerManagePageState extends State<DockerManagePage> {
await showRoundDialog( await showRoundDialog(
context: context, context: context,
title: Text(_s.dockerEditHost), title: Text(_s.dockerEditHost),
child: buildInput( child: Input(
maxLines: 1, maxLines: 1,
autoCorrect: false,
controller: controller:
TextEditingController(text: 'unix:///run/user/1000/docker.sock'), TextEditingController(text: 'unix:///run/user/1000/docker.sock'),
onSubmitted: (value) { onSubmitted: (value) {

View File

@@ -57,7 +57,7 @@ class _PingPageState extends State<PingPage>
child: Column( child: Column(
children: [ children: [
const SizedBox(height: 13), const SizedBox(height: 13),
buildInput( Input(
controller: _textEditingController, controller: _textEditingController,
hint: s.inputDomainHere, hint: s.inputDomainHere,
maxLines: 1, maxLines: 1,

View File

@@ -12,7 +12,6 @@ import '../../data/provider/pkg.dart';
import '../../data/provider/server.dart'; import '../../data/provider/server.dart';
import '../../data/res/ui.dart'; import '../../data/res/ui.dart';
import '../../locator.dart'; import '../../locator.dart';
import '../widget/center_loading.dart';
import '../widget/round_rect_card.dart'; import '../widget/round_rect_card.dart';
import '../widget/two_line_text.dart'; import '../widget/two_line_text.dart';
@@ -31,7 +30,7 @@ class _PkgManagePageState extends State<PkgManagePage>
final _scrollController = ScrollController(); final _scrollController = ScrollController();
final _scrollControllerUpdate = ScrollController(); final _scrollControllerUpdate = ScrollController();
final _textController = TextEditingController(); final _textController = TextEditingController();
final _aptProvider = locator<PkgProvider>(); final _pkgProvider = locator<PkgProvider>();
late S _s; late S _s;
@override @override
@@ -44,7 +43,7 @@ class _PkgManagePageState extends State<PkgManagePage>
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
locator<PkgProvider>().clear(); _pkgProvider.clear();
} }
@override @override
@@ -57,7 +56,7 @@ class _PkgManagePageState extends State<PkgManagePage>
return; return;
} }
_aptProvider.init( _pkgProvider.init(
si.client!, si.client!,
si.status.sysVer.dist, si.status.sysVer.dist,
() => () =>
@@ -67,7 +66,21 @@ class _PkgManagePageState extends State<PkgManagePage>
onPwdRequest, onPwdRequest,
widget.spi.user, widget.spi.user,
); );
_aptProvider.refresh(); _pkgProvider.refresh();
}
@override
Widget build(BuildContext context) {
return Consumer<PkgProvider>(builder: (_, pkg, __) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: TwoLineText(up: _s.pkg, down: widget.spi.name),
),
body: _buildBody(pkg),
floatingActionButton: _buildFAB(pkg),
);
});
} }
void onSubmitted() { void onSubmitted() {
@@ -92,7 +105,7 @@ class _PkgManagePageState extends State<PkgManagePage>
await showRoundDialog( await showRoundDialog(
context: context, context: context,
title: Text(widget.spi.user), title: Text(widget.spi.user),
child: buildInput( child: Input(
controller: _textController, controller: _textController,
type: TextInputType.visiblePassword, type: TextInputType.visiblePassword,
obscureText: true, obscureText: true,
@@ -118,20 +131,6 @@ class _PkgManagePageState extends State<PkgManagePage>
return _textController.text.trim(); return _textController.text.trim();
} }
@override
Widget build(BuildContext context) {
return Consumer<PkgProvider>(builder: (_, pkg, __) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: TwoLineText(up: _s.pkg, down: widget.spi.name),
),
body: _buildBody(pkg),
floatingActionButton: _buildFAB(pkg),
);
});
}
Widget _buildFAB(PkgProvider pkg) { Widget _buildFAB(PkgProvider pkg) {
if (pkg.isBusy || (pkg.upgradeable?.isEmpty ?? true)) { if (pkg.isBusy || (pkg.upgradeable?.isEmpty ?? true)) {
return const SizedBox(); return const SizedBox();

View File

@@ -61,7 +61,14 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: _buildAppBar(),
body: _buildBody(),
floatingActionButton: _buildFAB(),
);
}
PreferredSizeWidget _buildAppBar() {
return AppBar(
title: Text(_s.edit, style: textSize18), title: Text(_s.edit, style: textSize18),
actions: [ actions: [
widget.info != null widget.info != null
@@ -74,11 +81,58 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage>
icon: const Icon(Icons.delete)) icon: const Icon(Icons.delete))
: const SizedBox() : const SizedBox()
], ],
);
}
Widget _buildFAB() {
return FloatingActionButton(
tooltip: _s.save,
onPressed: () async {
final name = _nameController.text;
final key = _keyController.text.trim();
final pwd = _pwdController.text;
if (name.isEmpty || key.isEmpty) {
showSnackBar(context, Text(_s.fieldMustNotEmpty));
return;
}
FocusScope.of(context).unfocus();
setState(() {
_loading = const SizedBox(
height: 50,
child: Center(
child: CircularProgressIndicator(),
), ),
body: ListView( );
});
final info = PrivateKeyInfo(name, key, '');
bool haveErr = false;
try {
info.privateKey = await compute(decyptPem, [key, pwd]);
} catch (e) {
showSnackBar(context, Text(e.toString()));
haveErr = true;
} finally {
setState(() {
_loading = const SizedBox();
});
}
if (haveErr) return;
if (widget.info != null) {
_provider.updateInfo(widget.info!, info);
} else {
_provider.addInfo(info);
}
context.pop();
},
child: const Icon(Icons.save),
);
}
Widget _buildBody() {
return ListView(
padding: const EdgeInsets.all(13), padding: const EdgeInsets.all(13),
children: [ children: [
buildInput( Input(
controller: _nameController, controller: _nameController,
type: TextInputType.text, type: TextInputType.text,
node: _nameNode, node: _nameNode,
@@ -86,9 +140,8 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage>
label: _s.name, label: _s.name,
icon: Icons.info, icon: Icons.info,
), ),
buildInput( Input(
controller: _keyController, controller: _keyController,
autoCorrect: false,
minLines: 3, minLines: 3,
maxLines: 10, maxLines: 10,
type: TextInputType.text, type: TextInputType.text,
@@ -129,9 +182,8 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage>
}, },
child: Text(_s.pickFile), child: Text(_s.pickFile),
), ),
buildInput( Input(
controller: _pwdController, controller: _pwdController,
autoCorrect: false,
type: TextInputType.text, type: TextInputType.text,
node: _pwdNode, node: _pwdNode,
obscureText: true, obscureText: true,
@@ -141,48 +193,6 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage>
SizedBox(height: MediaQuery.of(context).size.height * 0.1), SizedBox(height: MediaQuery.of(context).size.height * 0.1),
_loading _loading
], ],
),
floatingActionButton: FloatingActionButton(
tooltip: _s.save,
onPressed: () async {
final name = _nameController.text;
final key = _keyController.text.trim();
final pwd = _pwdController.text;
if (name.isEmpty || key.isEmpty) {
showSnackBar(context, Text(_s.fieldMustNotEmpty));
return;
}
FocusScope.of(context).unfocus();
setState(() {
_loading = const SizedBox(
height: 50,
child: Center(
child: CircularProgressIndicator(),
),
);
});
final info = PrivateKeyInfo(name, key, '');
bool haveErr = false;
try {
info.privateKey = await compute(decyptPem, [key, pwd]);
} catch (e) {
showSnackBar(context, Text(e.toString()));
haveErr = true;
} finally {
setState(() {
_loading = const SizedBox();
});
}
if (haveErr) return;
if (widget.info != null) {
_provider.updateInfo(widget.info!, info);
} else {
_provider.addInfo(info);
}
context.pop();
},
child: const Icon(Icons.save),
),
); );
} }

View File

@@ -30,7 +30,19 @@ class _PrivateKeyListState extends State<PrivateKeysListPage> {
appBar: AppBar( appBar: AppBar(
title: Text(_s.privateKey, style: textSize18), title: Text(_s.privateKey, style: textSize18),
), ),
body: Consumer<PrivateKeyProvider>( body: _buildBody(),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.add),
onPressed: () => AppRoute(
const PrivateKeyEditPage(),
'private key edit page',
).go(context),
),
);
}
Widget _buildBody() {
return Consumer<PrivateKeyProvider>(
builder: (_, key, __) { builder: (_, key, __) {
if (key.infos.isEmpty) { if (key.infos.isEmpty) {
return Center( return Center(
@@ -43,9 +55,7 @@ class _PrivateKeyListState extends State<PrivateKeysListPage> {
itemBuilder: (context, idx) { itemBuilder: (context, idx) {
return RoundRectCard( return RoundRectCard(
ListTile( ListTile(
title: Text( title: Text(key.infos[idx].id),
key.infos[idx].id,
),
trailing: TextButton( trailing: TextButton(
onPressed: () => AppRoute( onPressed: () => AppRoute(
PrivateKeyEditPage(info: key.infos[idx]), PrivateKeyEditPage(info: key.infos[idx]),
@@ -58,13 +68,6 @@ class _PrivateKeyListState extends State<PrivateKeysListPage> {
}, },
); );
}, },
),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.add),
onPressed: () =>
AppRoute(const PrivateKeyEditPage(), 'private key edit page')
.go(context),
),
); );
} }
} }

View File

@@ -108,7 +108,7 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
buildInput( Input(
controller: _nameController, controller: _nameController,
type: TextInputType.text, type: TextInputType.text,
node: _nameFocus, node: _nameFocus,
@@ -117,17 +117,16 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
label: _s.name, label: _s.name,
icon: Icons.info, icon: Icons.info,
), ),
buildInput( Input(
controller: _ipController, controller: _ipController,
type: TextInputType.text, type: TextInputType.text,
onSubmitted: (_) => _focusScope.requestFocus(_portFocus), onSubmitted: (_) => _focusScope.requestFocus(_portFocus),
node: _ipFocus, node: _ipFocus,
autoCorrect: false,
label: _s.host, label: _s.host,
icon: Icons.storage, icon: Icons.storage,
hint: 'example.com', hint: 'example.com',
), ),
buildInput( Input(
controller: _portController, controller: _portController,
type: TextInputType.number, type: TextInputType.number,
node: _portFocus, node: _portFocus,
@@ -136,11 +135,10 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
icon: Icons.format_list_numbered, icon: Icons.format_list_numbered,
hint: '22', hint: '22',
), ),
buildInput( Input(
controller: _usernameController, controller: _usernameController,
type: TextInputType.text, type: TextInputType.text,
node: _usernameFocus, node: _usernameFocus,
autoCorrect: false,
label: _s.user, label: _s.user,
icon: Icons.account_box, icon: Icons.account_box,
hint: 'root', hint: 'root',
@@ -158,7 +156,7 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
], ],
), ),
!usePublicKey !usePublicKey
? buildInput( ? Input(
controller: _passwordController, controller: _passwordController,
obscureText: true, obscureText: true,
type: TextInputType.text, type: TextInputType.text,

View File

@@ -62,7 +62,21 @@ class _ServerPageState extends State<ServerPage>
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context); super.build(context);
return Scaffold( return Scaffold(
body: RefreshIndicator( body: _buildBody(),
floatingActionButton: FloatingActionButton(
onPressed: () => AppRoute(
const ServerEditPage(),
'Add server info page',
).go(context),
tooltip: _s.addAServer,
heroTag: 'server page fab',
child: const Icon(Icons.add),
),
);
}
Widget _buildBody() {
return RefreshIndicator(
onRefresh: () async => onRefresh: () async =>
await _serverProvider.refreshData(onlyFailed: true), await _serverProvider.refreshData(onlyFailed: true),
child: Consumer<ServerProvider>( child: Consumer<ServerProvider>(
@@ -93,16 +107,6 @@ class _ServerPageState extends State<ServerPage>
); );
}, },
), ),
),
floatingActionButton: FloatingActionButton(
onPressed: () => AppRoute(
const ServerEditPage(),
'Add server info page',
).go(context),
tooltip: _s.addAServer,
heroTag: 'server page fab',
child: const Icon(Icons.add),
),
); );
} }

View File

@@ -8,7 +8,6 @@ import '../../../core/utils/ui.dart';
import '../../../data/model/sftp/download_status.dart'; import '../../../data/model/sftp/download_status.dart';
import '../../../data/provider/sftp_download.dart'; import '../../../data/provider/sftp_download.dart';
import '../../../data/res/ui.dart'; import '../../../data/res/ui.dart';
import '../../widget/center_loading.dart';
import '../../widget/round_rect_card.dart'; import '../../widget/round_rect_card.dart';
class SFTPDownloadingPage extends StatefulWidget { class SFTPDownloadingPage extends StatefulWidget {

View File

@@ -18,9 +18,9 @@ import '../../../data/model/sftp/download_item.dart';
import '../../../data/provider/server.dart'; import '../../../data/provider/server.dart';
import '../../../data/provider/sftp_download.dart'; import '../../../data/provider/sftp_download.dart';
import '../../../data/res/path.dart'; import '../../../data/res/path.dart';
import '../../../data/res/ui.dart';
import '../../../data/store/private_key.dart'; import '../../../data/store/private_key.dart';
import '../../../locator.dart'; import '../../../locator.dart';
import '../../widget/center_loading.dart';
import '../../widget/fade_in.dart'; import '../../widget/fade_in.dart';
import '../../widget/two_line_text.dart'; import '../../widget/two_line_text.dart';
import 'downloading.dart'; import 'downloading.dart';
@@ -144,7 +144,7 @@ class _SFTPPageState extends State<SFTPPage> {
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
buildInput( Input(
label: _s.path, label: _s.path,
hint: '/', hint: '/',
onSubmitted: (value) => context.pop(value), onSubmitted: (value) => context.pop(value),
@@ -378,7 +378,7 @@ class _SFTPPageState extends State<SFTPPage> {
showRoundDialog( showRoundDialog(
context: context, context: context,
title: Text(_s.createFolder), title: Text(_s.createFolder),
child: buildInput( child: Input(
controller: textController, controller: textController,
label: _s.name, label: _s.name,
), ),
@@ -422,7 +422,7 @@ class _SFTPPageState extends State<SFTPPage> {
showRoundDialog( showRoundDialog(
context: context, context: context,
title: Text(_s.createFile), title: Text(_s.createFile),
child: buildInput( child: Input(
controller: textController, controller: textController,
label: _s.name, label: _s.name,
), ),
@@ -467,7 +467,7 @@ class _SFTPPageState extends State<SFTPPage> {
showRoundDialog( showRoundDialog(
context: context, context: context,
title: Text(_s.rename), title: Text(_s.rename),
child: buildInput( child: Input(
controller: textController, controller: textController,
label: _s.name, label: _s.name,
), ),

View File

@@ -57,30 +57,13 @@ class _SnippetEditPageState extends State<SnippetEditPage>
: const SizedBox() : const SizedBox()
], ],
), ),
body: ListView( body: _buildBody(),
padding: const EdgeInsets.all(13), floatingActionButton: _buildFAB(),
children: [ );
buildInput( }
controller: _nameController,
type: TextInputType.text, Widget _buildFAB() {
onSubmitted: (_) => return FloatingActionButton(
FocusScope.of(context).requestFocus(_scriptNode),
label: _s.name,
icon: Icons.info,
),
buildInput(
controller: _scriptController,
autoCorrect: false,
node: _scriptNode,
minLines: 3,
maxLines: 10,
type: TextInputType.text,
label: _s.snippet,
icon: Icons.code,
),
],
),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.send), child: const Icon(Icons.send),
onPressed: () { onPressed: () {
final name = _nameController.text; final name = _nameController.text;
@@ -97,7 +80,30 @@ class _SnippetEditPageState extends State<SnippetEditPage>
} }
context.pop(); context.pop();
}, },
);
}
Widget _buildBody() {
return ListView(
padding: const EdgeInsets.all(13),
children: [
Input(
controller: _nameController,
type: TextInputType.text,
onSubmitted: (_) => FocusScope.of(context).requestFocus(_scriptNode),
label: _s.name,
icon: Icons.info,
), ),
Input(
controller: _scriptController,
node: _scriptNode,
minLines: 3,
maxLines: 10,
type: TextInputType.text,
label: _s.snippet,
icon: Icons.code,
),
],
); );
} }

View File

@@ -76,61 +76,6 @@ class _SSHPageState extends State<SSHPage> {
super.dispose(); super.dispose();
} }
void _write(String p0) {
_terminal.write('$p0\r\n');
}
Future<void> initTerminal() async {
_write('Connecting...\r\n');
_client = await genClient(
widget.spi,
onStatus: (p0) {
switch (p0) {
case GenSSHClientStatus.socket:
_write('Destination: ${widget.spi.id}');
return _write('Establishing socket...');
case GenSSHClientStatus.key:
return _write('Using private key to connect...');
case GenSSHClientStatus.pwd:
return _write('Sending password to auth...');
}
},
);
_write('Connected\r\n');
_write('Terminal size: ${_terminal.viewWidth}x${_terminal.viewHeight}\r\n');
_write('Starting shell...\r\n');
final session = await _client!.shell(
pty: SSHPtyConfig(
width: _terminal.viewWidth,
height: _terminal.viewHeight,
),
);
_terminal.buffer.clear();
_terminal.buffer.setCursor(0, 0);
_terminal.onOutput = (data) {
session.write(utf8.encode(data) as Uint8List);
};
_listen(session.stdout);
_listen(session.stderr);
await session.done;
if (mounted) {
context.pop();
}
}
void _listen(Stream<Uint8List> stream) {
stream
.cast<List<int>>()
.transform(const Utf8Decoder())
.listen(_terminal.write);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Widget child = Scaffold( Widget child = Scaffold(
@@ -357,4 +302,59 @@ class _SSHPageState extends State<SSHPage> {
}, },
); );
} }
void _write(String p0) {
_terminal.write('$p0\r\n');
}
Future<void> initTerminal() async {
_write('Connecting...\r\n');
_client = await genClient(
widget.spi,
onStatus: (p0) {
switch (p0) {
case GenSSHClientStatus.socket:
_write('Destination: ${widget.spi.id}');
return _write('Establishing socket...');
case GenSSHClientStatus.key:
return _write('Using private key to connect...');
case GenSSHClientStatus.pwd:
return _write('Sending password to auth...');
}
},
);
_write('Connected\r\n');
_write('Terminal size: ${_terminal.viewWidth}x${_terminal.viewHeight}\r\n');
_write('Starting shell...\r\n');
final session = await _client!.shell(
pty: SSHPtyConfig(
width: _terminal.viewWidth,
height: _terminal.viewHeight,
),
);
_terminal.buffer.clear();
_terminal.buffer.setCursor(0, 0);
_terminal.onOutput = (data) {
session.write(utf8.encode(data) as Uint8List);
};
_listen(session.stdout);
_listen(session.stderr);
await session.done;
if (mounted) {
context.pop();
}
}
void _listen(Stream<Uint8List> stream) {
stream
.cast<List<int>>()
.transform(const Utf8Decoder())
.listen(_terminal.write);
}
} }

View File

@@ -1,13 +0,0 @@
import 'package:flutter/material.dart';
const centerLoading = Center(child: CircularProgressIndicator());
const centerSizedLoading = SizedBox(
width: 77,
height: 77,
child: Center(
child: CircularProgressIndicator(),
),
);
final loadingIcon = IconButton(onPressed: () {}, icon: centerLoading);

View File

@@ -1,19 +1,38 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:toolbox/view/widget/round_rect_card.dart';
Widget buildInput({ import 'round_rect_card.dart';
TextEditingController? controller,
int maxLines = 1, class Input extends StatelessWidget {
int? minLines, final TextEditingController? controller;
String? hint, final int maxLines;
String? label, final int? minLines;
Function(String)? onSubmitted, final String? hint;
bool obscureText = false, final String? label;
IconData? icon, final Function(String)? onSubmitted;
TextInputType? type, final bool obscureText;
FocusNode? node, final IconData? icon;
bool autoCorrect = true, final TextInputType? type;
}) { final FocusNode? node;
final bool autoCorrect;
final bool suggestiion;
const Input({
super.key,
this.controller,
this.maxLines = 1,
this.minLines,
this.hint,
this.label,
this.onSubmitted,
this.obscureText = false,
this.icon,
this.type,
this.node,
this.autoCorrect = false,
this.suggestiion = false,
});
@override
Widget build(BuildContext context) {
return RoundRectCard( return RoundRectCard(
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 17), padding: const EdgeInsets.symmetric(horizontal: 17),
@@ -24,8 +43,9 @@ Widget buildInput({
keyboardType: type, keyboardType: type,
focusNode: node, focusNode: node,
autocorrect: autoCorrect, autocorrect: autoCorrect,
enableSuggestions: suggestiion,
decoration: InputDecoration( decoration: InputDecoration(
label: label != null ? Text(label) : null, label: label != null ? Text(label!) : null,
hintText: hint, hintText: hint,
icon: icon != null ? Icon(icon) : null, icon: icon != null ? Icon(icon) : null,
border: InputBorder.none, border: InputBorder.none,
@@ -36,3 +56,4 @@ Widget buildInput({
), ),
); );
} }
}

View File

@@ -1,10 +1,19 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
Widget buildPicker( class Picker extends StatelessWidget {
List<Widget> items, final List<Widget> items;
Function(int idx) onSelected, { final Function(int idx) onSelected;
double height = 157, final double height;
}) {
const Picker({
super.key,
required this.items,
required this.onSelected,
this.height = 157,
});
@override
Widget build(BuildContext context) {
final pad = (height - 37) / 2; final pad = (height - 37) / 2;
return SizedBox( return SizedBox(
height: height, height: height,
@@ -40,3 +49,4 @@ Widget buildPicker(
), ),
); );
} }
}

View File

@@ -5,10 +5,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: _fe_analyzer_shared name: _fe_analyzer_shared
sha256: e440ac42679dfc04bbbefb58ed225c994bc7e07fccc8a68ec7d3631a127e5da9 sha256: "8880b4cfe7b5b17d57c052a5a3a8cc1d4f546261c7cc8fbd717bd53f48db0568"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "54.0.0" version: "59.0.0"
after_layout: after_layout:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -21,26 +21,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: analyzer name: analyzer
sha256: "2c2e3721ee9fb36de92faa060f3480c81b23e904352b087e5c64224b1a044427" sha256: a89627f49b0e70e068130a36571409726b04dab12da7e5625941d2c8ec278b96
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.6.0" version: "5.11.1"
archive: archive:
dependency: transitive dependency: transitive
description: description:
name: archive name: archive
sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.3.6" version: "3.3.7"
args: args:
dependency: transitive dependency: transitive
description: description:
name: args name: args
sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.0" version: "2.4.1"
asn1lib: asn1lib:
dependency: transitive dependency: transitive
description: description:
@@ -125,10 +125,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: built_value name: built_value
sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" sha256: "2f17434bd5d52a26762043d6b43bb53b3acd029b4d9071a329f46d67ef297e6d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.4.3" version: "8.5.0"
characters: characters:
dependency: transitive dependency: transitive
description: description:
@@ -141,10 +141,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: checked_yaml name: checked_yaml
sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.2" version: "2.0.3"
circle_chart: circle_chart:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -206,10 +206,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: crypto name: crypto
sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.2" version: "3.0.3"
csslib: csslib:
dependency: transitive dependency: transitive
description: description:
@@ -222,10 +222,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: dart_style name: dart_style
sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.4" version: "2.3.1"
dartssh2: dartssh2:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -270,10 +270,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: extended_image_library name: extended_image_library
sha256: b1de389378589e4dffb3564d782373238f19064037458092c49b3043b2791b2b sha256: "550743b43ab093aed35ef234500fcc7a304cbac1eca47b0cc991e07e88750758"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.4.1" version: "3.4.2"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@@ -302,10 +302,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: file_picker name: file_picker
sha256: d090ae03df98b0247b82e5928f44d1b959867049d18d73635e2e0bc3f49542b9 sha256: b85eb92b175767fdaa0c543bf3b0d1f610fe966412ea72845fe5ba7801e763ff
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.2.5" version: "5.2.10"
fixnum: fixnum:
dependency: transitive dependency: transitive
description: description:
@@ -344,18 +344,18 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_native_splash name: flutter_native_splash
sha256: e301ae206ff0fb09b67d3716009c6c28c2da57a0ad164827b178421bb9d601f7 sha256: af665ef80a213a9ed502845a3d7a61b9acca4100ee7e9f067a7440bc3acd6730
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.18" version: "2.2.19"
flutter_plugin_android_lifecycle: flutter_plugin_android_lifecycle:
dependency: transitive dependency: transitive
description: description:
name: flutter_plugin_android_lifecycle name: flutter_plugin_android_lifecycle
sha256: "4bef634684b2c7f3468c77c766c831229af829a0cd2d4ee6c1b99558bd14e5d2" sha256: "96af49aa6b57c10a312106ad6f71deed5a754029c24789bbf620ba784f0bd0b0"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.8" version: "2.0.14"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@@ -378,10 +378,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: get_it name: get_it
sha256: "290fde3a86072e4b37dbb03c07bec6126f0ecc28dad403c12ffe2e5a2d751ab7" sha256: "43133b45f32f1d96bbaeb43ea35a50ce854981baa80f47c3e26ee2ad23bef113"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "7.2.0" version: "7.5.0"
glob: glob:
dependency: transitive dependency: transitive
description: description:
@@ -426,26 +426,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: html name: html
sha256: d9793e10dbe0e6c364f4c59bf3e01fb33a9b2a674bc7a1081693dba0614b6269 sha256: "58e3491f7bf0b6a4ea5110c0c688877460d1a6366731155c4a4580e7ded773e8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.15.1" version: "0.15.3"
http: http:
dependency: transitive dependency: transitive
description: description:
name: http name: http
sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.13.5" version: "0.13.6"
http_client_helper: http_client_helper:
dependency: transitive dependency: transitive
description: description:
name: http_client_helper name: http_client_helper
sha256: "1f32359bd07a064ad256d1f84ae5f973f69bc972e7287223fa198abe1d969c28" sha256: "14c6e756644339f561321dab021215475ba4779aa962466f59ccb3ecf66b36c3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.3" version: "2.0.4"
http_multi_server: http_multi_server:
dependency: transitive dependency: transitive
description: description:
@@ -466,10 +466,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: image name: image
sha256: "483a389d6ccb292b570c31b3a193779b1b0178e7eb571986d9a49904b6861227" sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.15" version: "4.0.17"
intl: intl:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -498,10 +498,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: json_annotation name: json_annotation
sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.8.0" version: "4.8.1"
lints: lints:
dependency: transitive dependency: transitive
description: description:
@@ -578,34 +578,34 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: path_provider name: path_provider
sha256: "04890b994ee89bfa80bf3080bfec40d5a92c5c7a785ebb02c13084a099d2b6f9" sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.13" version: "2.0.14"
path_provider_android: path_provider_android:
dependency: transitive dependency: transitive
description: description:
name: path_provider_android name: path_provider_android
sha256: "7623b7d4be0f0f7d9a8b5ee6879fc13e4522d4c875ab86801dee4af32b54b83e" sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.23" version: "2.0.27"
path_provider_foundation: path_provider_foundation:
dependency: transitive dependency: transitive
description: description:
name: path_provider_foundation name: path_provider_foundation
sha256: eec003594f19fe2456ea965ae36b3fc967bc5005f508890aafe31fa75e41d972 sha256: ad4c4d011830462633f03eb34445a45345673dfd4faf1ab0b4735fbd93b19183
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.2" version: "2.2.2"
path_provider_linux: path_provider_linux:
dependency: transitive dependency: transitive
description: description:
name: path_provider_linux name: path_provider_linux
sha256: "525ad5e07622d19447ad740b1ed5070031f7a5437f44355ae915ff56e986429a" sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.9" version: "2.1.10"
path_provider_platform_interface: path_provider_platform_interface:
dependency: transitive dependency: transitive
description: description:
@@ -618,10 +618,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path_provider_windows name: path_provider_windows
sha256: "642ddf65fde5404f83267e8459ddb4556316d3ee6d511ed193357e25caa3632d" sha256: d3f80b32e83ec208ac95253e0cd4d298e104fbc63cb29c5c69edaed43b0c69d6
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.4" version: "2.1.6"
pedantic: pedantic:
dependency: transitive dependency: transitive
description: description:
@@ -682,10 +682,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: pointycastle name: pointycastle
sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346 sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.6.2" version: "3.7.3"
pool: pool:
dependency: transitive dependency: transitive
description: description:
@@ -714,18 +714,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: pub_semver name: pub_semver
sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.3" version: "2.1.4"
pubspec_parse: pubspec_parse:
dependency: transitive dependency: transitive
description: description:
name: pubspec_parse name: pubspec_parse
sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a" sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.1" version: "1.2.3"
quiver: quiver:
dependency: transitive dependency: transitive
description: description:
@@ -746,18 +746,18 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: share_plus name: share_plus
sha256: "692261968a494e47323dcc8bc66d8d52e81bc27cb4b808e4e8d7e8079d4cc01a" sha256: b1f15232d41e9701ab2f04181f21610c36c83a12ae426b79b4bd011c567934b1
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.3.2" version: "6.3.4"
share_plus_platform_interface: share_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: share_plus_platform_interface name: share_plus_platform_interface
sha256: "82ddd4ab9260c295e6e39612d4ff00390b9a7a21f1bb1da771e2f232d80ab8a1" sha256: "0c6e61471bd71b04a138b8b588fa388e66d8b005e6f2deda63371c5c505a0981"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.2.0" version: "3.2.1"
share_plus_web: share_plus_web:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -770,18 +770,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: shelf name: shelf
sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.4.0" version: "1.4.1"
shelf_web_socket: shelf_web_socket:
dependency: transitive dependency: transitive
description: description:
name: shelf_web_socket name: shelf_web_socket
sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.3" version: "1.0.4"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@@ -791,10 +791,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_gen name: source_gen
sha256: c2bea18c95cfa0276a366270afaa2850b09b4a76db95d546f3d003dcc7011298 sha256: b20e191de6964e98032573cecb1d2b169d96ba63fdb586d24dcd1003ba7e94f6
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.7" version: "1.3.0"
source_helper: source_helper:
dependency: transitive dependency: transitive
description: description:
@@ -895,34 +895,34 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_android name: url_launcher_android
sha256: "1f4d9ebe86f333c15d318f81dcdc08b01d45da44af74552608455ebdc08d9732" sha256: "22f8db4a72be26e9e3a4aa3f194b1f7afbc76d20ec141f84be1d787db2155cbd"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.0.24" version: "6.0.31"
url_launcher_ios: url_launcher_ios:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_ios name: url_launcher_ios
sha256: c9cd648d2f7ab56968e049d4e9116f96a85517f1dd806b96a86ea1018a3a82e5 sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.1.1" version: "6.1.4"
url_launcher_linux: url_launcher_linux:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_linux name: url_launcher_linux
sha256: e29039160ab3730e42f3d811dc2a6d5f2864b90a70fb765ea60144b03307f682 sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.3" version: "3.0.5"
url_launcher_macos: url_launcher_macos:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_macos name: url_launcher_macos
sha256: "2dddb3291a57b074dade66b5e07e64401dd2487caefd4e9e2f467138d8c7eb06" sha256: "91ee3e75ea9dadf38036200c5d3743518f4a5eb77a8d13fda1ee5764373f185e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.3" version: "3.0.5"
url_launcher_platform_interface: url_launcher_platform_interface:
dependency: transitive dependency: transitive
description: description:
@@ -935,18 +935,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_web name: url_launcher_web
sha256: "574cfbe2390666003c3a1d129bdc4574aaa6728f0c00a4829a81c316de69dd9b" sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.15" version: "2.0.16"
url_launcher_windows: url_launcher_windows:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_windows name: url_launcher_windows
sha256: "97c9067950a0d09cbd93e2e3f0383d1403989362b97102fbf446473a48079a4b" sha256: "254708f17f7c20a9c8c471f67d86d76d4a3f9c1591aad1e15292008aceb82771"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.4" version: "3.0.6"
uuid: uuid:
dependency: transitive dependency: transitive
description: description:
@@ -975,18 +975,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: web_socket_channel name: web_socket_channel
sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.0" version: "2.4.0"
win32: win32:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46 sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.3" version: "3.1.4"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
@@ -1008,18 +1008,26 @@ packages:
description: description:
path: "." path: "."
ref: master ref: master
resolved-ref: "8039a582d855428cec49b23641bcfcafd6682574" resolved-ref: e945750b97a2f875befa37e0c483bc3f51e215b2
url: "https://github.com/lollipopkit/xterm.dart" url: "https://github.com/lollipopkit/xterm.dart"
source: git source: git
version: "3.4.1" version: "3.6.1-pre"
yaml: yaml:
dependency: transitive dependency: transitive
description: description:
name: yaml name: yaml
sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.1" version: "3.1.2"
zmodem:
dependency: transitive
description:
name: zmodem
sha256: "3b7e5b29f3a7d8aee472029b05165a68438eff2f3f7766edf13daba1e297adbf"
url: "https://pub.dev"
source: hosted
version: "0.0.6"
sdks: sdks:
dart: ">=2.19.0 <3.0.0" dart: ">=2.19.0 <3.0.0"
flutter: ">=3.3.0" flutter: ">=3.3.0"