fix: cant sort servers order (#930)
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
import 'dart:ui';
|
||||
import 'package:fl_lib/fl_lib.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:server_box/core/extension/context/locale.dart';
|
||||
import 'package:server_box/data/model/server/server_private_info.dart';
|
||||
import 'package:server_box/data/provider/server/all.dart';
|
||||
import 'package:server_box/data/res/store.dart';
|
||||
|
||||
class ServerOrderPage extends ConsumerStatefulWidget {
|
||||
const ServerOrderPage({super.key});
|
||||
@@ -17,15 +17,32 @@ class ServerOrderPage extends ConsumerStatefulWidget {
|
||||
}
|
||||
|
||||
class _ServerOrderPageState extends ConsumerState<ServerOrderPage> {
|
||||
late List<String> _order;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_order = List<String>.from(ref.read(serversProvider).serverOrder);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
ref.listen<ServersState>(serversProvider, (_, next) {
|
||||
if (listEquals(_order, next.serverOrder)) {
|
||||
return;
|
||||
}
|
||||
setState(() {
|
||||
_order = List<String>.from(next.serverOrder);
|
||||
});
|
||||
});
|
||||
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(title: Text(l10n.serverOrder)),
|
||||
body: _buildBody(),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _proxyDecorator(Widget child, int index, Animation<double> animation) {
|
||||
Widget _proxyDecorator(Widget child, int _, Animation<double> animation) {
|
||||
return AnimatedBuilder(
|
||||
animation: animation,
|
||||
builder: (BuildContext context, Widget? child) {
|
||||
@@ -37,50 +54,61 @@ class _ServerOrderPageState extends ConsumerState<ServerOrderPage> {
|
||||
child: Card(elevation: elevation, child: child),
|
||||
);
|
||||
},
|
||||
child: _buildCardTile(index),
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildBody() {
|
||||
final serverState = ref.watch(serversProvider);
|
||||
final order = serverState.serverOrder;
|
||||
|
||||
final order = _order;
|
||||
|
||||
if (order.isEmpty) {
|
||||
return Center(child: Text(libL10n.empty));
|
||||
}
|
||||
return ReorderableListView.builder(
|
||||
footer: const SizedBox(height: 77),
|
||||
onReorder: (oldIndex, newIndex) {
|
||||
var targetIndex = newIndex;
|
||||
if (targetIndex > oldIndex) {
|
||||
targetIndex -= 1;
|
||||
}
|
||||
if (targetIndex == oldIndex) {
|
||||
return;
|
||||
}
|
||||
|
||||
final newOrder = List<String>.from(order);
|
||||
final moved = newOrder.removeAt(oldIndex);
|
||||
newOrder.insert(targetIndex, moved);
|
||||
|
||||
setState(() {
|
||||
final newOrder = List<String>.from(order);
|
||||
newOrder.move(oldIndex, newIndex);
|
||||
Stores.setting.serverOrder.put(newOrder);
|
||||
_order = newOrder;
|
||||
});
|
||||
ref.read(serversProvider.notifier).updateServerOrder(newOrder);
|
||||
},
|
||||
padding: const EdgeInsets.all(8),
|
||||
buildDefaultDragHandles: false,
|
||||
itemBuilder: (_, idx) => _buildItem(idx, order[idx]),
|
||||
itemBuilder: (_, idx) {
|
||||
final id = order[idx];
|
||||
final spi = serverState.servers[id];
|
||||
return _buildItem(idx, id, spi);
|
||||
},
|
||||
itemCount: order.length,
|
||||
proxyDecorator: _proxyDecorator,
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildItem(int index, String id) {
|
||||
Widget _buildItem(int index, String id, Spi? spi) {
|
||||
return ReorderableDelayedDragStartListener(
|
||||
key: ValueKey('server_item_$id'),
|
||||
index: index,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(bottom: 8),
|
||||
child: CardX(child: _buildCardTile(index)),
|
||||
padding: const EdgeInsets.only(bottom: 3),
|
||||
child: _buildCardTile(index, spi).cardx,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildCardTile(int index) {
|
||||
final serverState = ref.watch(serversProvider);
|
||||
final order = serverState.serverOrder;
|
||||
final id = order[index];
|
||||
final spi = serverState.servers[id];
|
||||
Widget _buildCardTile(int index, Spi? spi) {
|
||||
if (spi == null) {
|
||||
return const SizedBox();
|
||||
}
|
||||
@@ -89,8 +117,6 @@ class _ServerOrderPageState extends ConsumerState<ServerOrderPage> {
|
||||
title: Text(spi.name, style: const TextStyle(fontWeight: FontWeight.w500)),
|
||||
subtitle: Text(spi.oldId, style: UIs.textGrey),
|
||||
leading: CircleAvatar(
|
||||
backgroundColor: Theme.of(context).colorScheme.primary,
|
||||
foregroundColor: Theme.of(context).colorScheme.onPrimary,
|
||||
child: Text(spi.name[0]),
|
||||
),
|
||||
trailing: ReorderableDragStartListener(index: index, child: const Icon(Icons.drag_handle)),
|
||||
|
||||
Reference in New Issue
Block a user