fix(client): 修复 web 端选择文件后无反应问题

- 添加 result.files.isEmpty 检查(web file_picker 偶发空列表)
- web 平台不传 initialDirectory(避免潜在兼容性问题)
- 添加 mounted 检查和 try-catch,异常通过 SnackBar 显示

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-04-30 19:58:22 +08:00
parent 97ca4c7f72
commit 66dbc4829c
@@ -1,5 +1,6 @@
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@@ -1460,15 +1461,17 @@ class _BatchImportWidgetState extends ConsumerState<_BatchImportWidget> {
} }
Future<void> _pickFile(int index) async { Future<void> _pickFile(int index) async {
try {
final result = await FilePicker.platform.pickFiles( final result = await FilePicker.platform.pickFiles(
type: FileType.custom, type: FileType.custom,
allowedExtensions: ['xls', 'xlsx'], allowedExtensions: ['xls', 'xlsx'],
withData: true, withData: true,
initialDirectory: _lastDir, initialDirectory: kIsWeb ? null : _lastDir,
); );
if (result == null) return; if (result == null || result.files.isEmpty) return;
// 保存目录供下次使用 // 保存目录供下次使用(仅非 web 平台)
if (!kIsWeb) {
final path = result.files.first.path; final path = result.files.first.path;
if (path != null) { if (path != null) {
final dir = path.contains('/') ? path.substring(0, path.lastIndexOf('/')) : null; final dir = path.contains('/') ? path.substring(0, path.lastIndexOf('/')) : null;
@@ -1477,12 +1480,20 @@ class _BatchImportWidgetState extends ConsumerState<_BatchImportWidget> {
SharedPreferences.getInstance().then((p) => p.setString(_prefKey, dir)); SharedPreferences.getInstance().then((p) => p.setString(_prefKey, dir));
} }
} }
}
if (!mounted) return;
setState(() { setState(() {
_slots[index].file = result.files.first; _slots[index].file = result.files.first;
_slots[index].success = null; _slots[index].success = null;
_slots[index].error = null; _slots[index].error = null;
}); });
} catch (e) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('选择文件失败:$e')),
);
}
} }
Future<void> _runImport() async { Future<void> _runImport() async {