免责声明:这仅适用于 android
准备
您首先必须获得使用外部存储的权限,请转到android/app/src/main/AndroidManifest.xml
添加uses-permission 和android:request 行。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test_write_file">
<!-- Permissions options for the `storage` group -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:requestLegacyExternalStorage="true"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
将这两个包添加到 pubspec.yaml
dependencies:
ext_storage: ^1.0.3
permission_handler: ^6.1.1
权限
然后要真正获得您必须请求的权限,为此我们使用permission_handler。
import 'package:permission_handler/permission_handler.dart';
void permission() async {
var status = await Permission.storage.status;
if (!status.isGranted) {
await Permission.storage.request();
}
}
写
然后再写它的 3 个步骤:
首先获取写入的路径,我指定了文档,但您也可以选择下载 DCIM 等等。
然后在目录中获取/创建文件,然后写入文件。
import 'package:ext_storage/ext_storage.dart';
import 'dart:io';
Future<void> startWrite() async {
String path = await _getPath();
File file = await _localFile(path);
writeFile(file);
}
Future<String> _getPath() async {
return ExtStorage.getExternalStoragePublicDirectory(
ExtStorage.DIRECTORY_DOCUMENTS);
}
Future<File> _localFile(String path) async {
return File('$path/myFile.txt');
}
Future<File> writeFile(File file) async {
return file.writeAsString('This is a test');
}
完整代码
我的工作测试项目
import 'package:ext_storage/ext_storage.dart';
import 'package:flutter/material.dart';
import 'dart:io';
import 'package:permission_handler/permission_handler.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'ExtStorage Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
void permission() async {
var status = await Permission.storage.status;
if (!status.isGranted) {
await Permission.storage.request();
}
}
Future<void> startWrite() async {
String path = await _getPath();
File file = await _localFile(path);
writeFile(file);
}
Future<String> _getPath() async {
return ExtStorage.getExternalStoragePublicDirectory(ExtStorage.DIRE);
}
Future<File> _localFile(String path) async {
return File('$path/myFile.txt');
}
Future<File> writeFile(File file) async {
return file.writeAsString('This is a test');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Test'),
),
body: Center(
child: Column(
children: [
TextButton(
child: Text('Permission'),
onPressed: () => permission(),
),
TextButton(
child: Text('Write'),
onPressed: () => startWrite(),
),
],
),
),
);
}
}