#flutter
Вопрос:
Я попробовал 3 разных способа, но все они возвращают одну и ту же ошибку:
Карта<Разрешение, статус разрешения> статусы = ждут [ Разрешение.хранилище, ].запрос();
String csv = const ListToCsvConverter().convert(rows);
var dir = await getApplicationDocumentsDirectory();
Directory appDocDir = await getApplicationDocumentsDirectory();
String appDocPath = appDocDir.path;
Directory tempDir = await getTemporaryDirectory();
String tempPath = tempDir.path;
String dir2 = "";
if (Platform.isAndroid) {
dir2 = (await getExternalStorageDirectory())!.path;
} else if (Platform.isIOS) {
dir2 = (await getApplicationDocumentsDirectory()).path;
}
print(dir2);
print(appDocPath);
print(tempPath);
File f = File(tempPath "/my_rents/CSV/filename.csv");
f.writeAsString(csv);
Также запросите разрешения:
Map<Permission, PermissionStatus> statuses = await [
Permission.storage,
].request();
Комментарии:
1. Вы добавили путь к CSV-файлу в pubspec.yaml?
2. единственное, что я туда добавил, — это посылка. Вы, что ниже активов, которые я должен добавить — /данные/пользователь/0/com.drodriguez.my_rents/кэш/my_rents/CSV?
3. Да, конечно, вам следует добавить путь к CSV-файлу в pubspec.yaml эта ссылка может помочь вам развеяться.dev/документы/разработка/пользовательский интерфейс/ресурсы и изображения
4. Ошибка: не удается найти запись каталога в pubspec.yaml: /Пользователи/дани/репозитории/дани/мои торренты/хранилище/эмулируется/0/Android/данные/com.drodriguez.мои торренты/файлы/ /Пользователи/дани/репозитории/дани/мои торренты/ это мой путь к проекту, остальное-путь к мобильному устройству, где мне нужно сохранить файл
5. Я нигде не вижу, чтобы это было необходимо добавлять: aimensayoud.medium.com/…
Ответ №1:
Попробуйте этот пример кода для создания csv-файлов, в нем используются два плагина Permission_handler и path_provider.
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
class CsvDemo extends StatefulWidget {
CsvDemo({Key? key}) : super(key: key);
@override
_CsvDemoState createState() => _CsvDemoState();
}
class _CsvDemoState extends State<CsvDemo> {
late CommaSeparatedValues csv;
List<Student> studentsList = [
Student('S1', 'Soufiane', 23),
Student('S2', 'Abraham', 30),
Student('S3', 'Jack', 25),
Student('S3', 'Pascal', 40),
];
@override
void initState() {
super.initState();
csv = CommaSeparatedValues();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
'CSV',
),
centerTitle: true,
),
body: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Expanded(
child: FutureBuilder<List<Student>>(
future:
csv.read(), // a previously-obtained Future<String> or null
builder: (BuildContext context,
AsyncSnapshot<List<Student>> snapshot) {
List<Widget> children;
if (snapshot.hasData) {
children = <Widget>[
Text(
csv.listToString(
snapshot.data!.toList(),
),
),
];
} else if (snapshot.hasError) {
children = <Widget>[
const Icon(
Icons.error_outline,
color: Colors.red,
size: 60,
),
Padding(
padding: const EdgeInsets.only(top: 16),
child: Text('Error: ${snapshot.error}'),
)
];
print(snapshot.error);
} else {
children = const <Widget>[
SizedBox(
child: CircularProgressIndicator(),
width: 60,
height: 60,
),
Padding(
padding: EdgeInsets.only(top: 16),
child: Text('Awaiting result...'),
)
];
}
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: children,
),
);
},
),
),
Padding(
padding: const EdgeInsets.all(20.0),
child: ElevatedButton(
onPressed: () async {
if (Platform.isAndroid) {
var status = await Permission.storage.request();
if (status.isGranted) {
csv.write(csv.listToString(studentsList));
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('students.csv is saved successfully !'),
),
);
} else if (status.isDenied) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Storage access is denied !'),
),
);
}
} else if (Platform.isLinux) {
csv.write(csv.listToString(studentsList));
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('students.csv is saved successfully !'),
),
);
}
},
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Text('Write CSV'),
),
),
),
SizedBox(height: 10),
],
),
);
}
}
class CommaSeparatedValues {
Future<String> get _localPath async {
final directory;
if (Platform.isAndroid) {
directory = await getExternalStorageDirectory();
else if (Platform.isIOS) {
directory = (await getApplicationDocumentsDirectory()).path;
} else {
directory = await getDownloadsDirectory();
}
return directory!.path;
}
Future<File> get _localFile async {
// /storage/emulated/0/Download/students.csv'
final path = await _localPath;
return File('$path/students.csv');
}
/// To write a csv file
Future<File> write(String data) async {
final file = await _localFile;
// Write the file or append the file if already exists
return file.writeAsString(data, mode: FileMode.append);
}
/// To read a csv file
Future<List<Student>> read() async {
final file = await _localFile;
// Read the file as lines
List<String> content = await file.readAsLines();
List<Student> students = [];
for (int i = 1; i < content.length; i ) {
List<String> rows = content[i].split(",");
students.add(Student(rows[0], rows[1], int.parse(rows[2])));
}
return students;
}
String listToString(List<Student> studentsList) {
String data = 'Id,Name,Agen';
studentsList.forEach((element) {
data = data
element.id
','
element.name
','
element.age.toString()
'n';
});
return data;
}
}
class Student {
String id;
String name;
int age;
Student(this.id, this.name, this.age);
String get getId => this.id;
set setId(String id) => this.id = id;
String get getName => this.name;
set setName(String name) => this.name = name;
int get getAge => this.age;
set setAge(int age) => this.age = age;
}
Комментарии:
1. это делает то же самое, что и я: .writeAsString. Я попробовал этот код и получил точно такое же поведение
2. Есть еще идеи? Есть еще идеи?
3. это работает на меня, я могу очень легко создавать и читать csv-файл с помощью этого фрагмента кода в Android и Linux.
4. что он делает после запуска .writeAsString? Показывает ли это что-нибудь конкретное? Вам нужно перейти, чтобы вручную найти этот файл?