一 概述

  • 不同的平台对应的文件系统是不同的,比如文件路径,因此 Flutter 中获取文件路径需要原生支持
  • 通过Google 官方提供的插件 path_provider,可以实现跨平台下文件的路径

二 path_provider

2.1 插件地址

  • pub 地址:https://pub.flutter-io.cn/packages/path_provider
  • Github 地址:https://github.com/flutter/plugins/tree/master/packages/path_provider/path_provider

2.2 插件安装

切换到终端模式下,执行如下指令

flutter pub add path_provider

点击pubspec.yaml右上角的Pub get或者执行如下指令

flutter pub get

三 文件路径

path_provider.dart文件下提供了8中获取文件路径的方法

3.1 getTemporaryDirectory

  • 临时目录,适用于下载的缓存文件,此目录随时可以清除
  • 此目录为应用程序私有目录,其他应用程序无法访问此目录
  • Android 上对应getCacheDir;iOS上对应NSCachesDirectory

3.2 getApplicationSupportDirectory

  • 应用程序可以在其中放置应用程序支持文件的目录的路径
  • 将此文件用于您不想向用户公开的文件。 您的应用不应将此目录用于存放用户数据文件
  • 在iOS上,对应NSApplicationSupportDirectory ,如果此目录不存在,则会自动创建。 在Android上,对应getFilesDir

3.3 getLibraryDirectory

  • 应用程序可以在其中存储持久性文件,备份文件以及对用户不可见的文件的目录路径
  • 在Android上,此函数抛出[UnsupportedError]异常,没有等效项路径存在

3.4 getApplicationDocumentsDirectory

  • 应用程序可能在其中放置用户生成的数据或应用程序无法重新创建的数据的目录路径
  • 在iOS上,对应NSDocumentDirectory API。 如果数据不是用户生成的,考虑使用[getApplicationSupportDirectory]
  • 在Android上,对应getDataDirectory API。 如果要让用户看到数据,请考虑改用[getExternalStorageDirectory]

3.5 getExternalStorageDirectory

  • 应用程序可以访问顶级存储的目录的路径
  • 由于此功能仅在Android上可用,因此应在发出此函数调用之前确定当前操作系统
  • 在iOS上,此功能会引发[UnsupportedError]异常,因为无法在应用程序的沙箱外部访问
  • 在Android上,对应getExternalFilesDir(null)

3.6 getExternalCacheDirectories

  • 存储特定于应用程序的外部缓存数据的目录的路径。 这些路径通常位于外部存储(如单独的分区或SD卡)上
  • 由于此功能仅在Android上可用,因此应在发出此函数调用之前确定当前操作系统
  • 在iOS上,此功能会抛出UnsupportedError,因为这是不可能的在应用程序的沙箱外部访问。
  • 在Android上,对应Context.getExternalCacheDirs()或API Level 低于19的Context.getExternalCacheDir()

3.7 getExternalStorageDirectories

  • 可以存储应用程序特定数据的目录的路径。 这些路径通常位于外部存储(如单独的分区或SD卡)上。
  • 由于此功能仅在Android上可用,因此应在发出此函数调用之前确定当前操作系统
  • 在iOS上,此功能会抛出UnsupportedError,因为这是不可能的在应用程序的沙箱外部访问
  • 在Android上,对应Context.getExternalFilesDirs(String type)或API Level 低于19的Context.getExternalFilesDir(String type)

3.8 getDownloadsDirectory

  • 存储下载文件的目录的路径,这通常仅与台式机操作系统有关
  • 在Android和iOS上,此函数将引发[UnsupportedError]异常。

四 示例

