feat(client): 入库/出库录单表单(旗舰屏)斑马行 token 化 + 整屏 golden

录单明细网格斑马行 Colors.white/FFFAFAFA → surface/bg(修暗色破绽,两表单
现 0 硬编码色残留);入库+出库录单表单整屏 golden ×三主题(桌面+移动)入回归闸,
锁住 单据信息卡 + 可编辑明细网格 + 底栏。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
This commit is contained in:
wangjia
2026-06-25 14:33:46 +08:00
parent b10b450db0
commit f47f6edcd3
16 changed files with 158 additions and 2 deletions
@@ -1024,7 +1024,7 @@ class _StockInFormScreenState extends ConsumerState<StockInFormScreen> {
children: [
IntrinsicHeight(
child: Container(
color: index.isEven ? Colors.white : const Color(0xFFFAFAFA),
color: index.isEven ? context.tokens.surface : context.tokens.bg,
child:
Row(crossAxisAlignment: CrossAxisAlignment.center, children: [
SizedBox(
@@ -757,7 +757,7 @@ class _StockOutFormScreenState extends ConsumerState<StockOutFormScreen> {
return TableRow(
decoration: BoxDecoration(
color: index.isEven ? Colors.white : const Color(0xFFFAFAFA),
color: index.isEven ? context.tokens.surface : context.tokens.bg,
),
children: [
// 序号
Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

@@ -0,0 +1,88 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:jiu_client/core/models/page_result.dart';
import 'package:jiu_client/core/auth/auth_state.dart';
import 'package:jiu_client/models/partner.dart';
import 'package:jiu_client/models/warehouse.dart';
import 'package:jiu_client/models/product_option.dart';
import 'package:jiu_client/providers/warehouse_provider.dart';
import 'package:jiu_client/providers/partner_provider.dart';
import 'package:jiu_client/providers/product_option_provider.dart';
import 'package:jiu_client/screens/stock_in/stock_in_form_screen.dart';
import '../support/golden_harness.dart';
/// design-distill 阶段4:入库录单表单(旗舰屏)golden × 三主题。
/// 锁住 单据信息卡 + 可编辑明细网格 + 底栏 随主题换色(含斑马行 token)。
/// 更新基准:flutter test --update-goldens test/golden/stock_in_form_golden_test.dart
const _warehouses = [
Warehouse(id: 1, name: '主仓', isDefault: true),
Warehouse(id: 2, name: '二号仓', isDefault: false),
];
class _FakeWarehouses extends WarehouseListNotifier {
@override
Future<List<Warehouse>> build() async => _warehouses;
}
class _FakeSuppliers extends PartnerListNotifier {
@override
Future<PageResult<Partner>> build() async =>
const PageResult(data: [], total: 0, page: 1, pageSize: 20);
@override
void setPage(int page) {}
@override
void setPageSize(int pageSize) {}
@override
void setKeyword(String keyword) {}
@override
void reload() {}
}
class _FakeNames extends ProductNameListNotifier {
@override
Future<List<ProductNameOption>> build() async => const [];
}
class _FakeSeries extends ProductSeriesListNotifier {
@override
Future<List<ProductSeriesOption>> build() async => const [];
}
class _FakeSpecs extends ProductSpecListNotifier {
@override
Future<List<ProductSpecOption>> build() async => const [];
}
List<Override> _overrides() => [
warehouseListProvider.overrideWith(() => _FakeWarehouses()),
supplierListProvider.overrideWith(() => _FakeSuppliers()),
productNameListProvider.overrideWith(() => _FakeNames()),
productSeriesListProvider.overrideWith(() => _FakeSeries()),
productSpecListProvider.overrideWith(() => _FakeSpecs()),
isReadonlyProvider.overrideWithValue(false),
];
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
SharedPreferences.setMockInitialValues({});
goldenAcrossThemes(
'stock-in form 录单(桌面)',
goldenPrefix: 'stock_in_form',
child: () => const Scaffold(body: StockInFormScreen()),
overrides: _overrides,
logical: const Size(1280, 920),
);
goldenAcrossThemes(
'stock-in form 录单(移动)',
goldenPrefix: 'stock_in_form_mobile',
child: () => const Scaffold(body: StockInFormScreen()),
overrides: _overrides,
logical: const Size(390, 1400),
);
}
@@ -0,0 +1,68 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:jiu_client/core/models/page_result.dart';
import 'package:jiu_client/core/auth/auth_state.dart';
import 'package:jiu_client/models/partner.dart';
import 'package:jiu_client/models/warehouse.dart';
import 'package:jiu_client/providers/warehouse_provider.dart';
import 'package:jiu_client/providers/partner_provider.dart';
import 'package:jiu_client/screens/stock_out/stock_out_form_screen.dart';
import '../support/golden_harness.dart';
/// design-distill 阶段4:出库录单表单(旗舰屏)golden × 三主题。
/// 锁住 单据信息卡 + 可编辑明细网格 + 底栏 随主题换色(含斑马行 token)。
/// 更新基准:flutter test --update-goldens test/golden/stock_out_form_golden_test.dart
const _warehouses = [
Warehouse(id: 1, name: '主仓', isDefault: true),
Warehouse(id: 2, name: '二号仓', isDefault: false),
];
class _FakeWarehouses extends WarehouseListNotifier {
@override
Future<List<Warehouse>> build() async => _warehouses;
}
class _FakeCustomers extends PartnerListNotifier {
@override
Future<PageResult<Partner>> build() async =>
const PageResult(data: [], total: 0, page: 1, pageSize: 20);
@override
void setPage(int page) {}
@override
void setPageSize(int pageSize) {}
@override
void setKeyword(String keyword) {}
@override
void reload() {}
}
List<Override> _overrides() => [
warehouseListProvider.overrideWith(() => _FakeWarehouses()),
customerListProvider.overrideWith(() => _FakeCustomers()),
isReadonlyProvider.overrideWithValue(false),
];
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
SharedPreferences.setMockInitialValues({});
goldenAcrossThemes(
'stock-out form 录单(桌面)',
goldenPrefix: 'stock_out_form',
child: () => const Scaffold(body: StockOutFormScreen()),
overrides: _overrides,
logical: const Size(1280, 920),
);
goldenAcrossThemes(
'stock-out form 录单(移动)',
goldenPrefix: 'stock_out_form_mobile',
child: () => const Scaffold(body: StockOutFormScreen()),
overrides: _overrides,
logical: const Size(390, 1400),
);
}