Flutter持久化用户目录访问插件persistent_user_dir_access_android的使用

Flutter持久化用户目录访问插件persistent_user_dir_access_android的使用

概述

persistent_user_dir_access_android 是一个轻量级的、无依赖(除了 Flutter)的包,允许 Android 用户为应用程序在重启之间选择一个目录来写入数据。所有代码都经过全面测试并有文档支持。


开始使用

使用此包非常简单,让我们通过一个示例来展示如何使用它:

示例代码

Future<void> saveText(String text) async {
  // 创建 PersistentUserDirAccessAndroid 的实例,方便调试。
  final userDirs = PersistentUserDirAccessAndroid();

  // 显示操作系统的目录选择器给用户。
  final String selectedDirUri = await userDirs.requestDirectoryUri();

  // 您可以始终保存目录的 URI 以备后用,即使在应用重启之后。
  this.selectedUri = selectedDirUri;

  // 将您的 URI 传递给 writeFile 方法以创建新文件:
  await userDirs.writeFile(
    selectedDirUri, // 已选目录的 URI
    'test.txt',     // 文件名(传递给 Android)。操作系统会自动避免覆盖文件
    'text/plain',   // 指定 MIME 类型
    utf8.encode(text), // 传递二进制数据
  );
}

更多使用信息

如需了解更多使用信息,请查看 example 目录。


贡献

PR 和问题反馈都是受欢迎的!更多信息请查看 CONTRIBUTING.md


示例代码详解

以下是一个完整的示例代码,展示了如何使用 persistent_user_dir_access_android 插件:

示例代码文件路径

example/lib/main.dart

示例代码

import 'dart:convert';

import 'package:flutter/material.dart';

import 'package:persistent_user_dir_access_android/persistent_user_dir_access_android.dart';

void main() => runApp(const MaterialApp(home: App()));

/// 示例应用,展示 persistent_user_dir_access_android 插件的使用。
class App extends StatefulWidget {
  /// 创建展示 persistent_user_dir_access_android 插件的示例应用。
  ///
  /// 需要 [MaterialApp] 祖先。
  const App({
    super.key,
    this.userDirs = const PersistentUserDirAccessAndroid(),
  });

  /// 用户目录实现。
  final PersistentUserDirAccessAndroid userDirs;

  [@override](/user/override)
  State<App> createState() => _AppState();
}

class _AppState extends State<App> {
  String? _uri; // 存储用户选择的目录 URI

  [@override](/user/override)
  Widget build(BuildContext context) => Scaffold(
        appBar: AppBar(
          title: const Text('用户目录示例应用'),
        ),
        body: ListView(
          children: [
            // 显示已选择的目录 URI
            Card(child: Text('已选择目录: $_uri')),
            // 请求用户选择目录
            ListTile(
              title: const Text('requestDirectoryUri()'),
              onTap: () async {
                final dirUri = await widget.userDirs.requestDirectoryUri();
                setState(() {
                  _uri = dirUri;
                });
              },
            ),
            // 写入文件到已选择的目录
            ListTile(
              title: const Text("writeFile(uri, 'test.txt', 'text/plain', utf8.encode('Test text'))"),
              onTap: _uri == null
                  ? null // 如果未选择目录,则禁用按钮
                  : () async {
                      await widget.userDirs.writeFile(
                        _uri!, // 已选择的目录 URI
                        'test.txt', // 文件名
                        'text/plain', // MIME 类型
                        utf8.encode('Test text'), // 文件内容
                      );
                    },
            )
          ],
        ),
      );
}

更多关于Flutter持久化用户目录访问插件persistent_user_dir_access_android的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter持久化用户目录访问插件persistent_user_dir_access_android的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


persistent_user_dir_access_android 是一个 Flutter 插件,旨在帮助开发者在 Android 设备上持久化地访问用户目录。这个插件特别适用于需要在 Android 设备上存储和访问用户数据的情况,尤其是在应用被卸载后仍然需要保留数据时。

安装插件

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

dependencies:
  flutter:
    sdk: flutter
  persistent_user_dir_access_android: ^1.0.0  # 请使用最新版本

然后,运行 flutter pub get 来安装插件。

使用插件

  1. 导入插件

    在你的 Dart 文件中导入插件:

    import 'package:persistent_user_dir_access_android/persistent_user_dir_access_android.dart';
    
  2. 初始化插件

    在使用插件之前,建议先初始化它:

    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await PersistentUserDirAccessAndroid.initialize();
      runApp(MyApp());
    }
    
  3. 获取持久化目录路径

    你可以使用 getPersistentUserDir 方法来获取持久化目录的路径:

    Future<void> getPersistentDir() async {
      String? persistentDir = await PersistentUserDirAccessAndroid.getPersistentUserDir();
      if (persistentDir != null) {
        print('Persistent Directory: $persistentDir');
      } else {
        print('Failed to get persistent directory');
      }
    }
    
  4. 存储和读取文件

    你可以使用获取到的目录路径来存储和读取文件:

    Future<void> saveFile() async {
      String? persistentDir = await PersistentUserDirAccessAndroid.getPersistentUserDir();
      if (persistentDir != null) {
        File file = File('$persistentDir/myfile.txt');
        await file.writeAsString('Hello, Persistent User Dir!');
        print('File saved at: ${file.path}');
      }
    }
    
    Future<void> readFile() async {
      String? persistentDir = await PersistentUserDirAccessAndroid.getPersistentUserDir();
      if (persistentDir != null) {
        File file = File('$persistentDir/myfile.txt');
        String content = await file.readAsString();
        print('File content: $content');
      }
    }
    

注意事项

  • 权限: 确保你的应用具有必要的文件访问权限。你可能需要在 AndroidManifest.xml 中添加以下权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

    并且在运行时请求这些权限。

  • 兼容性: 该插件主要针对 Android 平台,因此在 iOS 或其他平台上可能无法使用。

  • 数据安全: 持久化存储的数据在应用卸载后仍然保留,因此需要确保数据的安全性,避免敏感信息泄露。

示例代码

以下是一个完整的示例,展示了如何使用 persistent_user_dir_access_android 插件来存储和读取文件:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await PersistentUserDirAccessAndroid.initialize();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PersistentDirDemo(),
    );
  }
}

class PersistentDirDemo extends StatefulWidget {
  [@override](/user/override)
  _PersistentDirDemoState createState() => _PersistentDirDemoState();
}

class _PersistentDirDemoState extends State<PersistentDirDemo> {
  String? _fileContent;

  Future<void> _saveFile() async {
    String? persistentDir = await PersistentUserDirAccessAndroid.getPersistentUserDir();
    if (persistentDir != null) {
      File file = File('$persistentDir/myfile.txt');
      await file.writeAsString('Hello, Persistent User Dir!');
      print('File saved at: ${file.path}');
    }
  }

  Future<void> _readFile() async {
    String? persistentDir = await PersistentUserDirAccessAndroid.getPersistentUserDir();
    if (persistentDir != null) {
      File file = File('$persistentDir/myfile.txt');
      String content = await file.readAsString();
      setState(() {
        _fileContent = content;
      });
      print('File content: $content');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Persistent User Dir Access Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: _saveFile,
              child: Text('Save File'),
            ),
            ElevatedButton(
              onPressed: _readFile,
              child: Text('Read File'),
            ),
            if (_fileContent != null)
              Padding(
                padding: const EdgeInsets.all(16.0),
                child: Text('File Content: $_fileContent'),
              ),
          ],
        ),
      ),
    );
  }
}
回到顶部