Flutter文件保存插件filesaverz的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter 文件保存插件 filesaverz 的使用

介绍

filesaverz 是一个可自定义的文件保存和文件选择器插件,它使用户能够轻松浏览文件夹并保存文件或选择文件,特别适用于 Android 平台。

预览

screen-capture (1)

安装

  1. pubspec.yaml 文件中添加依赖:

    dependencies:
      filesaverz: ^3.2.1
    
  2. AndroidManifest.xml 中添加权限:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.example">
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    </manifest>
    
  3. 如果遇到 MissingPluginException 错误,请在 app/build.gradle 中添加以下配置:

    buildTypes {
        release {
            shrinkResources false
            minifyEnabled false
            signingConfig signingConfigs.release
        }
    }
    
  4. 导入 filesaverz 包:

    import 'package:filesaverz/filesaverz.dart';
    

使用方法

  1. 设置 FileSaver 小部件

    FileSaver fileSaver = FileSaver(
      fileTypes: const ['txt', 'pdf'],
      initialFileName: 'Untitled File',
    );
    
  2. 自定义 FileSaver

    FileSaver fileSaver = FileSaver.builder(
      fileTypes: const ['txt', 'pdf'],
      initialFileName: 'Untitled File',
      headerBuilder: (context, state) => /* Your Widget */,
      bodyBuilder: (context, state) => /* Your Widget */,
      footerBuilder: (context, state) => /* Your Widget */,
    );
    
  3. 异步调用方法

    • 获取保存文件的路径:

      String? path = await fileSaver.getPath(context);
      
    • 调用 writeAsBytes 方法:

      fileSaver.writeAsBytes(bytes, context: context);
      
    • 调用 writeAsBytesSync 方法:

      fileSaver.writeAsBytesSync(bytes, context: context);
      
    • 调用 writeAsString 方法:

      fileSaver.writeAsString(contents, context: context);
      
    • 调用 writeAsStringSync 方法:

      fileSaver.writeAsStringSync(contents, context: context);
      
    • 选择单个文件:

      File? file = await fileSaver.pickFile(context);
      
    • 选择多个文件:

      List<File>? files = await fileSaver.pickFiles(context);
      

属性说明

  • headerBuilder:可选的构建器,用于自定义头部。

    (context, state) {
      return Text('My Custom Header Widget');
    },
    
  • bodyBuilder:可选的构建器,用于自定义主体。

    (context, state) {
      return Text('My Custom Body Widget');
    },
    
  • footerBuilder:可选的构建器,用于自定义底部。

    (context, state) {
      return Text('My Custom Footer Widget');
    },
    
  • style:设置自定义的颜色、文本样式、图标和显示的文本。

    FileSaverStyle(
      primaryColor: Colors.blue,
      secondaryColor: Colors.white,
      primaryTextStyle: TextStyle(),
      secondaryTextStyle: TextStyle(),
      icons: [
        FileSaverIcon(icon: (path) => Icon(Icons.default)),
        FileSaverIcon.directory(icon: (path) => Icon(Icons.folder)),
        FileSaverIcon.file(fileType: 'jpg', icon: (path) => Image.file(File(path))),
      ],
      text: FileSaverText(
        popupNo: 'Nay',
        popupYes: 'Sí',
      ),
    ),
    
  • initialFileName:用于保存文件时的初始文件名。

    'Untitled File',
    
  • initialDirectory:在 Android 中,默认调用 Environment.getExternalStorageDirectory

    Directory('Storage Path'),
    
  • fileTypes:用于限制显示的文件类型,并在保存文件时作为选项。

    const ['jpg', 'gif', 'png'],
    

示例代码

以下是一个完整的示例代码,展示了如何使用 filesaverz 插件来保存文件和选择文件:

import 'dart:io';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:filesaverz/filesaverz.dart';

void main() {
  runApp(const MaterialApp(
    title: 'File Saver Example',
    debugShowCheckedModeBanner: false,
    home: MyApp(),
  ));
}

