/
siblun
/
ReadFlow
Обзор
Документация
Войти
/
siblun
/
ReadFlow
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
lib/presentation/providers/note_provider.dart
116 строк
3 KB
siblun
Add docs
21 апр 2026, 16:13
21 апр 2026, 16:13
c40d018
Код
Авторство
О чём код?
import 'dart:async'; import 'package:flutter/foundation.dart'; import '../../domain/models/note_model.dart'; import '../../domain/repositories/note_repository.dart'; /// Управляет заметками и цитатами. /// /// Особенности: /// - Поддерживает "ленивую" подписку: данные загружаются только при открытии конкретной книги. /// - Гарантирует очистку ресурсов через [unsubscribe] при уходе с экрана. class NoteProvider extends ChangeNotifier { final INoteRepository _repository; List<Note> _notes = []; bool _isLoading = false; String? _error; StreamSubscription<List<Note>>? _noteSubscription; NoteProvider(this._repository); List<Note> get notes => _notes; bool get isLoading => _isLoading; String? get error => _error; /// Подписывается на поток заметок для [bookId]. /// При получении данных автоматически сбрасывает ошибки и индикатор загрузки. void subscribeToBook(String bookId) { _noteSubscription?.cancel(); _noteSubscription = _repository.watchByBook(bookId).listen((notes) { _notes = notes; _isLoading = false; _error = null; notifyListeners(); }, onError: (error) { _error = error.toString(); _isLoading = false; notifyListeners(); }); } void unsubscribe() { _noteSubscription?.cancel(); _noteSubscription = null; } Future<void> loadNotesForBook(String bookId) async { _isLoading = true; _error = null; notifyListeners(); try { _notes = await _repository.getByBook(bookId); } catch (e) { _error = e.toString(); } _isLoading = false; notifyListeners(); } /// Сохраняет заметку. Если ID заметки уже существует в базе — обновляет её, /// в противном случае создает новую. /// Валидирует пустой текст перед сохранением. Future<bool> saveNote(Note note) async { if (note.text.trim().isEmpty) return false; try { final existing = await _repository.getById(note.id); if (existing != null) { await _repository.update(note); } else { await _repository.insert(note); } _notes = await _repository.getByBook(note.bookId); notifyListeners(); return true; } catch (e, stack) { debugPrint('Error saving note: $e'); debugPrint('Stack: $stack'); _error = e.toString(); notifyListeners(); return false; } } Future<bool> deleteNote(String noteId) async { try { await _repository.delete(noteId); notifyListeners(); return true; } catch (e) { _error = e.toString(); notifyListeners(); return false; } } void clear() { unsubscribe(); _notes = []; _error = null; notifyListeners(); } @override void dispose() { unsubscribe(); super.dispose(); } }