Зберігання файлів у Flutter стало простішим: опанування пакету path_provider

pic

Тема, про яку я дізнався далі — це pathprovider, оскільки я вивчаю різні способи зберігання даних у Flutter. Раніше я писав про sharedpreference; ви можете прочитати про це тут. Давайте поговоримо про пакет path_provider.

Одним із поширених завдань у розробці додатків є управління локальним зберіганням файлів — збереження даних користувача, кешування файлів або збереження налаштувань додатка. Нещодавно я заглибився в цю тему та вивчав пакет path_provider у Flutter разом з можливостями I/O у Dart. Дозвольте поділитися моїм досвідом та тим, як ви можете реалізувати це у своїх проектах.

Що таке пакет Path_provider?

Пакет path_provider у Flutter забезпечує простий спосіб доступу до директорій зберігання файлів на пристрої, таких як директорія документів додатка, тимчасова директорія або зовнішнє зберігання. Це допомагає зберігати дані між запусками додатка, або завантажувати дані з інтернету та зберігати їх для подальшого офлайн-використання.

Як працює CRUD за допомогою path_provider?

Можливо, у вас є питання щодо того, як pathprovider допомагає зберігати дані, читати з файлів і писати у файли. Дозвольте прояснити одну річ: pathprovider лише надає місце для зберігання файлів. Він не відповідає за запис або читання даних.

Введемо ще одну частину — dart:i/o, Dart:i/o виконує частину запису та читання. Я поясню, як вони працюють разом, щоб виконати всю задачу. Пакет path_provider і Dart I/O — це доповнювальні інструменти, які, об’єднуючись, дозволяють ефективно керувати зберіганням файлів та операціями в додатку Flutter.

Ось чому їх часто використовують разом:

1. Обов’язки path_provider

  • Пакет path_provider знаходить системні директорії, такі як:
    • Тимчасові директорії.
    • Директорії документів.
    • Директорії підтримки додатка.
  • Ці директорії є специфічними для платформ (Android, iOS тощо), і path_provider забезпечує безперебійну роботу додатка на різних платформах, динамічно надаючи ці шляхи.

2. Обов’язки Dart I/O

  • Dart I/O відповідає за маніпуляцію з файлами, такі як:
    • Створення, запис, читання та видалення файлів.

Сподіваюся, ви зрозуміли всю роботу обох інструментів. Знаю, що це може бути трохи заплутано, ви можете перечитати це кілька разів для більш чіткого розуміння.

Методи, надані path_provider

Пакет Path_provider надає деякі методи, за допомогою яких ми можемо отримати доступ до директорій. Ось кілька методів:

  1. Тимчасова директорія: Для зберігання тимчасових файлів. Ці файли можуть бути видалені після закриття додатка.
Future locatePaths() async {  
 // Отримуємо тимчасову директорію  
 Directory tempDir = await getTemporaryDirectory();  
 // tempDir.path для отримання точного шляху  
 print('Тимчасова директорія: ${tempDir.path}');  
}
  1. Директорія документів додатка: Для постійних файлів, специфічних для додатка.
Future locatePaths() async {  
 // Отримуємо директорію документів  
 Directory docsDir = await getApplicationDocumentsDirectory();  
 print('Директорія документів: ${docsDir.path}');  
}

**Директорія підтримки додатка:** Для файлів, які операційна система не повинна видаляти автоматично.

Future locatePaths() async {
// Отримати директорію підтримки додатка
Directory supportDir = await getApplicationSupportDirectory();
print('Директорія підтримки: ${supportDir.path}');
}
```

Простий приклад: Управління завданнями

Крок 1: Додавання пакету:

Додайте path_provider до вашого файлу pubspec.yaml:

dependencies:  
 path_provider: ^latest

Запустіть flutter pub get, щоб встановити пакет.

Крок 2: Налаштування шляху до файлу

Використовуйте getApplicationDocumentsDirectory(), щоб знайти директорію документів додатка:

import 'dart:io';  
import 'package:path_provider/path_provider.dart';  

Future getLocalFile() async {  
 final directory = await getApplicationDocumentsDirectory();  
 return File('${directory.path}/tasks.txt');  
}

Крок 3: Створення завдань

Додати нове завдання до файлу:

Future addTask(String task) async {  
 final file = await getLocalFile();  
 await file.writeAsString(task + '\n', mode: FileMode.append);  
}

Крок 4: Читання завдань

Отримати список завдань з файлу:

Future> readTasks() async {  
 try {  
 final file = await getLocalFile();  
 final content = await file.readAsString();  
 return content.split('\n').where((line) => line.isNotEmpty).toList();  
 } catch (e) {  
 print('Помилка при читанні файлу: $e');  
 return [];  
 }  
}

Крок 5: Оновлення списку

Заміна старих завдань на новий список:

Future updateSingleTasks(String oldTask, String newTask) async {  
 List tasks = await readTasks();  
 final file = await getLocalFile(); // Отримуємо шлях до файлу  

 int index = tasks.indexOf(oldTask);  
 if (index != -1) {  
 tasks[index] = newTask; // Оновлюємо завдання  
 // Перезаписуємо файл з новим списком завдань  
 // Зберігаємо оновлені завдання в файл  
 await file.writeAsString(tasks.join('\n'));   
 print("Завдання успішно оновлено.");  
 } else {  
 print("Завдання не знайдено.");  
 }  
}

Крок 6: Видалення завдання

Видалити одне завдання з файлу:

Future deleteTask(String taskToDelete) async {  
 final tasks = await readTasks();  
 final file = await getLocalFile();  
 tasks.remove(taskToDelete);  
 await file.writeAsString(tasks.join('\n'));  
}

Що робити після вивчення цього?

Я порекомендував би створити додаток для нотаток та простий todo-додаток, в якому виконується операція crud. Це допоможе вам чітко зрозуміти всі вищезгадані моменти. І з цим ви навчитеся, як працювати з файлами за допомогою інструментів Dart I/O.

Заключні зауваження

Це все з моєї сторони! Якщо у вас є будь-які зауваження, питання або відгуки, не соромтеся звертатися. Якщо є конкретна тема, яку ви хочете, щоб я висвітлив, просто напишіть про це в коментарях.

Давайте з’єднаємось на LinkedIn! та GitHub

Дякую за те, що прочитали до кінця. Перед тим, як піти, будь ласка, поставте "плескання" і не забудьте підписатися на мене для більше таких тем! 👏.

Перекладено з: Flutter File Storage Made Easy: Mastering the path_provider Package

Leave a Reply

Your email address will not be published. Required fields are marked *