migrate: riverpod 3

This commit is contained in:
lollipopkit🏳️‍⚧️
2025-10-08 17:03:13 +08:00
parent f68c4a851b
commit da8517bcf7
51 changed files with 840 additions and 884 deletions

View File

@@ -60,7 +60,7 @@ final class _BackupPageState extends ConsumerState<BackupPage> with AutomaticKee
],
[CenterGreyTitle(libL10n.import), _buildBulkImportServers, _buildImportSnippet],
],
);
);
}
Widget get _buildBakPwd {
@@ -400,7 +400,7 @@ final class _BackupPageState extends ConsumerState<BackupPage> with AutomaticKee
child: SingleChildScrollView(child: Text(libL10n.askContinue('${libL10n.import} [$snippetNames]'))),
actions: Btn.ok(
onTap: () {
final notifier = ref.read(snippetNotifierProvider.notifier);
final notifier = ref.read(snippetProvider.notifier);
for (final snippet in snippets) {
notifier.add(snippet);
}

View File

@@ -43,8 +43,8 @@ class _ContainerPageState extends ConsumerState<ContainerPage> {
@override
void initState() {
super.initState();
final serverState = ref.read(serverNotifierProvider(widget.args.spi.id));
_provider = containerNotifierProvider(
final serverState = ref.read(serverProvider(widget.args.spi.id));
_provider = containerProvider(
serverState.client,
widget.args.spi.user,
widget.args.spi.id,

View File

@@ -1,4 +1,5 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter/foundation.dart' show kReleaseMode;
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:responsive_framework/responsive_framework.dart';
@@ -31,15 +32,19 @@ class _HomePageState extends ConsumerState<HomePage>
bool _shouldAuth = false;
DateTime? _pausedTime;
late final _notifier = ref.read(serversNotifierProvider.notifier);
late final _provider = ref.read(serversNotifierProvider);
late final _notifier = ref.read(serversProvider.notifier);
late final _provider = ref.read(serversProvider);
late List<AppTab> _tabs = Stores.setting.homeTabs.fetch();
@override
void dispose() {
super.dispose();
WidgetsBinding.instance.removeObserver(this);
Future(() => _notifier.closeServer());
// In release builds (real app exit), close connections.
// In debug (hot reload), avoid forcing disconnects.
if (kReleaseMode) {
Future(() => _notifier.closeServer());
}
_pageController.dispose();
WakelockPlus.disable();

View File

@@ -131,7 +131,7 @@ class _PingPageState extends ConsumerState<PingPage> with AutomaticKeepAliveClie
return;
}
if (ref.read(serversNotifierProvider).serverOrder.isEmpty) {
if (ref.read(serversProvider).serverOrder.isEmpty) {
context.showSnackBar(l10n.pingNoServer);
return;
}
@@ -143,8 +143,8 @@ class _PingPageState extends ConsumerState<PingPage> with AutomaticKeepAliveClie
}
await Future.wait(
ref.read(serversNotifierProvider).servers.values.map((spi) async {
final serverState = ref.read(serverNotifierProvider(spi.id));
ref.read(serversProvider).servers.values.map((spi) async {
final serverState = ref.read(serverProvider(spi.id));
if (serverState.client == null) {
return;
}

View File

@@ -40,7 +40,7 @@ class _PrivateKeyEditPageState extends ConsumerState<PrivateKeyEditPage> {
final _loading = ValueNotifier<Widget?>(null);
late final _notifier = ref.read(privateKeyNotifierProvider.notifier);
late final _notifier = ref.read(privateKeyProvider.notifier);
PrivateKeyInfo? get pki => widget.args?.pki;

View File

@@ -32,7 +32,7 @@ class _PrivateKeyListState extends ConsumerState<PrivateKeysListPage> with After
}
Widget _buildBody() {
final privateKeyState = ref.watch(privateKeyNotifierProvider);
final privateKeyState = ref.watch(privateKeyProvider);
final pkis = privateKeyState.keys;
if (pkis.isEmpty) {

View File

@@ -37,7 +37,7 @@ class _ProcessPageState extends ConsumerState<ProcessPage> {
ProcSortMode _procSortMode = ProcSortMode.cpu;
List<ProcSortMode> _sortModes = List.from(ProcSortMode.values);
late final _provider = serverNotifierProvider(widget.args.spi.id);
late final _provider = serverProvider(widget.args.spi.id);
@override
void dispose() {

View File

@@ -33,7 +33,7 @@ final class _PvePageState extends ConsumerState<PvePage> {
late MediaQueryData _media;
Timer? _timer;
late final _provider = pveNotifierProvider(widget.args.spi);
late final _provider = pveProvider(widget.args.spi);
late final _notifier = ref.read(_provider.notifier);
@override

View File

@@ -86,7 +86,7 @@ class _ServerDetailPageState extends ConsumerState<ServerDetailPage> with Single
@override
Widget build(BuildContext context) {
final serverState = ref.watch(serverNotifierProvider(widget.args.spi.id));
final serverState = ref.watch(serverProvider(widget.args.spi.id));
if (serverState.client == null) {
return Scaffold(
appBar: CustomAppBar(),

View File

@@ -4,7 +4,7 @@ extension _Actions on _ServerEditPageState {
Future<void> _onTapSSHDiscovery() async {
try {
final result = await SshDiscoveryPage.route.go(context);
if (result != null && result.isNotEmpty) {
await _processDiscoveredServers(result);
}
@@ -37,7 +37,7 @@ extension _Actions on _ServerEditPageState {
final defaultKeyId = _keyIdx.value?.toString() ?? '';
final usernameController = TextEditingController(text: defaultUsername);
final keyIdController = TextEditingController(text: defaultKeyId);
final shouldProceed = await context.showRoundDialog<bool>(
title: libL10n.import,
child: Column(
@@ -63,18 +63,22 @@ extension _Actions on _ServerEditPageState {
if (shouldProceed == true) {
final username = usernameController.text.isNotEmpty ? usernameController.text : defaultUsername;
final keyId = keyIdController.text.isNotEmpty ? keyIdController.text : null;
final servers = discoveredServers.map((result) => Spi(
name: result.ip,
ip: result.ip,
port: result.port,
user: username,
keyId: keyId,
pwd: _passwordController.text.isEmpty ? null : _passwordController.text,
)).toList();
final servers = discoveredServers
.map(
(result) => Spi(
name: result.ip,
ip: result.ip,
port: result.port,
user: username,
keyId: keyId,
pwd: _passwordController.text.isEmpty ? null : _passwordController.text,
),
)
.toList();
await _batchImportServers(servers);
}
usernameController.dispose();
keyIdController.dispose();
}
@@ -93,8 +97,9 @@ extension _Actions on _ServerEditPageState {
}
}
context.showSnackBar('${libL10n.success}: $imported ${l10n.servers}');
if (mounted) Navigator.of(context).pop(true);
if (mounted) context.pop(true);
}
void _onTapSSHImport() async {
try {
final servers = await SSHConfig.parseConfig();
@@ -114,8 +119,7 @@ extension _Actions on _ServerEditPageState {
void _handleImportSSHCfgPermissionIssue(Object e, StackTrace s) async {
dprint('Error importing SSH config: $e');
// Check if it's a permission error and offer file picker as fallback
if (e is PathAccessException ||
e.toString().contains('Operation not permitted')) {
if (e is PathAccessException || e.toString().contains('Operation not permitted')) {
final useFilePicker = await context.showRoundDialog<bool>(
title: l10n.sshConfigImport,
child: Column(
@@ -157,15 +161,10 @@ extension _Actions on _ServerEditPageState {
children: [
Text(l10n.sshConfigFoundServers('${summary.total}')),
if (summary.hasDuplicates)
Text(
l10n.sshConfigDuplicatesSkipped('${summary.duplicates}'),
style: UIs.textGrey,
),
Text(l10n.sshConfigDuplicatesSkipped('${summary.duplicates}'), style: UIs.textGrey),
Text(l10n.sshConfigServersToImport('${summary.toImport}')),
const SizedBox(height: 16),
...resolved.map(
(s) => Text('${s.name} (${s.user}@${s.ip}:${s.port})'),
),
...resolved.map((s) => Text('${s.name} (${s.user}@${s.ip}:${s.port})')),
],
),
),
@@ -174,7 +173,7 @@ extension _Actions on _ServerEditPageState {
if (shouldImport == true) {
for (final server in resolved) {
ref.read(serversNotifierProvider.notifier).addServer(server);
ref.read(serversProvider.notifier).addServer(server);
}
context.showSnackBar(l10n.sshConfigImported('${resolved.length}'));
}
@@ -203,10 +202,7 @@ extension _Actions on _ServerEditPageState {
}
void _onTapCustomItem() async {
final res = await KvEditor.route.go(
context,
KvEditorArgs(data: _customCmds.value),
);
final res = await KvEditor.route.go(context, KvEditorArgs(data: _customCmds.value));
if (res == null) return;
_customCmds.value = res;
}
@@ -257,17 +253,10 @@ extension _Actions on _ServerEditPageState {
scriptDir: _scriptDirCtrl.text.selfNotEmptyOrNull,
);
final wolEmpty =
_wolMacCtrl.text.isEmpty &&
_wolIpCtrl.text.isEmpty &&
_wolPwdCtrl.text.isEmpty;
final wolEmpty = _wolMacCtrl.text.isEmpty && _wolIpCtrl.text.isEmpty && _wolPwdCtrl.text.isEmpty;
final wol = wolEmpty
? null
: WakeOnLanCfg(
mac: _wolMacCtrl.text,
ip: _wolIpCtrl.text,
pwd: _wolPwdCtrl.text.selfNotEmptyOrNull,
);
: WakeOnLanCfg(mac: _wolMacCtrl.text, ip: _wolIpCtrl.text, pwd: _wolPwdCtrl.text.selfNotEmptyOrNull);
if (wol != null) {
final wolValidation = wol.validate();
if (!wolValidation.$2) {
@@ -277,19 +266,13 @@ extension _Actions on _ServerEditPageState {
}
final spi = Spi(
name: _nameController.text.isEmpty
? _ipController.text
: _nameController.text,
name: _nameController.text.isEmpty ? _ipController.text : _nameController.text,
ip: _ipController.text,
port: int.parse(_portController.text),
user: _usernameController.text,
pwd: _passwordController.text.selfNotEmptyOrNull,
keyId: _keyIdx.value != null
? ref
.read(privateKeyNotifierProvider)
.keys
.elementAt(_keyIdx.value!)
.id
? ref.read(privateKeyProvider).keys.elementAt(_keyIdx.value!).id
: null,
tags: _tags.value.isEmpty ? null : _tags.value.toList(),
alterUrl: _altUrlController.text.selfNotEmptyOrNull,
@@ -300,9 +283,7 @@ extension _Actions on _ServerEditPageState {
envs: _env.value.isEmpty ? null : _env.value,
id: widget.args?.spi.id ?? ShortId.generate(),
customSystemType: _systemType.value,
disabledCmdTypes: _disabledCmdTypes.value.isEmpty
? null
: _disabledCmdTypes.value.toList(),
disabledCmdTypes: _disabledCmdTypes.value.isEmpty ? null : _disabledCmdTypes.value.toList(),
);
if (this.spi == null) {
@@ -311,9 +292,9 @@ extension _Actions on _ServerEditPageState {
context.showSnackBar('${l10n.sameIdServerExist}: ${spi.id}');
return;
}
ref.read(serversNotifierProvider.notifier).addServer(spi);
ref.read(serversProvider.notifier).addServer(spi);
} else {
ref.read(serversNotifierProvider.notifier).updateServer(this.spi!, spi);
ref.read(serversProvider.notifier).updateServer(this.spi!, spi);
}
context.pop();
@@ -369,7 +350,7 @@ extension _Utils on _ServerEditPageState {
// Import without asking again since user already gave permission
for (final server in resolved) {
ref.read(serversNotifierProvider.notifier).addServer(server);
ref.read(serversProvider.notifier).addServer(server);
}
context.showSnackBar(l10n.sshConfigImported('${resolved.length}'));
}
@@ -432,10 +413,7 @@ extension _Utils on _ServerEditPageState {
if (spi.keyId == null) {
_passwordController.text = spi.pwd ?? '';
} else {
_keyIdx.value = ref
.read(privateKeyNotifierProvider)
.keys
.indexWhere((e) => e.id == spi.keyId);
_keyIdx.value = ref.read(privateKeyProvider).keys.indexWhere((e) => e.id == spi.keyId);
}
/// List in dart is passed by pointer, so you need to copy it here

View File

@@ -185,7 +185,7 @@ class _ServerEditPageState extends ConsumerState<ServerEditPage> with AfterLayou
hint: 'root',
suggestion: false,
),
TagTile(tags: _tags, allTags: ref.watch(serversNotifierProvider).tags).cardx,
TagTile(tags: _tags, allTags: ref.watch(serversProvider).tags).cardx,
ListTile(
title: Text(l10n.autoConnect),
trailing: _autoConnect.listenVal(

View File

@@ -42,7 +42,7 @@ extension _Widgets on _ServerEditPageState {
Widget _buildKeyAuth() {
const padding = EdgeInsets.only(left: 13, right: 13, bottom: 7);
final privateKeyState = ref.watch(privateKeyNotifierProvider);
final privateKeyState = ref.watch(privateKeyProvider);
final pkis = privateKeyState.keys;
final choice = _keyIdx.listenVal((val) {
@@ -350,7 +350,7 @@ extension _Widgets on _ServerEditPageState {
Widget _buildJumpServer() {
const padding = EdgeInsets.only(left: 13, right: 13, bottom: 7);
final srvs = ref
.watch(serversNotifierProvider)
.watch(serversProvider)
.servers
.values
.where((e) => e.jumpId == null)
@@ -462,7 +462,7 @@ extension _Widgets on _ServerEditPageState {
actions: Btn.ok(
onTap: () async {
context.pop();
ref.read(serversNotifierProvider.notifier).delServer(spi!.id);
ref.read(serversProvider.notifier).delServer(spi!.id);
context.pop(true);
},
red: true,

View File

@@ -30,16 +30,16 @@ extension on _ServerPageState {
const Icon(Icons.refresh, size: 21, color: Colors.grey),
() {
TryLimiter.reset(s.spi.id);
ref.read(serversNotifierProvider.notifier).refresh(spi: s.spi);
ref.read(serversProvider.notifier).refresh(spi: s.spi);
},
),
ServerConn.disconnected => (
const Icon(MingCute.link_3_line, size: 19, color: Colors.grey),
() => ref.read(serversNotifierProvider.notifier).refresh(spi: s.spi),
() => ref.read(serversProvider.notifier).refresh(spi: s.spi),
),
ServerConn.finished => (
const Icon(MingCute.unlink_2_line, size: 17, color: Colors.grey),
() => ref.read(serversNotifierProvider.notifier).closeServer(id: s.spi.id),
() => ref.read(serversProvider.notifier).closeServer(id: s.spi.id),
),
};
@@ -106,7 +106,7 @@ ${ss.err?.message ?? 'null'}
Widget _buildNet(ServerStatus ss, String id) {
final cardNoti = _getCardNoti(id);
final type = cardNoti.value.net ?? Stores.setting.netViewType.fetch();
final device = ref.watch(serversNotifierProvider).servers[id]?.custom?.netDev;
final device = ref.watch(serversProvider).servers[id]?.custom?.netDev;
final (a, b) = type.build(ss, dev: device);
return AnimatedSwitcher(
duration: const Duration(milliseconds: 377),

View File

@@ -26,7 +26,7 @@ extension on _ServerPageState {
}
Widget _buildLandscapeBody() {
final serverState = ref.watch(serversNotifierProvider);
final serverState = ref.watch(serversProvider);
final order = serverState.serverOrder;
if (order.isEmpty) {
@@ -37,7 +37,7 @@ extension on _ServerPageState {
itemCount: order.length,
itemBuilder: (_, idx) {
final id = order[idx];
final srv = ref.watch(serverNotifierProvider(id));
final srv = ref.watch(serverProvider(id));
final title = _buildServerCardTitle(srv);
final List<Widget> children = [title, _buildNormalCard(srv.status, srv.spi)];

View File

@@ -74,7 +74,7 @@ class _ServerPageState extends ConsumerState<ServerPage>
@override
void initState() {
super.initState();
_tags = ValueNotifier(ref.read(serversNotifierProvider).tags);
_tags = ValueNotifier(ref.read(serversProvider).tags);
_startAvoidJitterTimer();
}
@@ -89,7 +89,7 @@ class _ServerPageState extends ConsumerState<ServerPage>
Widget build(BuildContext context) {
super.build(context);
// Listen to provider changes and update the ValueNotifier
ref.listen(serversNotifierProvider, (previous, next) {
ref.listen(serversProvider, (previous, next) {
_tags.value = next.tags;
});
return OrientationBuilder(
@@ -133,7 +133,7 @@ class _ServerPageState extends ConsumerState<ServerPage>
Widget _buildPortrait() {
// final isMobile = ResponsiveBreakpoints.of(context).isMobile;
final serverState = ref.watch(serversNotifierProvider);
final serverState = ref.watch(serversProvider);
return _tag.listenVal((val) {
final filtered = _filterServers(serverState.serverOrder);
final child = _buildScaffold(_buildBodySmall(filtered: filtered));
@@ -183,7 +183,7 @@ class _ServerPageState extends ConsumerState<ServerPage>
// Last item is just spacing
if (index == lens) return SizedBox(height: 77);
final individualState = ref.watch(serverNotifierProvider(serversInThisColumn[index]));
final individualState = ref.watch(serverProvider(serversInThisColumn[index]));
return _buildEachServerCard(individualState);
},
@@ -339,8 +339,8 @@ class _ServerPageState extends ConsumerState<ServerPage>
@override
Future<void> afterFirstLayout(BuildContext context) async {
ref.read(serversNotifierProvider.notifier).refresh();
ref.read(serversNotifierProvider.notifier).startAutoRefresh();
ref.read(serversProvider.notifier).refresh();
ref.read(serversProvider.notifier).startAutoRefresh();
}
static const _kCardHeightMin = 23.0;

View File

@@ -98,7 +98,7 @@ extension _Utils on _ServerPageState {
final tag = _tag.value;
if (tag == TagSwitcher.kDefaultTag) return order;
return order.where((e) {
final tags = ref.read(serversNotifierProvider).servers[e]?.tags;
final tags = ref.read(serversProvider).servers[e]?.tags;
if (tags == null) return false;
return tags.contains(tag);
}).toList();

View File

@@ -63,7 +63,7 @@ extension _Server on _AppSettingsPageState {
onTap: () async {
final keys = Stores.server.keys();
final names = Map.fromEntries(
keys.map((e) => MapEntry(e, ref.read(serversNotifierProvider).servers[e]?.name ?? e)),
keys.map((e) => MapEntry(e, ref.read(serversProvider).servers[e]?.name ?? e)),
);
final deleteKeys = await context.showPickDialog<String>(
clearable: true,

View File

@@ -42,7 +42,7 @@ class _ServerOrderPageState extends ConsumerState<ServerOrderPage> {
}
Widget _buildBody() {
final serverState = ref.watch(serversNotifierProvider);
final serverState = ref.watch(serversProvider);
final order = serverState.serverOrder;
if (order.isEmpty) {
@@ -77,7 +77,7 @@ class _ServerOrderPageState extends ConsumerState<ServerOrderPage> {
}
Widget _buildCardTile(int index) {
final serverState = ref.watch(serversNotifierProvider);
final serverState = ref.watch(serversProvider);
final order = serverState.serverOrder;
final id = order[index];
final spi = serverState.servers[id];

View File

@@ -62,7 +62,7 @@ class _SnippetEditPageState extends ConsumerState<SnippetEditPage> with AfterLay
child: Text(libL10n.askContinue('${libL10n.delete} ${l10n.snippet}(${snippet.name})')),
actions: Btn.ok(
onTap: () {
ref.read(snippetNotifierProvider.notifier).del(snippet);
ref.read(snippetProvider.notifier).del(snippet);
context.pop();
context.pop();
},
@@ -96,7 +96,7 @@ class _SnippetEditPageState extends ConsumerState<SnippetEditPage> with AfterLay
autoRunOn: _autoRunOn.value.isEmpty ? null : _autoRunOn.value,
);
final oldSnippet = widget.args?.snippet;
final notifier = ref.read(snippetNotifierProvider.notifier);
final notifier = ref.read(snippetProvider.notifier);
if (oldSnippet != null) {
notifier.update(oldSnippet, snippet);
} else {
@@ -130,7 +130,7 @@ class _SnippetEditPageState extends ConsumerState<SnippetEditPage> with AfterLay
),
Consumer(
builder: (_, ref, _) {
final tags = ref.watch(snippetNotifierProvider.select((p) => p.tags));
final tags = ref.watch(snippetProvider.select((p) => p.tags));
return TagTile(tags: _tags, allTags: tags).cardx;
},
),
@@ -157,7 +157,7 @@ class _SnippetEditPageState extends ConsumerState<SnippetEditPage> with AfterLay
builder: (vals) {
final subtitle = vals.isEmpty
? null
: vals.map((e) => ref.read(serversNotifierProvider).servers[e]?.name ?? e).join(', ');
: vals.map((e) => ref.read(serversProvider).servers[e]?.name ?? e).join(', ');
return ListTile(
leading: const Padding(
padding: EdgeInsets.only(left: 5),
@@ -170,11 +170,11 @@ class _SnippetEditPageState extends ConsumerState<SnippetEditPage> with AfterLay
: Text(subtitle, maxLines: 1, style: UIs.textGrey, overflow: TextOverflow.ellipsis),
onTap: () async {
// Create a filtered copy for the dialog, don't modify the original
final validServerIds = vals.where((e) => ref.read(serversNotifierProvider).serverOrder.contains(e)).toList();
final validServerIds = vals.where((e) => ref.read(serversProvider).serverOrder.contains(e)).toList();
final serverIds = await context.showPickDialog(
title: l10n.autoRun,
items: ref.read(serversNotifierProvider).serverOrder,
display: (e) => ref.read(serversNotifierProvider).servers[e]?.name ?? e,
items: ref.read(serversProvider).serverOrder,
display: (e) => ref.read(serversProvider).servers[e]?.name ?? e,
initial: validServerIds,
clearable: true,
);

View File

@@ -36,7 +36,7 @@ class _SnippetListPageState extends ConsumerState<SnippetListPage> with Automati
Widget _buildBody() {
// final isMobile = ResponsiveBreakpoints.of(context).isMobile;
final snippetState = ref.watch(snippetNotifierProvider);
final snippetState = ref.watch(snippetProvider);
final snippets = snippetState.snippets;
return _tag.listenVal((tag) {
@@ -56,7 +56,7 @@ class _SnippetListPageState extends ConsumerState<SnippetListPage> with Automati
}
Widget _buildScaffold(List<Snippet> snippets, String tag) {
final snippetState = ref.watch(snippetNotifierProvider);
final snippetState = ref.watch(snippetProvider);
return Scaffold(
appBar: TagSwitcher(
tags: snippetState.tags.vn,

View File

@@ -66,7 +66,7 @@ extension _Init on SSHPageState {
// Mark status connected for notifications / live activities
TermSessionManager.updateStatus(_sessionId, TermSessionStatus.connected);
final snippets = ref.read(snippetNotifierProvider.select((p) => p.snippets));
final snippets = ref.read(snippetProvider.select((p) => p.snippets));
for (final snippet in snippets) {
if (snippet.autoRunOn?.contains(widget.args.spi.id) == true) {
snippet.runInTerm(_terminal, widget.args.spi);

View File

@@ -118,7 +118,7 @@ class SSHPageState extends ConsumerState<SSHPage>
_setupDiscontinuityTimer();
// Initialize client from provider
final serverState = ref.read(serverNotifierProvider(widget.args.spi.id));
final serverState = ref.read(serverProvider(widget.args.spi.id));
_client = serverState.client;
if (++_sshConnCount == 1) {

View File

@@ -52,7 +52,7 @@ extension _VirtKey on SSHPageState {
}
break;
case VirtualKeyFunc.snippet:
final snippetState = ref.read(snippetNotifierProvider);
final snippetState = ref.read(snippetProvider);
final snippets = await context.showPickWithTagDialog<Snippet>(
title: l10n.snippet,
tags: snippetState.tags.vn,

View File

@@ -249,7 +249,7 @@ class _AddPage extends ConsumerWidget {
const viewPadding = 7.0;
final viewWidth = context.windowSize.width - 2 * viewPadding;
final serverState = ref.watch(serversNotifierProvider);
final serverState = ref.watch(serversProvider);
final itemCount = serverState.servers.length;
const itemPadding = 1.0;
const itemWidth = 150.0;

View File

@@ -359,7 +359,7 @@ extension _OnTapFile on _LocalFilePageState {
final spi = await context.showPickSingleDialog<Spi>(
title: libL10n.select,
items: ref.read(serversNotifierProvider).servers.values.toList(),
items: ref.read(serversProvider).servers.values.toList(),
display: (e) => e.name,
);
if (spi == null) return;
@@ -370,7 +370,7 @@ extension _OnTapFile on _LocalFilePageState {
return;
}
ref.read(sftpNotifierProvider.notifier).add(SftpReq(spi, '$remotePath/$fileName', file.absolute.path, SftpReqType.upload));
ref.read(sftpProvider.notifier).add(SftpReq(spi, '$remotePath/$fileName', file.absolute.path, SftpReqType.upload));
context.showSnackBar(l10n.added2List);
}
}

View File

@@ -50,7 +50,7 @@ class _SftpPageState extends ConsumerState<SftpPage> with AfterLayoutMixin {
@override
void initState() {
super.initState();
final serverState = ref.read(serverNotifierProvider(widget.args.spi.id));
final serverState = ref.read(serverProvider(widget.args.spi.id));
_client = serverState.client!;
_status = SftpBrowserStatus(_client);
}
@@ -290,7 +290,7 @@ extension _Actions on _SftpPageState {
final localPath = _getLocalPath(remotePath);
final completer = Completer();
final req = SftpReq(widget.args.spi, remotePath, localPath, SftpReqType.download);
ref.read(sftpNotifierProvider.notifier).add(req, completer: completer);
ref.read(sftpProvider.notifier).add(req, completer: completer);
final (suc, err) = await context.showLoadingDialog(fn: () => completer.future);
if (suc == null || err != null) return;
@@ -300,7 +300,7 @@ extension _Actions on _SftpPageState {
path: localPath,
onSave: (_) {
ref
.read(sftpNotifierProvider.notifier)
.read(sftpProvider.notifier)
.add(SftpReq(req.spi, remotePath, localPath, SftpReqType.upload));
context.showSnackBar(l10n.added2List);
},
@@ -323,7 +323,7 @@ extension _Actions on _SftpPageState {
final remotePath = _getRemotePath(name);
ref
.read(sftpNotifierProvider.notifier)
.read(sftpProvider.notifier)
.add(SftpReq(widget.args.spi, remotePath, _getLocalPath(remotePath), SftpReqType.download));
context.pop();
@@ -653,7 +653,7 @@ extension _Actions on _SftpPageState {
final remotePath = '$remoteDir/$fileName';
Loggers.app.info('SFTP upload local: $path, remote: $remotePath');
ref
.read(sftpNotifierProvider.notifier)
.read(sftpProvider.notifier)
.add(SftpReq(widget.args.spi, remotePath, path, SftpReqType.upload));
},
icon: const Icon(Icons.upload_file),

View File

@@ -25,7 +25,7 @@ class _SftpMissionPageState extends ConsumerState<SftpMissionPage> {
}
Widget _buildBody() {
final status = ref.watch(sftpNotifierProvider.select((pro) => pro.requests));
final status = ref.watch(sftpProvider.select((pro) => pro.requests));
if (status.isEmpty) {
return Center(child: Text(libL10n.empty));
}
@@ -143,7 +143,7 @@ class _SftpMissionPageState extends ConsumerState<SftpMissionPage> {
child: Text(libL10n.askContinue('${libL10n.delete} ${l10n.mission}($name)')),
actions: Btn.ok(
onTap: () {
ref.read(sftpNotifierProvider.notifier).cancel(id);
ref.read(sftpProvider.notifier).cancel(id);
context.pop();
},
).toList,

View File

@@ -19,7 +19,7 @@ final class SystemdPage extends ConsumerStatefulWidget {
}
final class _SystemdPageState extends ConsumerState<SystemdPage> {
late final _pro = systemdNotifierProvider(widget.args.spi);
late final _pro = systemdProvider(widget.args.spi);
late final _notifier = ref.read(_pro.notifier);

View File

@@ -121,7 +121,7 @@ void _onTapMoreBtns(ServerFuncBtn value, Spi spi, BuildContext context, WidgetRe
break;
case ServerFuncBtn.snippet:
final snippetState = ref.read(snippetNotifierProvider);
final snippetState = ref.read(snippetProvider);
if (snippetState.snippets.isEmpty) {
context.showSnackBar(libL10n.empty);
return;
@@ -273,7 +273,7 @@ void _gotoSSH(Spi spi, BuildContext context) async {
}
bool _checkClient(BuildContext context, String id, WidgetRef ref) {
final serverState = ref.read(serverNotifierProvider(id));
final serverState = ref.read(serverProvider(id));
if (serverState.client == null) {
context.showSnackBar(l10n.waitConnection);
return false;