diff --git a/lib/main.dart b/lib/main.dart index 0582d60..1db6ed0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -12,14 +12,34 @@ import 'utils/sync/auto_backup_service.dart'; import 'utils/sync/server_sync_service.dart'; import 'utils/usage_stats_service.dart'; import 'providers/app_provider.dart'; -import 'package:flutter/widget_previews.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await UserPrefs.init(); final appProvider = AppProvider(); runApp(MyApp(appProvider: appProvider)); - unawaited(_validateSyncOnStartup().then((_) => appProvider.initDatabase().then((_) => appProvider.initMainTabIndex()))); + + unawaited(_bootstrap(appProvider)); +} + +/// 启动后台任务:先校验同步状态,再按顺序初始化数据库与主标签, +/// 保持 UI 先渲染、数据后就绪。 +Future _bootstrap(AppProvider appProvider) async { + // 数据库优先初始化(不被 sync 阻塞) + try { + await appProvider.initDatabase(); + } catch (e) { + debugPrint('[Startup] 数据库初始化失败: $e'); + } + appProvider.initMainTabIndex(); + + // sync 校验在数据库加载完成后执行(避免阻塞本地数据展示) + try { + await _validateSyncOnStartup(); + } catch (e) { + debugPrint('[Startup] 同步状态校验失败: $e'); + } + unawaited(_initAutoBackup()); unawaited(_initUsageStats()); } @@ -184,14 +204,3 @@ class _AppIconWrapperState extends State<_AppIconWrapper> { return widget.child; } } - -@Preview(name: "MookNote App Preview") -Widget previewMyApp() { - final appProvider = AppProvider(); - return MultiProvider( - providers: [ - ChangeNotifierProvider.value(value: appProvider), - ], - child: MyApp(appProvider: appProvider), - ); -} diff --git a/lib/models/data_models.dart b/lib/models/data_models.dart index 1dc05c4..35c4929 100644 --- a/lib/models/data_models.dart +++ b/lib/models/data_models.dart @@ -79,7 +79,7 @@ class Movie { 'id': id, 'title': title, 'poster_path': posterPath, - 'release_date': releaseDate?.toUtc().toUtc().toIso8601String(), + 'release_date': releaseDate?.toUtc().toIso8601String(), 'directors': jsonEncode(directors), 'writers': jsonEncode(writers), 'actors': jsonEncode(actors), diff --git a/lib/pages/search_page.dart b/lib/pages/search_page.dart index 89726de..0bd4d0e 100644 --- a/lib/pages/search_page.dart +++ b/lib/pages/search_page.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:io'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/app_provider.dart'; @@ -27,6 +26,8 @@ class _SearchPageState extends State { List<_SearchResult> _results = []; bool _hasSearched = false; + List _matchingTags = []; + String? _selectedTag; Timer? _debounce; @@ -64,7 +65,10 @@ class _SearchPageState extends State { if (movie.title.toLowerCase().contains(lowerKeyword) || movie.alternateTitles.any((t) => t.toLowerCase().contains(lowerKeyword)) || (movie.summary?.toLowerCase().contains(lowerKeyword) ?? false) || - movie.genres.any((g) => g.toLowerCase().contains(lowerKeyword))) { + movie.genres.any((g) => g.toLowerCase().contains(lowerKeyword)) || + movie.directors.any((d) => d.toLowerCase().contains(lowerKeyword)) || + movie.writers.any((w) => w.toLowerCase().contains(lowerKeyword)) || + movie.actors.any((a) => a.toLowerCase().contains(lowerKeyword))) { results.add(_SearchResult(type: 'movie', data: movie)); } } @@ -81,13 +85,61 @@ class _SearchPageState extends State { } if (_showNotes) { for (final note in provider.notes.where((n) => !n.isDeleted)) { - if (note.content.toLowerCase().contains(lowerKeyword) || + if (note.title.toLowerCase().contains(lowerKeyword) || + note.content.toLowerCase().contains(lowerKeyword) || note.tags.any((t) => t.toLowerCase().contains(lowerKeyword))) { results.add(_SearchResult(type: 'note', data: note)); } } } - setState(() { _results = results; _hasSearched = true; }); + setState(() { + _results = results; + _hasSearched = true; + // 收集匹配的标签 + _matchingTags = _collectMatchingTags(lowerKeyword); + _selectedTag = null; + }); + } + + /// 收集所有包含关键词的标签 + List _collectMatchingTags(String lowerKeyword) { + final provider = context.read(); + final tagSet = {}; + for (final m in provider.movies.where((m) => !m.isDeleted)) { + for (final g in m.genres) { + if (g.toLowerCase().contains(lowerKeyword)) tagSet.add(g); + } + } + for (final b in provider.books.where((b) => !b.isDeleted)) { + for (final g in b.genres) { + if (g.toLowerCase().contains(lowerKeyword)) tagSet.add(g); + } + } + for (final n in provider.notes.where((n) => !n.isDeleted)) { + for (final t in n.tags) { + if (t.toLowerCase().contains(lowerKeyword)) tagSet.add(t); + } + } + return tagSet.toList()..sort(); + } + + /// 按标签筛选:点击标签后只显示包含该标签的结果 + void _filterByTag(String tag) { + final provider = context.read(); + setState(() { + _selectedTag = tag; + final results = <_SearchResult>[]; + for (final m in provider.movies.where((m) => !m.isDeleted)) { + if (m.genres.contains(tag)) results.add(_SearchResult(type: 'movie', data: m)); + } + for (final b in provider.books.where((b) => !b.isDeleted)) { + if (b.genres.contains(tag)) results.add(_SearchResult(type: 'book', data: b)); + } + for (final n in provider.notes.where((n) => !n.isDeleted)) { + if (n.tags.contains(tag)) results.add(_SearchResult(type: 'note', data: n)); + } + _results = results; + }); } // ═══════════════════════════════════════════════════════════════════ @@ -107,7 +159,7 @@ class _SearchPageState extends State { _buildFilterRow(), Expanded( child: _hasSearched - ? _results.isEmpty ? _buildEmptyState() : _buildResultList() + ? _results.isEmpty && _matchingTags.isEmpty ? _buildEmptyState() : _buildResultList() : _buildInitialState(), ), ]), @@ -155,9 +207,9 @@ class _SearchPageState extends State { int movieCount = 0, bookCount = 0, noteCount = 0; if (keyword.isNotEmpty) { final kw = keyword.toLowerCase(); - movieCount = provider.movies.where((m) => !m.isDeleted && (m.title.toLowerCase().contains(kw) || m.alternateTitles.any((t) => t.toLowerCase().contains(kw)) || (m.summary?.toLowerCase().contains(kw) ?? false) || m.genres.any((g) => g.toLowerCase().contains(kw)))).length; + movieCount = provider.movies.where((m) => !m.isDeleted && (m.title.toLowerCase().contains(kw) || m.alternateTitles.any((t) => t.toLowerCase().contains(kw)) || (m.summary?.toLowerCase().contains(kw) ?? false) || m.genres.any((g) => g.toLowerCase().contains(kw)) || m.directors.any((d) => d.toLowerCase().contains(kw)) || m.writers.any((w) => w.toLowerCase().contains(kw)) || m.actors.any((a) => a.toLowerCase().contains(kw)))).length; bookCount = provider.books.where((b) => !b.isDeleted && (b.title.toLowerCase().contains(kw) || b.alternateTitles.any((t) => t.toLowerCase().contains(kw)) || (b.summary?.toLowerCase().contains(kw) ?? false) || b.authors.any((a) => a.toLowerCase().contains(kw)))).length; - noteCount = provider.notes.where((n) => !n.isDeleted && (n.content.toLowerCase().contains(kw) || n.tags.any((t) => t.toLowerCase().contains(kw)))).length; + noteCount = provider.notes.where((n) => !n.isDeleted && (n.title.toLowerCase().contains(kw) || n.content.toLowerCase().contains(kw) || n.tags.any((t) => t.toLowerCase().contains(kw)))).length; } return Padding( @@ -206,7 +258,7 @@ class _SearchPageState extends State { const SizedBox(height: 20), Text('输入关键词搜索', style: TextStyle(fontSize: 15, color: colors.onSurface.withValues(alpha: 0.35))), const SizedBox(height: 4), - Text('支持标题、作者、标签、类型', style: TextStyle(fontSize: 12, color: colors.onSurface.withValues(alpha: 0.2))), + Text('支持标题、导演、作者、标签、简介', style: TextStyle(fontSize: 12, color: colors.onSurface.withValues(alpha: 0.2))), ]), ); } @@ -231,30 +283,85 @@ class _SearchPageState extends State { Widget _buildResultList() { final colors = Theme.of(context).colorScheme; return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + // 标签筛选区 + if (_matchingTags.isNotEmpty) _buildTagSection(colors), Padding( padding: const EdgeInsets.fromLTRB(20, 4, 20, 8), - child: Text('找到 ${_results.length} 条结果', + child: Text(_selectedTag != null + ? '标签 "$_selectedTag" 共 ${_results.length} 条' + : '找到 ${_results.length} 条结果', style: TextStyle(fontSize: 13, color: colors.onSurface.withValues(alpha: 0.35))), ), Expanded( - child: ListView.builder( - padding: const EdgeInsets.fromLTRB(16, 0, 16, 24), - keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag, - itemCount: _results.length, - itemBuilder: (context, index) { - final item = _results[index]; - switch (item.type) { - case 'movie': return _buildMovieItem(item.data as Movie); - case 'book': return _buildBookItem(item.data as Book); - case 'note': return _buildNoteItem(item.data as Note); - default: return const SizedBox.shrink(); - } - }, - ), + child: _results.isEmpty + ? _buildEmptyState() + : ListView.builder( + padding: const EdgeInsets.fromLTRB(16, 0, 16, 24), + keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag, + itemCount: _results.length, + itemBuilder: (context, index) { + final item = _results[index]; + switch (item.type) { + case 'movie': return _buildMovieItem(item.data as Movie); + case 'book': return _buildBookItem(item.data as Book); + case 'note': return _buildNoteItem(item.data as Note); + default: return const SizedBox.shrink(); + } + }, + ), ), ]); } + Widget _buildTagSection(ColorScheme colors) { + return Container( + width: double.infinity, + padding: const EdgeInsets.fromLTRB(16, 4, 16, 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row(children: [ + Icon(Icons.label_outline, size: 14, color: colors.onSurface.withValues(alpha: 0.35)), + const SizedBox(width: 4), + Text('匹配标签', style: TextStyle(fontSize: 12, color: colors.onSurface.withValues(alpha: 0.35))), + if (_selectedTag != null) ...[ + const Spacer(), + GestureDetector( + onTap: () { setState(() { _selectedTag = null; }); _performSearch(); }, + child: Text('清除筛选', style: TextStyle(fontSize: 12, color: colors.primary)), + ), + ], + ]), + const SizedBox(height: 6), + Wrap( + spacing: 8, + runSpacing: 6, + children: _matchingTags.map((tag) { + final isSelected = _selectedTag == tag; + return GestureDetector( + onTap: () => _filterByTag(tag), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + color: isSelected ? colors.primary : colors.surfaceContainerHighest, + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: isSelected ? colors.primary : colors.outline.withValues(alpha: 0.15), + ), + ), + child: Text(tag, style: TextStyle( + fontSize: 12, + color: isSelected ? colors.onPrimary : colors.onSurface.withValues(alpha: 0.6), + )), + ), + ); + }).toList(), + ), + ], + ), + ); + } + Widget _buildMovieItem(Movie movie) { final colors = Theme.of(context).colorScheme; return GestureDetector( diff --git a/lib/utils/database_helper.dart b/lib/utils/database_helper.dart index b33c831..d8dbbe8 100644 --- a/lib/utils/database_helper.dart +++ b/lib/utils/database_helper.dart @@ -1,7 +1,7 @@ import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; +import 'package:flutter/foundation.dart'; import 'dart:io'; -import 'dart:typed_data'; import '../models/data_models.dart'; /// 数据库帮助类 - 管理数据库的创建和版本控制 @@ -341,11 +341,11 @@ class DatabaseHelper { 'updated_at': row['updated_at']?.toString() ?? now, }); } catch (e) { - // 忽略迁移失败的记录 + debugPrint('[DB] 迁移笔记记录失败: $e'); } } } - + /// 升级books表到V3 Future _upgradeBooksTableV3(Database db) async { // 备份旧数据 @@ -393,7 +393,7 @@ class DatabaseHelper { 'is_deleted': 0, }); } catch (e) { - // 忽略迁移失败的记录 + debugPrint('[DB] 迁移书籍记录失败: $e'); } } } @@ -448,7 +448,7 @@ class DatabaseHelper { 'is_deleted': row['is_deleted'] ?? 0, }); } catch (e) { - // 忽略迁移失败的记录 + debugPrint('[DB] 迁移影视记录失败: $e'); } } } diff --git a/lib/utils/sync/server_data_service.dart b/lib/utils/sync/server_data_service.dart index 6ebd740..a59d041 100644 --- a/lib/utils/sync/server_data_service.dart +++ b/lib/utils/sync/server_data_service.dart @@ -361,8 +361,9 @@ class ServerDataService { final size = exists ? await file.length() : 0; debugPrint('[Sync] 图片: $relPath (存在=$exists 大小=$size)'); if (exists) { - request.files.add(await http.MultipartFile( - 'images', file.readAsBytes().asStream(), size, + final bytes = await file.readAsBytes(); + request.files.add(http.MultipartFile.fromBytes( + 'images', bytes, filename: relPath, )); } diff --git a/lib/utils/sync/server_sync_service.dart b/lib/utils/sync/server_sync_service.dart index da831b4..621d224 100644 --- a/lib/utils/sync/server_sync_service.dart +++ b/lib/utils/sync/server_sync_service.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; -import 'dart:typed_data'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; import 'package:path_provider/path_provider.dart'; @@ -312,18 +311,22 @@ class ServerSyncService { final deviceId = _prefs.deviceId; final appDir = (await getApplicationDocumentsDirectory()).path; - // 上传数据库 + // 上传数据库(先关闭连接再读取,避免文件被占用) + await DatabaseHelper.instance.close(); final dbPath = await DatabaseHelper.instance.databasePath; final request = http.MultipartRequest('POST', Uri.parse('$url/api/sync/upload')); request.fields['code'] = code; request.fields['device_id'] = deviceId; if (dbPath != null && File(dbPath).existsSync()) { - request.files.add(await http.MultipartFile( - 'database', File(dbPath).readAsBytes().asStream(), await File(dbPath).length(), + final dbBytes = await File(dbPath).readAsBytes(); + request.files.add(http.MultipartFile.fromBytes( + 'database', dbBytes, filename: 'mooknote.db', )); - debugPrint('[Sync] 上传数据库: ${await File(dbPath).length()} bytes'); + debugPrint('[Sync] 上传数据库: ${dbBytes.length} bytes'); } + // 重新打开数据库 + await DatabaseHelper.instance.reopen(); // 收集并上传所有图片 final imagePaths = _collectAllImageFiles(appDir); @@ -331,8 +334,9 @@ class ServerSyncService { for (final path in imagePaths) { final relPath = p.relative(path, from: appDir).replaceAll('\\', '/'); if (await File(path).exists()) { - request.files.add(await http.MultipartFile( - 'images', File(path).readAsBytes().asStream(), await File(path).length(), + final bytes = await File(path).readAsBytes(); + request.files.add(http.MultipartFile.fromBytes( + 'images', bytes, filename: relPath, )); } diff --git a/lib/widgets/custom_drawer.dart b/lib/widgets/custom_drawer.dart index c339f3e..72070e1 100644 --- a/lib/widgets/custom_drawer.dart +++ b/lib/widgets/custom_drawer.dart @@ -8,6 +8,10 @@ import '../pages/stroll_page.dart'; import '../pages/markdown_reader/md_reader_tab_page.dart'; import '../pages/tag_management_page.dart'; import '../pages/profile_page.dart'; +import '../pages/movies/movie_detail_page.dart'; +import '../pages/book/book_detail_page.dart'; +import '../pages/note/note_detail_page.dart'; +import '../models/data_models.dart'; import 'fade_in_local_image.dart'; /// 自定义侧边栏 @@ -368,22 +372,26 @@ class _CustomDrawerState extends State { ], ), const SizedBox(height: 14), - ...recent.take(4).map((item) => Padding( - padding: const EdgeInsets.only(bottom: 10), - child: Row( - children: [ - Icon( - item.type == 'movie' ? Icons.movie_outlined : item.type == 'book' ? Icons.menu_book_outlined : Icons.note_outlined, - size: 14, color: colors.onSurface.withValues(alpha: 0.3), - ), - const SizedBox(width: 10), - Expanded( - child: Text(item.title, maxLines: 1, overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 13, color: colors.onSurface.withValues(alpha: 0.75))), - ), - const SizedBox(width: 8), - Text(_recentTimeAgo(item.date), style: TextStyle(fontSize: 10, color: colors.onSurface.withValues(alpha: 0.25))), - ], + ...recent.take(4).map((item) => InkWell( + onTap: () => _openRecentItem(context, item), + borderRadius: BorderRadius.circular(8), + child: Padding( + padding: const EdgeInsets.only(bottom: 10, top: 2), + child: Row( + children: [ + Icon( + item.type == 'movie' ? Icons.movie_outlined : item.type == 'book' ? Icons.menu_book_outlined : Icons.note_outlined, + size: 14, color: colors.onSurface.withValues(alpha: 0.3), + ), + const SizedBox(width: 10), + Expanded( + child: Text(item.title, maxLines: 1, overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 13, color: colors.onSurface.withValues(alpha: 0.75))), + ), + const SizedBox(width: 8), + Text(_recentTimeAgo(item.date), style: TextStyle(fontSize: 10, color: colors.onSurface.withValues(alpha: 0.25))), + ], + ), ), )), ], @@ -396,18 +404,30 @@ class _CustomDrawerState extends State { List<_RecentItem> _getRecentItems(AppProvider provider) { final items = <_RecentItem>[]; for (final m in provider.movies.where((m) => !m.isDeleted)) { - items.add(_RecentItem(type: 'movie', title: m.title, date: m.createdAt)); + items.add(_RecentItem(type: 'movie', title: m.title, date: m.createdAt, data: m)); } for (final b in provider.books.where((b) => !b.isDeleted)) { - items.add(_RecentItem(type: 'book', title: b.title, date: b.createdAt)); + items.add(_RecentItem(type: 'book', title: b.title, date: b.createdAt, data: b)); } for (final n in provider.notes.where((n) => !n.isDeleted)) { - items.add(_RecentItem(type: 'note', title: n.title.isNotEmpty ? n.title : '随手记', date: n.createdAt)); + items.add(_RecentItem(type: 'note', title: n.title.isNotEmpty ? n.title : '随手记', date: n.createdAt, data: n)); } items.sort((a, b) => b.date.compareTo(a.date)); return items; } + void _openRecentItem(BuildContext context, _RecentItem item) { + Navigator.pop(context); + switch (item.type) { + case 'movie': + Navigator.push(context, MaterialPageRoute(builder: (_) => MovieDetailPage(movie: item.data as Movie))); + case 'book': + Navigator.push(context, MaterialPageRoute(builder: (_) => BookDetailPage(book: item.data as Book))); + case 'note': + Navigator.push(context, MaterialPageRoute(builder: (_) => NoteDetailPage(note: item.data as Note))); + } + } + String _recentTimeAgo(DateTime date) { final diff = DateTime.now().difference(date); if (diff.inDays >= 365) return '${(diff.inDays / 365).floor()}年前'; @@ -422,5 +442,6 @@ class _RecentItem { final String type; final String title; final DateTime date; - _RecentItem({required this.type, required this.title, required this.date}); + final dynamic data; + _RecentItem({required this.type, required this.title, required this.date, required this.data}); } diff --git a/pubspec.lock b/pubspec.lock index b9205fd..8641285 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: archive sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.6.1" args: @@ -14,7 +14,7 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.7.0" async: @@ -22,7 +22,7 @@ packages: description: name: async sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.13.1" boolean_selector: @@ -30,7 +30,7 @@ packages: description: name: boolean_selector sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.2" characters: @@ -38,7 +38,7 @@ packages: description: name: characters sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.1" checked_yaml: @@ -46,7 +46,7 @@ packages: description: name: checked_yaml sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.4" cli_util: @@ -54,7 +54,7 @@ packages: description: name: cli_util sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.4.2" clock: @@ -62,7 +62,7 @@ packages: description: name: clock sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.2" code_assets: @@ -70,7 +70,7 @@ packages: description: name: code_assets sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.1" collection: @@ -78,7 +78,7 @@ packages: description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.19.1" cross_file: @@ -86,7 +86,7 @@ packages: description: name: cross_file sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.3.5+2" crypto: @@ -94,7 +94,7 @@ packages: description: name: crypto sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.7" cupertino_icons: @@ -102,7 +102,7 @@ packages: description: name: cupertino_icons sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.9" equatable: @@ -110,7 +110,7 @@ packages: description: name: equatable sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.8" extended_text_field: @@ -118,7 +118,7 @@ packages: description: name: extended_text_field sha256: "3996195c117c6beb734026a7bc0ba80d7e4e84e4edd4728caa544d8209ab4d7d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "16.0.2" extended_text_library: @@ -126,7 +126,7 @@ packages: description: name: extended_text_library sha256: "13d99f8a10ead472d5e2cf4770d3d047203fe5054b152e9eb5dc692a71befbba" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "12.0.1" fake_async: @@ -134,7 +134,7 @@ packages: description: name: fake_async sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.3" ffi: @@ -142,7 +142,7 @@ packages: description: name: ffi sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" file: @@ -150,7 +150,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.0.1" file_picker: @@ -158,7 +158,7 @@ packages: description: name: file_picker sha256: ab13ae8ef5580a411c458d6207b6774a6c237d77ac37011b13994879f68a8810 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "8.3.7" file_selector_linux: @@ -166,7 +166,7 @@ packages: description: name: file_selector_linux sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.4" file_selector_macos: @@ -174,7 +174,7 @@ packages: description: name: file_selector_macos sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.5" file_selector_platform_interface: @@ -182,7 +182,7 @@ packages: description: name: file_selector_platform_interface sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.7.0" file_selector_windows: @@ -190,7 +190,7 @@ packages: description: name: file_selector_windows sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.3+5" fixnum: @@ -198,7 +198,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" fl_chart: @@ -206,7 +206,7 @@ packages: description: name: fl_chart sha256: "74959b99b92b9eebeed1a4049426fd67c4abc3c5a0f4d12e2877097d6a11ae08" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.69.2" flutter: @@ -219,7 +219,7 @@ packages: description: name: flutter_launcher_icons sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.13.1" flutter_lints: @@ -227,7 +227,7 @@ packages: description: name: flutter_lints sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.0" flutter_localizations: @@ -240,7 +240,7 @@ packages: description: name: flutter_markdown_plus sha256: "039177906850278e8fb1cd364115ee0a46281135932fa8ecea8455522166d2de" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.7" flutter_plugin_android_lifecycle: @@ -248,7 +248,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.35" flutter_staggered_grid_view: @@ -256,7 +256,7 @@ packages: description: name: flutter_staggered_grid_view sha256: "19e7abb550c96fbfeb546b23f3ff356ee7c59a019a651f8f102a4ba9b7349395" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.7.0" flutter_test: @@ -274,7 +274,7 @@ packages: description: name: hooks sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.2" http: @@ -282,7 +282,7 @@ packages: description: name: http sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.6.0" http_parser: @@ -290,7 +290,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.1.2" image: @@ -298,7 +298,7 @@ packages: description: name: image sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.3.0" image_picker: @@ -306,7 +306,7 @@ packages: description: name: image_picker sha256: "91c025426c2881c551100bce834e201c835a170151545f58d17da5180ca7d9ac" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.2" image_picker_android: @@ -314,7 +314,7 @@ packages: description: name: image_picker_android sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.8.13+17" image_picker_for_web: @@ -322,7 +322,7 @@ packages: description: name: image_picker_for_web sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.1" image_picker_ios: @@ -330,7 +330,7 @@ packages: description: name: image_picker_ios sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.8.13+6" image_picker_linux: @@ -338,7 +338,7 @@ packages: description: name: image_picker_linux sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.2" image_picker_macos: @@ -346,7 +346,7 @@ packages: description: name: image_picker_macos sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.2+1" image_picker_platform_interface: @@ -354,7 +354,7 @@ packages: description: name: image_picker_platform_interface sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.11.1" image_picker_windows: @@ -362,7 +362,7 @@ packages: description: name: image_picker_windows sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.2" intl: @@ -370,7 +370,7 @@ packages: description: name: intl sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.20.2" jni: @@ -378,7 +378,7 @@ packages: description: name: jni sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.0" jni_flutter: @@ -386,7 +386,7 @@ packages: description: name: jni_flutter sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.1" json_annotation: @@ -394,7 +394,7 @@ packages: description: name: json_annotation sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.12.0" leak_tracker: @@ -402,7 +402,7 @@ packages: description: name: leak_tracker sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "11.0.2" leak_tracker_flutter_testing: @@ -410,7 +410,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.10" leak_tracker_testing: @@ -418,7 +418,7 @@ packages: description: name: leak_tracker_testing sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.2" lints: @@ -426,7 +426,7 @@ packages: description: name: lints sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.0" logging: @@ -434,7 +434,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.0" markdown: @@ -442,7 +442,7 @@ packages: description: name: markdown sha256: ee85086ad7698b42522c6ad42fe195f1b9898e4d974a1af4576c1a3a176cada9 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.3.1" matcher: @@ -450,7 +450,7 @@ packages: description: name: matcher sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.12.19" material_color_utilities: @@ -458,7 +458,7 @@ packages: description: name: material_color_utilities sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.13.0" meta: @@ -466,7 +466,7 @@ packages: description: name: meta sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.17.0" mime: @@ -474,7 +474,7 @@ packages: description: name: mime sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.0" nested: @@ -482,7 +482,7 @@ packages: description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.0" objective_c: @@ -490,7 +490,7 @@ packages: description: name: objective_c sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "9.4.1" package_config: @@ -498,7 +498,7 @@ packages: description: name: package_config sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" package_info_plus: @@ -506,7 +506,7 @@ packages: description: name: package_info_plus sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "8.3.1" package_info_plus_platform_interface: @@ -514,7 +514,7 @@ packages: description: name: package_info_plus_platform_interface sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.2.1" path: @@ -522,7 +522,7 @@ packages: description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.9.1" path_provider: @@ -530,7 +530,7 @@ packages: description: name: path_provider sha256: a7f4874f987173da295a61c181b8ee71dab59b332a486b391babf26a1b884825 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.6" path_provider_android: @@ -538,7 +538,7 @@ packages: description: name: path_provider_android sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.1" path_provider_foundation: @@ -546,7 +546,7 @@ packages: description: name: path_provider_foundation sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.6.0" path_provider_linux: @@ -554,7 +554,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -562,7 +562,7 @@ packages: description: name: path_provider_platform_interface sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.3" path_provider_windows: @@ -570,7 +570,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.0" permission_handler: @@ -578,7 +578,7 @@ packages: description: name: permission_handler sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "11.4.0" permission_handler_android: @@ -586,7 +586,7 @@ packages: description: name: permission_handler_android sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "12.1.0" permission_handler_apple: @@ -594,7 +594,7 @@ packages: description: name: permission_handler_apple sha256: "79dfa1df734798aa3cfdad166d3a3698c206d8813de13516ea1071b5d7e2f420" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "9.4.10" permission_handler_html: @@ -602,7 +602,7 @@ packages: description: name: permission_handler_html sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.1.3+5" permission_handler_platform_interface: @@ -610,7 +610,7 @@ packages: description: name: permission_handler_platform_interface sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.3.0" permission_handler_windows: @@ -618,7 +618,7 @@ packages: description: name: permission_handler_windows sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.1" petitparser: @@ -626,7 +626,7 @@ packages: description: name: petitparser sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.0.2" platform: @@ -634,7 +634,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.6" plugin_platform_interface: @@ -642,7 +642,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.8" provider: @@ -650,7 +650,7 @@ packages: description: name: provider sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.1.5+1" pub_semver: @@ -658,7 +658,7 @@ packages: description: name: pub_semver sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" record_use: @@ -666,7 +666,7 @@ packages: description: name: record_use sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.6.0" share_plus: @@ -674,7 +674,7 @@ packages: description: name: share_plus sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "10.1.4" share_plus_platform_interface: @@ -682,7 +682,7 @@ packages: description: name: share_plus_platform_interface sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.0.2" shared_preferences: @@ -690,7 +690,7 @@ packages: description: name: shared_preferences sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.5.5" shared_preferences_android: @@ -698,7 +698,7 @@ packages: description: name: shared_preferences_android sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.23" shared_preferences_foundation: @@ -706,7 +706,7 @@ packages: description: name: shared_preferences_foundation sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.5.6" shared_preferences_linux: @@ -714,7 +714,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" shared_preferences_platform_interface: @@ -722,7 +722,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.2" shared_preferences_web: @@ -730,7 +730,7 @@ packages: description: name: shared_preferences_web sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.3" shared_preferences_windows: @@ -738,7 +738,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" sky_engine: @@ -751,7 +751,7 @@ packages: description: name: source_span sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.10.2" sqflite: @@ -759,7 +759,7 @@ packages: description: name: sqflite sha256: "564cfed0746fe53140c23b70b308e045c3b31f17778f2f326ccb7d804ea0250a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.2+1" sqflite_android: @@ -767,7 +767,7 @@ packages: description: name: sqflite_android sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.2+3" sqflite_common: @@ -775,7 +775,7 @@ packages: description: name: sqflite_common sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.5.8" sqflite_darwin: @@ -783,7 +783,7 @@ packages: description: name: sqflite_darwin sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.2" sqflite_platform_interface: @@ -791,7 +791,7 @@ packages: description: name: sqflite_platform_interface sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.0" stack_trace: @@ -799,7 +799,7 @@ packages: description: name: stack_trace sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.12.1" stream_channel: @@ -807,7 +807,7 @@ packages: description: name: stream_channel sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.4" string_scanner: @@ -815,7 +815,7 @@ packages: description: name: string_scanner sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.1" synchronized: @@ -823,7 +823,7 @@ packages: description: name: synchronized sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.4.0+1" term_glyph: @@ -831,7 +831,7 @@ packages: description: name: term_glyph sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.2" test_api: @@ -839,7 +839,7 @@ packages: description: name: test_api sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.7.10" typed_data: @@ -847,7 +847,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" url_launcher: @@ -855,7 +855,7 @@ packages: description: name: url_launcher sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.3.2" url_launcher_android: @@ -863,7 +863,7 @@ packages: description: name: url_launcher_android sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.3.30" url_launcher_ios: @@ -871,7 +871,7 @@ packages: description: name: url_launcher_ios sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.4.1" url_launcher_linux: @@ -879,7 +879,7 @@ packages: description: name: url_launcher_linux sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.2.2" url_launcher_macos: @@ -887,7 +887,7 @@ packages: description: name: url_launcher_macos sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.2.5" url_launcher_platform_interface: @@ -895,7 +895,7 @@ packages: description: name: url_launcher_platform_interface sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.2" url_launcher_web: @@ -903,7 +903,7 @@ packages: description: name: url_launcher_web sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.3" url_launcher_windows: @@ -911,15 +911,15 @@ packages: description: name: url_launcher_windows sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.5" uuid: - dependency: transitive + dependency: "direct main" description: name: uuid sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.5.3" vector_math: @@ -927,7 +927,7 @@ packages: description: name: vector_math sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" vm_service: @@ -935,7 +935,7 @@ packages: description: name: vm_service sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "15.2.0" web: @@ -943,7 +943,7 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" webview_flutter: @@ -951,7 +951,7 @@ packages: description: name: webview_flutter sha256: e4d3474277c5043f5f3100ed27d94ad693abfd5c602b0221c719a4497e4ba1e4 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.14.0" webview_flutter_android: @@ -959,7 +959,7 @@ packages: description: name: webview_flutter_android sha256: ad5182eff9a550925330cb9f0cb038eddfdd5712aba8b77aa0f0400e50f6e688 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.12.0" webview_flutter_platform_interface: @@ -967,7 +967,7 @@ packages: description: name: webview_flutter_platform_interface sha256: "1221c1b12f5278791042f2ec2841743784cf25c5a644e23d6680e5d718824f04" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.15.1" webview_flutter_wkwebview: @@ -975,7 +975,7 @@ packages: description: name: webview_flutter_wkwebview sha256: "82648217f537573e1ca9ae9952d3eacedca6ab5aee69dc84445fc763766dcea2" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.25.1" win32: @@ -983,7 +983,7 @@ packages: description: name: win32 sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.15.0" xdg_directories: @@ -991,7 +991,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.0" xml: @@ -999,7 +999,7 @@ packages: description: name: xml sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.6.1" yaml: @@ -1007,7 +1007,7 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.3" sdks: diff --git a/pubspec.yaml b/pubspec.yaml index 1f79a1e..0be5406 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,6 +31,7 @@ dependencies: webview_flutter: ^4.8.0 package_info_plus: ^8.0.0 extended_text_field: ^16.0.2 + uuid: ^4.5.0 dev_dependencies: flutter_test: