Flutter全平台读文件异常:Linux正常但Android、Web端找不到文件如何解决
问题根因
- dart:io的
File类仅支持桌面/服务端原生文件系统访问,Android应用的打包资源存放在APK私有路径中无法通过普通文件路径访问,Web端完全无dart:io实现所以直接返回null Platform.script路径逻辑仅适用于桌面端脚本执行场景,移动端/Web的运行时路径规则完全不同- path_provider是用来访问应用运行时生成的文件/缓存目录的,你这些是提前打包的静态资源,本身就不适用这个包
可行跨平台方案
第一步:调整资源路径并声明静态资源
把项目根目录的text文件夹移动到assets目录下(没有就新建一个assets文件夹在根目录),然后在pubspec.yaml的flutter节点下声明资源:
flutter: assets: - assets/text/
第二步:统一使用rootBundle加载资源
Flutter自带的rootBundle会自动处理各平台的静态资源加载逻辑,全平台兼容,同时需要搭配TOML解析包把加载到的字符串解析成你需要的Map结构:
首先在pubspec.yaml的dependencies里加TOML解析依赖:
dependencies: flutter: sdk: flutter toml: ^0.15.0 # 可替换为当前最新稳定版本
然后修改readFile代码:
import 'package:flutter/services.dart'; import 'package:toml/toml.dart'; Future<Map?> readFile(String lang) async { try { // 统一用rootBundle加载assets下的资源,全平台兼容 String content = await rootBundle.loadString('assets/text/$lang.toml'); // 解析TOML内容为Map var document = TomlDocument.parse(content); return document.toMap(); } catch (e) { // 加载失败(如无对应语言配置)时返回null return null; } }
注意事项
- 每次新增TOML文件或者修改assets目录内容后,要执行
flutter pub get,最好重启应用再测试,避免资源缓存导致加载失败 - Web端默认配置下走rootBundle加载不需要额外调整,构建时会自动把assets资源打包到对应目录
内容的提问来源于stack exchange,提问作者ScratchX
相关产品推荐
相关产品推荐