4.1 代码

  Future<Directory?>? _tempDirectory;Future<Directory?>? _appSupportDirectory;Future<Directory?>? _appLibraryDirectory;Future<Directory?>? _appDocumentsDirectory;Future<Directory?>? _externalDocumentsDirectory;Future<List<Directory>?>? _externalStorageDirectories;Future<List<Directory>?>? _externalCacheDirectories;Future<Directory?>? _downloadDirectory;void _requestTempDirectory() {setState(() {_tempDirectory = getTemporaryDirectory();});}Widget _buildDirectory(BuildContext context, AsyncSnapshot<Directory?> snapshot) {Text text = const Text('');if (snapshot.connectionState == ConnectionState.done) {if (snapshot.hasError) {text = Text('Error: ${snapshot.error}');} else if (snapshot.hasData) {text = Text('path: ${snapshot.data!.path}');} else {text = const Text('path unavailable');}}return Padding(padding: const EdgeInsets.all(16.0), child: text);}Widget _buildDirectories(BuildContext context, AsyncSnapshot<List<Directory>?> snapshot) {Text text = const Text('');if (snapshot.connectionState == ConnectionState.done) {if (snapshot.hasError) {text = Text('Error: ${snapshot.error}');} else if (snapshot.hasData) {final String combined = snapshot.data!.map((Directory d) => d.path).join(', ');text = Text('paths: $combined');} else {text = const Text('path unavailable');}}return Padding(padding: const EdgeInsets.all(16.0), child: text);}void _requestAppDocumentsDirectory() {setState(() {_appDocumentsDirectory = getApplicationDocumentsDirectory();});}void _requestAppSupportDirectory() {setState(() {_appSupportDirectory = getApplicationSupportDirectory();});}void _requestAppLibraryDirectory() {setState(() {_appLibraryDirectory = getLibraryDirectory();});}void _requestExternalStorageDirectory() {setState(() {_externalDocumentsDirectory = getExternalStorageDirectory();});}void _requestExternalStorageDirectories(StorageDirectory type) {setState(() {_externalStorageDirectories = getExternalStorageDirectories(type: type);});}void _requestExternalCacheDirectories() {setState(() {_externalCacheDirectories = getExternalCacheDirectories();});}void _requestDownloadDirectory() {setState(() {_downloadDirectory = getDownloadsDirectory();});}Center(child: ListView(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(child: const Text('Get Temporary Directory'), onPressed: _requestTempDirectory,),),FutureBuilder<Directory?>(future: _tempDirectory, builder: _buildDirectory),Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(child: const Text('Get Application Documents Directory'),onPressed: _requestAppDocumentsDirectory,),),FutureBuilder<Directory?>(future: _appDocumentsDirectory, builder: _buildDirectory),Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(child: const Text('Get Application Support Directory'),onPressed: _requestAppSupportDirectory,),),FutureBuilder<Directory?>(future: _appSupportDirectory, builder: _buildDirectory),Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(child: const Text('Get Application Library Directory'),onPressed: _requestAppLibraryDirectory,)),FutureBuilder<Directory?>(future: _appLibraryDirectory, builder: _buildDirectory),Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(child: Text(Platform.isIOS ? 'External directories are unavailable on iOS' : 'Get External Storage Directory'),onPressed: Platform.isIOS ? null : _requestExternalStorageDirectory,),),FutureBuilder<Directory?>(future: _externalDocumentsDirectory, builder: _buildDirectory),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(child: Text(Platform.isIOS? 'External directories are unavailable on iOS': 'Get External Storage Directories'),onPressed: Platform.isIOS ? null : () {_requestExternalStorageDirectories(StorageDirectory.music,);},),),]),FutureBuilder<List<Directory>?>(future: _externalStorageDirectories, builder: _buildDirectories),Column(children: <Widget>[Padding(padding: const EdgeInsets.all(16.0),child: ElevatedButton(child: Text(Platform.isIOS ? 'External directories are unavailable on iOS' : 'Get External Cache Directories'),onPressed: Platform.isIOS ? null : _requestExternalCacheDirectories,),),]),FutureBuilder<List<Directory>?>(future: _externalCacheDirectories, builder: _buildDirectories),Padding(padding: const EdgeInsets.all(16.0), child: ElevatedButton(child: const Text('Get Download Directory'), onPressed: _requestDownloadDirectory,),),FutureBuilder<Directory?>(future: _downloadDirectory, builder: _buildDirectory),],),)

4.2 效果图

五 参考

  • path_provider-example
  • 老孟学Flutter-path_provider

