修复用户端订单列表生命周期与刷新
This commit is contained in:
@@ -9,13 +9,21 @@ import '../../../data/services/api_client.dart';
|
||||
import '../../../data/services/payment_launcher.dart';
|
||||
import '../../../domain/models/client_models.dart';
|
||||
import '../shared/record_list_page.dart';
|
||||
import '../shared/record_list_view_model.dart';
|
||||
|
||||
class OrdersPage extends StatelessWidget {
|
||||
OrdersPage({required this.repository, super.key});
|
||||
class OrdersPage extends StatefulWidget {
|
||||
const OrdersPage({required this.repository, super.key});
|
||||
|
||||
final ClientRepository repository;
|
||||
|
||||
@override
|
||||
State<OrdersPage> createState() => _OrdersPageState();
|
||||
}
|
||||
|
||||
class _OrdersPageState extends State<OrdersPage> {
|
||||
final PaymentLauncher _launcher = PaymentLauncher();
|
||||
int _shopRefreshToken = 0;
|
||||
int _gasRefreshToken = 0;
|
||||
int _refundRefreshToken = 0;
|
||||
|
||||
Future<void> _openActions(
|
||||
BuildContext context,
|
||||
@@ -61,7 +69,7 @@ class OrdersPage extends StatelessWidget {
|
||||
final reason = await _reason(context);
|
||||
if (reason == null || !context.mounted) return;
|
||||
final rawItems = record.raw['items'] as List? ?? const [];
|
||||
await repository.createRefund(
|
||||
await widget.repository.createRefund(
|
||||
business: business,
|
||||
identity: record.identity,
|
||||
requestNo: const Uuid().v7(),
|
||||
@@ -75,13 +83,21 @@ class OrdersPage extends StatelessWidget {
|
||||
}).toList(),
|
||||
);
|
||||
if (context.mounted) {
|
||||
setState(() {
|
||||
if (business == 'shop') {
|
||||
_shopRefreshToken += 1;
|
||||
} else {
|
||||
_gasRefreshToken += 1;
|
||||
}
|
||||
_refundRefreshToken += 1;
|
||||
});
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(content: Text('退款申请已提交')),
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
final payment = await repository.payOrder(
|
||||
final payment = await widget.repository.payOrder(
|
||||
business: business,
|
||||
identity: record.identity,
|
||||
requestNo: const Uuid().v7(),
|
||||
@@ -106,29 +122,10 @@ class OrdersPage extends StatelessWidget {
|
||||
}
|
||||
|
||||
Future<String?> _reason(BuildContext context) async {
|
||||
final controller = TextEditingController();
|
||||
final value = await showDialog<String>(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: const Text('申请退款'),
|
||||
content: TextField(
|
||||
controller: controller,
|
||||
maxLines: 3,
|
||||
decoration: const InputDecoration(labelText: '退款原因'),
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context),
|
||||
child: const Text('取消'),
|
||||
),
|
||||
FilledButton(
|
||||
onPressed: () => Navigator.pop(context, controller.text.trim()),
|
||||
child: const Text('提交'),
|
||||
),
|
||||
],
|
||||
),
|
||||
builder: (context) => const _RefundReasonDialog(),
|
||||
);
|
||||
controller.dispose();
|
||||
return value?.isEmpty == true ? null : value;
|
||||
}
|
||||
|
||||
@@ -150,37 +147,86 @@ class OrdersPage extends StatelessWidget {
|
||||
body: TabBarView(
|
||||
children: [
|
||||
RecordListPage(
|
||||
key: const PageStorageKey('shop_orders'),
|
||||
title: '商城订单',
|
||||
eyebrow: '交易',
|
||||
description: '查看商城订单并处理待支付或退款事项',
|
||||
embedded: true,
|
||||
viewModel: RecordListViewModel(repository.shopOrders),
|
||||
sourceKey: 'shop_orders',
|
||||
loader: widget.repository.shopOrders,
|
||||
refreshToken: _shopRefreshToken,
|
||||
onRecordTap: (record) => _openActions(context, record, 'shop'),
|
||||
),
|
||||
RecordListPage(
|
||||
key: const PageStorageKey('gas_orders'),
|
||||
title: '供气订单',
|
||||
eyebrow: '履约',
|
||||
description: '查看供气订单与当前履约状态',
|
||||
embedded: true,
|
||||
viewModel: RecordListViewModel(repository.gasOrders),
|
||||
sourceKey: 'gas_orders',
|
||||
loader: widget.repository.gasOrders,
|
||||
refreshToken: _gasRefreshToken,
|
||||
onRecordTap: (record) => _openActions(context, record, 'gas'),
|
||||
),
|
||||
RecordListPage(
|
||||
key: const PageStorageKey('refunds'),
|
||||
title: '退款记录',
|
||||
eyebrow: '资金',
|
||||
description: '退款结果以服务端审核和资金流水为准',
|
||||
embedded: true,
|
||||
viewModel: RecordListViewModel(repository.refunds),
|
||||
sourceKey: 'refunds',
|
||||
loader: widget.repository.refunds,
|
||||
refreshToken: _refundRefreshToken,
|
||||
),
|
||||
RecordListPage(
|
||||
key: const PageStorageKey('tickets'),
|
||||
title: '服务工单',
|
||||
eyebrow: '服务',
|
||||
description: '查看维修、安装与其他服务工单',
|
||||
embedded: true,
|
||||
viewModel: RecordListViewModel(repository.tickets),
|
||||
sourceKey: 'tickets',
|
||||
loader: widget.repository.tickets,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// 独立管理退款原因输入框生命周期,避免关闭动画期间提前释放控制器。
|
||||
class _RefundReasonDialog extends StatefulWidget {
|
||||
const _RefundReasonDialog();
|
||||
|
||||
@override
|
||||
State<_RefundReasonDialog> createState() => _RefundReasonDialogState();
|
||||
}
|
||||
|
||||
class _RefundReasonDialogState extends State<_RefundReasonDialog> {
|
||||
final TextEditingController _controller = TextEditingController();
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_controller.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => AlertDialog(
|
||||
title: const Text('申请退款'),
|
||||
content: TextField(
|
||||
controller: _controller,
|
||||
maxLines: 3,
|
||||
decoration: const InputDecoration(labelText: '退款原因'),
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context),
|
||||
child: const Text('取消'),
|
||||
),
|
||||
FilledButton(
|
||||
onPressed: () => Navigator.pop(context, _controller.text.trim()),
|
||||
child: const Text('提交'),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user