feat(client): 全列表下拉刷新 + 库存移动工具行移除

- DsTable 窄屏卡片流支持 onRefresh(RefreshIndicator,空态也可下拉)——
  等价桌面工具栏「刷新」;库存/入库/出库/往来/财务流水/用户/基础数据
  全 tab 接线(基础数据下拉一并重拉五个 tab 数据源)
- 库存移动端「盘点/表格视图/导出/列设置/刷新」工具行移除(2026-07-04
  拍板:刷新改下拉手势、盘点入口在「我的」、其余桌面专属),
  库存移动 golden 随更新

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-07-04 23:52:06 +08:00
parent 99ceaa87bb
commit c9217601a1
14 changed files with 71 additions and 72 deletions
+25 -7
View File
@@ -45,6 +45,9 @@ class DsTable extends StatefulWidget {
// 仅文案分页(原型 partners/products 的 .pager 只有一行 span 文案,无翻页控件);
// 与 total 互斥,total 为空且此值非空时生效。
final String? pagerInfoText;
/// 窄屏卡片流下拉刷新(等价桌面工具栏「刷新」,2026-07-04 拍板);null 不启用。
final Future<void> Function()? onRefresh;
// 内嵌收缩模式(多区块滚动页里的表格卡,如 devices/settings):
// 不用 Expanded 撑满、表格不带内部滚动,高度随内容。
final bool shrinkWrap;
@@ -62,6 +65,7 @@ class DsTable extends StatefulWidget {
this.onPageSizeChanged,
this.mobileCards,
this.pagerInfoText,
this.onRefresh,
this.shrinkWrap = false,
});
@@ -146,13 +150,27 @@ class _DsTableState extends State<DsTable> {
Widget _buildMobile(dynamic t) {
final cards = widget.mobileCards!;
if (cards.isEmpty) return _empty(t);
return ListView.separated(
padding: const EdgeInsets.all(12),
itemCount: cards.length,
separatorBuilder: (_, __) => const SizedBox(height: 10),
itemBuilder: (_, i) => cards[i],
);
final Widget list = cards.isEmpty
? (widget.onRefresh == null
? _empty(t)
// 空态也要可下拉:套一个总是可滚的 ListView
: ListView(
physics: const AlwaysScrollableScrollPhysics(),
children: [
Padding(
padding: const EdgeInsets.only(top: 60),
child: _empty(t)),
],
))
: ListView.separated(
padding: const EdgeInsets.all(12),
physics: const AlwaysScrollableScrollPhysics(),
itemCount: cards.length,
separatorBuilder: (_, __) => const SizedBox(height: 10),
itemBuilder: (_, i) => cards[i],
);
if (widget.onRefresh == null) return list;
return RefreshIndicator(onRefresh: widget.onRefresh!, child: list);
}
/// 收缩版卡片流(外层页面自带滚动)。