Flutter开发之——文件系统目录pathprovider相关推荐

  1. etw系统provider事件较多_【Flutter 实战】文件系统目录

    老孟导读:Flutter 中获取文件路径,我们都知道使用 path_provider,但对其目录对含义不是很清楚,此文介绍 Android.iOS 系统的文件目录,不同场景下建议使用的目录. 不同的平 ...

  2. flutter开发小程序_为什么我认为Flutter是移动应用程序开发的未来

    flutter开发小程序 I dabbled a bit in Android and iOS development quite a few years back using Java and Ob ...

  3. flutter git 拉不起来_「干货」Flutter开发环境配置备忘录

    为什么要用Flutter? 嗯,本篇文章不会讲,因为我认为想看这篇文章的应该已经下定决心要学习Flutter. Flutter开发环境支持安装在Windows.Mac OS和Linux下,区别在于Wi ...

  4. Flutter开发之《头条 Flutter iOS 混合工程实践》笔记(54)

    摘自:头条 Flutter iOS 混合工程实践 从 App Store 下载或更新头条(6.9.2 或以上版本),找到 懂车帝 -> 热门车型,点击打开后即可体验 Flutter 的页面效果. ...

  5. Flutter开发使用PlatformView显示iOS原生View(50)

    我们在使用Flutter开发跨平台开发移动APP时,会遇到Flutter的组件满足不了原生的效果,部分控件不如原生控件好用时,就想在Flutter 的Widget 中使用iOS原生View来组合实现良 ...

  6. Flutter开发之数据存储-2-文件存储(33)

    数据存储部分在移动开发中是非常重要的部分,无论是一些轻量级的数据(如用户信息.APP配置信息等)还是把需要长期存储的数据写入本地文件或者Sqlite3.都离不开数据存储,上一篇SharedPrefer ...

  7. Flutter开发之搭建Flutter开发环境(三)

    回首demo.之前的工程突然,无法iOS上运行了.重装了最新的Xcode.然后VS Code 终端运行 flutter packages get 再打开Xcode 设置开发证书.再在iOS真机或者模拟 ...

  8. 【Flutter】Flutter 开发环境搭建 ( Android Studio 下 Flutter / Dart 插件安装 | Flutter SDK 安装 | 环境变量配置 | 开发环境检查 )

    文章目录 一.Flutter 学习资料 二.Flutter 开发环境搭建 三.Android Studio 环境安装 Flutter / Dart 插件 四.下载 Flutter SDK 五.设置 F ...

  9. flutter开发vscode插件推荐(开发必备)

    这里是坚果前端小课堂,大家喜欢的话,可以关注我的公众号"坚果前端,",或者加我好友,获取更多精彩内容 vscode开发插件推荐 扩展是完成工作的快捷方式.许多扩展有助于减少重复性工 ...

最新文章

  1. 学习笔记Hadoop(十五)—— MapReduce编程进阶
  2. 【Spring MVC 中 HandlerInterceptorAdapter的使用】
  3. SharePoint 数据库管理-PowerShell
  4. sklearn中knn的各种用法总结
  5. 第 69 章 数据库链接
  6. Linux下Qt的QPixmap加载图片无法显示的问题
  7. JAVA代码规范(二)
  8. android开发下载文件损坏解决方法,Android中已下载的.apk文件已损坏
  9. 《锋利的JQuery》notes
  10. Java——SOF 与 OOM
  11. 物理综合 | congestion 报告解读
  12. dfuse 与 Solana 宣布合作,为其高吞吐量区块链提供强大的数据解决方案
  13. 应用宝shangjia安全评估报告_《安全评估报告》提交指引
  14. html鼠标手状态,css鼠标样式
  15. Adobe illustrator 输入数学平方公式
  16. 【毕业设计】深度学习人体语义分割在弹幕防遮挡上的实现 - python
  17. 管家婆软件使用打印功能的常见问题
  18. Excel数据太多,不会筛选重复数据?只需1键,即可筛选出重复数据
  19. Android JetPack组件-CameraX初探
  20. POI中设置(居中,字体,边框等)Excel单元格样式

热门文章

  1. 学习--unix信号
  2. Numpy 怎么把arange ()产生的列表 变成一个行向量或者列向量
  3. 安卓编程常见错误记录
  4. 【音乐理论】音与音高 ( 音区 | 小字一组 | 小字组 | 大字组 )
  5. 数据可视化路上——中国地图可视化
  6. 彻底掌握 Javascript(八)正则表达式【讲师辅导】-曾亮-专题视频课程
  7. 日本国家旅游局的新版《日本本土风情导览》主打人迹罕至的名胜、劲酷的景点以及鲜为人知的攻略
  8. 穹顶之下的出行利器:百度地图热力
  9. linux关闭进程命令kill
  10. VS2013编译libjpeg库