/// 主页面
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    /// 设置文件浏览器
    FileSaver fileSaver = FileSaver(
      initialFileName: 'New File',
      fileTypes: const ['txt'],
    );

    return Scaffold(
      body: Center(
        child: Column(mainAxisSize: MainAxisSize.min, children: [
          /// 保存文件
          MyButton(
            text: 'Save File',
            icon: Icons.save,
            onTap: () {
              fileSaver.writeAsString('Hello World', context: context);
            },
          ),

          /// 选择文件
          MyButton(
            text: 'Pick File',
            icon: Icons.insert_drive_file_rounded,
            onTap: () async {
              File? file = await fileSaver.pickFile(context);
              log(file.toString());
            },
          ),

          /// 选择多个文件
          MyButton(
            text: 'Pick Files',
            icon: Icons.file_copy,
            onTap: () async {
              List<File>? files = await fileSaver.pickFiles(context);
              log(files.toString());
            },
          ),
        ]),
      ),
    );
  }
}

/// 自定义按钮
class MyButton extends StatelessWidget {
  const MyButton({Key? key, required this.text, required this.icon, this.onTap})
      : super(key: key);

  final String text;
  final IconData icon;
  final void Function()? onTap;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.symmetric(vertical: 10.0),
      child: Material(
        color: Colors.blue,
        child: InkWell(
          onTap: onTap,
          child: Padding(
            padding: const EdgeInsets.all(10),
            child: Row(
              mainAxisSize: MainAxisSize.min,
              children: [
                Icon(icon, color: Colors.white),
                const SizedBox(width: 10),
                Text(
                  text,
                  style: const TextStyle(
                    color: Colors.white,
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter文件保存插件filesaverz的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文件保存插件filesaverz的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用filesaverz插件来保存文件的示例代码。这个示例将展示如何从字符串数据创建一个文件并保存到设备的存储中。

首先,你需要在你的pubspec.yaml文件中添加filesaverz依赖:

dependencies:
  flutter:
    sdk: flutter
  filesaverz: ^x.y.z  # 替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以使用以下代码来保存文件:

import 'package:flutter/material.dart';
import 'package:filesaverz/filesaverz.dart';
import 'dart:io';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('FileSaverz Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _saveFile,
            child: Text('Save File'),
          ),
        ),
      ),
    );
  }

  Future<void> _saveFile() async {
    // 要保存的文件内容
    String fileContent = "Hello, this is a test file!";

    // 获取外部存储目录(需要权限)
    Directory externalDir = await getExternalStorageDirectory();

    // 定义文件路径和名称
    String filePath = "${externalDir!.path}/test_file.txt";

    // 创建文件对象
    File file = File(filePath);

    // 写入文件内容
    bool result = await file.writeAsString(fileContent);

    // 使用FileSaverz保存文件(可选,实际上在上一步已经保存了文件)
    // 这里只是为了展示如何使用FileSaverz插件
    if (result) {
      try {
        await FileSaver.saveFile(
          file: file,
          defaultName: "test_file.txt",
          mimeType: "text/plain",
        );
        
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text("File saved successfully!")),
        );
      } catch (e) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text("Failed to save file: $e")),
        );
      }
    } else {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text("Failed to write file content")),
      );
    }
  }
}

注意事项

  1. 权限处理:在Android和iOS上保存文件需要相应的权限。你需要在AndroidManifest.xml中添加权限,并在iOS的Info.plist中添加相应的键和描述。此外,你还需要在运行时请求权限(可以使用permission_handler等插件)。

  2. 外部存储路径getExternalStorageDirectory()返回的是外部存储的根目录。在某些Android设备上,特别是Android 10及以上版本,你可能需要使用MediaStore API或Scoped Storage来处理文件存储。

  3. 错误处理:在实际应用中,你需要更健壮的错误处理逻辑,以处理可能发生的各种异常。

  4. 文件类型:上述示例中保存的是一个文本文件。如果你需要保存其他类型的文件(如图片、PDF等),你需要调整mimeType和文件内容格式。

这个示例应该能帮助你开始在Flutter项目中使用filesaverz插件来保存文件。如果你有任何进一步的问题或需要更详细的说明,请随时提问。

回到顶部