You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter集成测试mock file_picker出现PlatformException异常如何解决

问题原因

你遇到的报错是因为MethodChannel的Mock回调不能直接返回FilePickerResult自定义类实例,MethodChannel仅支持序列化 Dart 标准数据类型(如Map、List、String、int、bool、null等),返回自定义类实例无法被通道编码,就会触发参数非法错误。

file_picker插件内部会自行将MethodChannel返回的标准Map结构转换为FilePickerResult对象,你只需要按照插件约定的结构返回对应Map即可。

解决方案

修改mockFilePicker方法的返回内容,按照插件预期的结构返回Map:

import 'dart:io';
import 'dart:typed_data';

import 'package:file_picker/file_picker.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:path_provider/path_provider.dart';

void main() async {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  setUp(() {
    mockFilePicker();
  });

  testWidgets("test", (WidgetTester tester) async {
    // await app.main();
    // .. test case ..
  });
}

mockFilePicker() {
  const MethodChannel channel =
      MethodChannel('miguelruivo.flutter.plugins.filepicker');
  channel.setMockMethodCallHandler((MethodCall methodCall) async {
    print("MockMethodChannel run");
    // 匹配文件选择调用方法
    if (methodCall.method == 'pickFiles') {
      ByteData data = await rootBundle.load('assets/images/ic_bill.png');
      Uint8List bytes = data.buffer.asUint8List();
      Directory tempDir = await getTemporaryDirectory();
      File file = await File(
        '${tempDir.path}/image.png',
      ).writeAsBytes(bytes);
      
      // 返回符合file_picker解析规则的Map结构
      return {
        'files': [
          {
            'path': file.path,
            'name': 'image.png',
            'size': file.lengthSync(),
            'bytes': bytes, // Web端测试必填,移动端可省略
          }
        ]
      };
    }
    // 其他方法调用默认返回null即可
    return null;
  });
}
注意事项
  • 若需要模拟多选文件场景,在files数组中添加多个对应文件的Map结构即可
  • 若测试涉及不同类型文件的选择,调整name字段的后缀和对应资源路径即可
  • 若测试场景需要模拟用户取消选择的操作,直接返回null即可,file_picker会返回空结果

内容的提问来源于stack exchange,提问作者ikhwan aja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:48:03