generated from dellevin/template
3.7 KiB
3.7 KiB
状态管理
AppProvider
AppProvider(lib/providers/app_provider.dart)是应用唯一的 ChangeNotifier,通过 MultiProvider 在根节点注入,所有页面通过 context.watch<AppProvider>() 或 context.read<AppProvider>() 访问。
管理的状态
数据列表
| 字段 | 类型 | 说明 |
|---|---|---|
_movies |
List<Movie> |
影视数据 |
_books |
List<Book> |
书籍数据 |
_notes |
List<Note> |
笔记数据 |
UI 状态
| 字段 | 类型 | 说明 |
|---|---|---|
_mainTabIndex |
int |
主标签页(0=观影, 1=阅读, 2=笔记) |
_bottomNavIndex |
int |
底部导航(0=主页, 1=新增, 2=我的) |
_bottomNavVisible |
bool |
底部导航栏可见性 |
_themeMode |
ThemeMode |
主题模式 |
_movieStatusIndex |
int |
影视状态筛选(0=已看, 1=想看, 2=在看) |
_bookStatusIndex |
int |
书籍状态筛选(0=读完, 1=在读, 2=准备读) |
_drawerOpen |
bool |
侧边菜单状态 |
DAO 实例
final MovieDao _movieDao = MovieDao();
final BookDao _bookDao = BookDao();
final NoteDao _noteDao = NoteDao();
final MovieReviewDao _reviewDao = MovieReviewDao();
final MoviePosterDao _posterDao = MoviePosterDao();
final BookReviewDao _bookReviewDao = BookReviewDao();
final BookExcerptDao _bookExcerptDao = BookExcerptDao();
final TagDao _tagDao = TagDao();
数据加载
全量加载
initDatabase() → loadMovies() + loadBooks() + loadNotes()
根据 _useRemote 决定从本地 SQLite 或远程 API 加载。
分页加载
分页大小:_pageSize = 20
loadMoviesPaged({String? status, required int offset})
loadBooksPaged({String? status, required int offset})
loadNotesPaged({required int offset})
供列表页触底加载使用。
CRUD 操作
所有 CRUD 方法都走双路径(本地/远程),并自动重新加载数据:
addMovie(Movie movie) → 本地: _movieDao.insertMovie / 远程: ServerDataService.saveMovie → loadMovies()
updateMovie(Movie movie) → 本地: _movieDao.updateMovie / 远程: ServerDataService.saveMovie → loadMovies()
removeMovie(String id) → 本地: _movieDao.deleteMovie / 远程: ServerDataService.deleteMovie → loadMovies()
Book、Note 同理。远程模式下还会自动上传关联图片。
子实体操作
影评、海报、书评、摘抄的 CRUD 方法不直接修改内存列表,而是按需查询:
getMovieReviews(movieId) / addMovieReview(review) / updateMovieReview(review) / removeMovieReview(id)
getMoviePosters(movieId) / addMoviePoster(poster) / removeMoviePoster(id)
getBookReviews(bookId) / addBookReview(review) / updateBookReview(review) / removeBookReview(id)
getBookExcerpts(bookId) / addBookExcerpt(excerpt) / updateBookExcerpt(excerpt) / removeBookExcerpt(id)
回收站
getDeletedMovies() / restoreMovie(id) / permanentDeleteMovie(id)
getDeletedBooks() / restoreBook(id) / permanentDeleteBook(id)
getDeletedNotes() / restoreNote(id) / permanentDeleteNote(id)
clearRecycleBin() // 清空所有已删除条目
永久删除时会同时清理关联图片目录。
标签管理
getTags(type) // 获取某类型标签
addTag(name, type) // 添加标签
renameTag(tagId, newName, type) // 重命名(级联更新关联条目)
deleteTag(tagId, type, {replacementName}) // 删除(可替换关联条目的标签名)
deleteTagOnly(tagId, type) // 仅删除标签本身,不影响条目
syncTagsFromData() // 从现有数据回填标签表
标签类型:movie_genre、book_genre、note_tag。