Flutter: При создании CSV такого файла или каталога нет

#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? Показывает ли это что-нибудь конкретное? Вам нужно перейти, чтобы вручную найти этот файл?