fix(client): 修复测试 timer 泄漏与编译 warning

- login_screen: Future.delayed 改为 Timer,dispose 时主动取消,
  避免测试框架报 pending timer 错误
- stock_in_form_screen: 移除未使用的 repository import,
  items 去掉无效 ?? [] 死代码(items 字段非空)
- stock_out_form_screen: 同上

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-04-18 19:36:54 +08:00
parent f5b28dd09a
commit 3bf99966db
3 changed files with 12 additions and 6 deletions
+10 -2
View File
@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
@@ -32,6 +34,8 @@ class _LoginScreenState extends ConsumerState<LoginScreen> {
OverlayEntry? _hotelEntry;
OverlayEntry? _usernameEntry;
Timer? _closeHotelTimer;
Timer? _closeUsernameTimer;
bool get _hotelShowing => _hotelEntry != null;
bool get _usernameShowing => _usernameEntry != null;
@@ -46,7 +50,8 @@ class _LoginScreenState extends ConsumerState<LoginScreen> {
isHotel: true);
} else if (!_hotelCodeFocus.hasFocus) {
// 延迟关闭:让候选词的 onTap(pointer-up)先执行,再关闭下拉框
Future.delayed(const Duration(milliseconds: 150), _closeHotel);
_closeHotelTimer?.cancel();
_closeHotelTimer = Timer(const Duration(milliseconds: 150), _closeHotel);
}
});
_usernameFocus.addListener(() {
@@ -54,7 +59,8 @@ class _LoginScreenState extends ConsumerState<LoginScreen> {
_openDropdown(_usernameLayerLink, _usernameHistory, _usernameCtrl,
isHotel: false);
} else if (!_usernameFocus.hasFocus) {
Future.delayed(const Duration(milliseconds: 150), _closeUsername);
_closeUsernameTimer?.cancel();
_closeUsernameTimer = Timer(const Duration(milliseconds: 150), _closeUsername);
}
});
}
@@ -175,6 +181,8 @@ class _LoginScreenState extends ConsumerState<LoginScreen> {
@override
void dispose() {
_closeHotelTimer?.cancel();
_closeUsernameTimer?.cancel();
_hotelEntry?.remove();
_usernameEntry?.remove();
_shopCodeCtrl.dispose();
@@ -8,7 +8,6 @@ import '../../providers/partner_provider.dart';
import '../../providers/product_provider.dart';
import '../../providers/stock_in_provider.dart';
import '../../providers/warehouse_provider.dart';
import '../../repositories/stock_in_repository.dart';
class StockInFormScreen extends ConsumerStatefulWidget {
final int? editOrderId;
@@ -55,7 +54,7 @@ class _StockInFormScreenState extends ConsumerState<StockInFormScreen> {
}
_remarkCtrl.text = order.remark ?? '';
_items.clear();
for (final item in order.items ?? []) {
for (final item in order.items) {
final row = _ItemRow();
row.productId = item.productId;
row.qtyCtrl.text = item.quantity.toStringAsFixed(0);
@@ -9,7 +9,6 @@ import '../../providers/partner_provider.dart';
import '../../providers/product_provider.dart';
import '../../providers/stock_out_provider.dart';
import '../../providers/warehouse_provider.dart';
import '../../repositories/stock_out_repository.dart';
class StockOutFormScreen extends ConsumerStatefulWidget {
final int? editOrderId;
@@ -58,7 +57,7 @@ class _StockOutFormScreenState extends ConsumerState<StockOutFormScreen> {
}
_remarkCtrl.text = order.remark ?? '';
_items.clear();
for (final item in order.items ?? []) {
for (final item in order.items) {
final row = _ItemRow();
row.productId = item.productId;
row.qtyCtrl.text = item.quantity.toStringAsFixed(0);