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:
@@ -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,29 +1461,39 @@ class _BatchImportWidgetState extends ConsumerState<_BatchImportWidget> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _pickFile(int index) async {
|
Future<void> _pickFile(int index) async {
|
||||||
final result = await FilePicker.platform.pickFiles(
|
try {
|
||||||
type: FileType.custom,
|
final result = await FilePicker.platform.pickFiles(
|
||||||
allowedExtensions: ['xls', 'xlsx'],
|
type: FileType.custom,
|
||||||
withData: true,
|
allowedExtensions: ['xls', 'xlsx'],
|
||||||
initialDirectory: _lastDir,
|
withData: true,
|
||||||
);
|
initialDirectory: kIsWeb ? null : _lastDir,
|
||||||
if (result == null) return;
|
);
|
||||||
|
if (result == null || result.files.isEmpty) return;
|
||||||
|
|
||||||
// 保存目录供下次使用
|
// 保存目录供下次使用(仅非 web 平台)
|
||||||
final path = result.files.first.path;
|
if (!kIsWeb) {
|
||||||
if (path != null) {
|
final path = result.files.first.path;
|
||||||
final dir = path.contains('/') ? path.substring(0, path.lastIndexOf('/')) : null;
|
if (path != null) {
|
||||||
if (dir != null) {
|
final dir = path.contains('/') ? path.substring(0, path.lastIndexOf('/')) : null;
|
||||||
_lastDir = dir;
|
if (dir != null) {
|
||||||
SharedPreferences.getInstance().then((p) => p.setString(_prefKey, dir));
|
_lastDir = dir;
|
||||||
|
SharedPreferences.getInstance().then((p) => p.setString(_prefKey, dir));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
setState(() {
|
if (!mounted) return;
|
||||||
_slots[index].file = result.files.first;
|
setState(() {
|
||||||
_slots[index].success = null;
|
_slots[index].file = result.files.first;
|
||||||
_slots[index].error = null;
|
_slots[index].success = 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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user