From 67b77f14e0da6038cfc8ddde1d3bc41bf516f0b1 Mon Sep 17 00:00:00 2001 From: DelLevin-Home Date: Fri, 19 Jun 2026 00:28:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BD=B1=E8=A7=86=E5=88=86?= =?UTF-8?q?=E4=BA=AB=E7=9A=84=E5=87=A0=E7=A7=8D=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/images/ticket/maoyan.png | Bin 0 -> 49094 bytes assets/images/ticket/qr.png | Bin 0 -> 5978 bytes lib/pages/movies/movie_share_page.dart | 895 ++++++++++++++++++------- lib/widgets/book_status_bar.dart | 133 ++-- lib/widgets/movie_status_bar.dart | 133 ++-- pubspec.lock | 246 +++---- pubspec.yaml | 1 + 参考/票根html/maoyan.png | Bin 0 -> 49094 bytes 参考/票根html/mookiletter.png | Bin 0 -> 5978 bytes 参考/票根html/票根.html | 395 +++++++++++ 参考/票根html/票根收藏版.html | 444 ++++++++++++ 参考/票根html/票根样式三.html | 386 +++++++++++ 12 files changed, 2076 insertions(+), 557 deletions(-) create mode 100644 assets/images/ticket/maoyan.png create mode 100644 assets/images/ticket/qr.png create mode 100644 参考/票根html/maoyan.png create mode 100644 参考/票根html/mookiletter.png create mode 100644 参考/票根html/票根.html create mode 100644 参考/票根html/票根收藏版.html create mode 100644 参考/票根html/票根样式三.html diff --git a/assets/images/ticket/maoyan.png b/assets/images/ticket/maoyan.png new file mode 100644 index 0000000000000000000000000000000000000000..a0585d834f4293fb761d34ca10edac2ca7ece9fd GIT binary patch literal 49094 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 UKBoqw-2eap07*qoM6N<$f_ih!pa1{> literal 0 HcmV?d00001 diff --git a/assets/images/ticket/qr.png b/assets/images/ticket/qr.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab0463a03b8be36216d1637e6844d900ba37794 GIT binary patch literal 5978 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 E10HW>(EtDd literal 0 HcmV?d00001 diff --git a/lib/pages/movies/movie_share_page.dart b/lib/pages/movies/movie_share_page.dart index 88533e5..24e9af7 100644 --- a/lib/pages/movies/movie_share_page.dart +++ b/lib/pages/movies/movie_share_page.dart @@ -1,5 +1,4 @@ import 'dart:io'; -import 'dart:typed_data'; import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; @@ -9,10 +8,8 @@ import '../../models/data_models.dart'; import '../../utils/toast_util.dart'; import '../../widgets/fade_in_local_image.dart'; -/// 影视分享海报页面 class MovieSharePage extends StatefulWidget { final Movie movie; - const MovieSharePage({super.key, required this.movie}); @override @@ -22,6 +19,72 @@ class MovieSharePage extends StatefulWidget { class _MovieSharePageState extends State { final GlobalKey _posterKey = GlobalKey(); bool _isGenerating = false; + int _currentStyle = 0; + + static const _styleNames = ['海报', '经典票根', '喵眼电影票根', '收藏版票根']; + + // 影院信息(可编辑) + late TextEditingController _cinemaCtrl; + late TextEditingController _hallCtrl; + late TextEditingController _seatRowCtrl; + late TextEditingController _seatNumCtrl; + late TextEditingController _screeningDateCtrl; + late TextEditingController _screeningTimeCtrl; + late TextEditingController _priceCtrl; + late TextEditingController _serviceFeeCtrl; + late TextEditingController _issueTimeCtrl; + late TextEditingController _platformCtrl; + late TextEditingController _ticketCodeCtrl; + + @override + void initState() { + super.initState(); + final now = DateTime.now(); + final dateStr = '${now.year}年${now.month}月${now.day}日'; + final timeStr = '${now.hour.toString().padLeft(2, '0')}:${now.minute.toString().padLeft(2, '0')}'; + final issueStr = '${now.year}-${now.month.toString().padLeft(2, '0')}-${now.day.toString().padLeft(2, '0')}'; + final codeStr = 'MK${now.millisecondsSinceEpoch.toString().substring(1)}'; + + _cinemaCtrl = TextEditingController(text: '万达影城'); + _hallCtrl = TextEditingController(text: '3号厅'); + _seatRowCtrl = TextEditingController(text: '8'); + _seatNumCtrl = TextEditingController(text: '12'); + _screeningDateCtrl = TextEditingController(text: dateStr); + _screeningTimeCtrl = TextEditingController(text: timeStr); + _priceCtrl = TextEditingController(text: '39.90'); + _serviceFeeCtrl = TextEditingController(text: '5.00'); + _issueTimeCtrl = TextEditingController(text: issueStr); + _platformCtrl = TextEditingController(text: '喵眼电影'); + _ticketCodeCtrl = TextEditingController(text: codeStr); + } + + @override + void dispose() { + _cinemaCtrl.dispose(); + _hallCtrl.dispose(); + _seatRowCtrl.dispose(); + _seatNumCtrl.dispose(); + _screeningDateCtrl.dispose(); + _screeningTimeCtrl.dispose(); + _priceCtrl.dispose(); + _serviceFeeCtrl.dispose(); + _issueTimeCtrl.dispose(); + _platformCtrl.dispose(); + _ticketCodeCtrl.dispose(); + super.dispose(); + } + + bool get _isCinemaStyle => _currentStyle >= 2; + + Widget _buildBody() { + switch (_currentStyle) { + case 0: return _buildPosterWidget(); + case 1: return _buildTicketClassic(); + case 2: return _buildTicketCinema(); + case 3: return _buildTicketCollectible(); + default: return _buildPosterWidget(); + } + } @override Widget build(BuildContext context) { @@ -31,53 +94,232 @@ class _MovieSharePageState extends State { appBar: AppBar( backgroundColor: colors.surface, elevation: 0, - leading: IconButton( - icon: Icon(Icons.close, color: colors.onSurface), - onPressed: () => Navigator.pop(context), - ), - title: Text( - '分享海报', - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w600, - color: colors.onSurface, - ), - ), + leading: IconButton(icon: Icon(Icons.close, color: colors.onSurface), onPressed: () => Navigator.pop(context)), + title: Text('分享海报', style: TextStyle(fontSize: 18, fontWeight: FontWeight.w600, color: colors.onSurface)), centerTitle: true, actions: [ + IconButton(icon: Icon(Icons.palette_outlined, color: colors.onSurface, size: 22), tooltip: '选择样式', onPressed: _showStylePicker), TextButton( onPressed: _isGenerating ? null : _generateAndShare, child: _isGenerating - ? const SizedBox( - width: 20, - height: 20, - child: CircularProgressIndicator(strokeWidth: 2), - ) - : Text( - '分享', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - color: colors.onSurface, - ), - ), + ? const SizedBox(width: 20, height: 20, child: CircularProgressIndicator(strokeWidth: 2)) + : Text('分享', style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: colors.onSurface)), ), - const SizedBox(width: 8), + const SizedBox(width: 4), ], ), - body: Center( - child: SingleChildScrollView( - padding: const EdgeInsets.all(24), - child: RepaintBoundary( - key: _posterKey, - child: _buildPosterWidget(), + body: Column(children: [ + // 预览 + Expanded(child: Center( + child: SingleChildScrollView( + padding: const EdgeInsets.all(24), + child: RepaintBoundary(key: _posterKey, child: _buildBody()), + ), + )), + // 底部编辑按钮(仅票根样式) + if (_isCinemaStyle) _buildBottomEditBar(colors), + ]), + ); + } + + // ─── 样式选择 ─── + + void _showStylePicker() { + final colors = Theme.of(context).colorScheme; + showModalBottomSheet( + context: context, + backgroundColor: colors.surface, + shape: const RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(16))), + builder: (ctx) => Padding( + padding: const EdgeInsets.fromLTRB(20, 16, 20, 24), + child: Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text('选择样式', style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: colors.onSurface)), + const SizedBox(height: 16), + Wrap(spacing: 10, runSpacing: 10, children: List.generate(_styleNames.length, (i) { + final selected = _currentStyle == i; + return GestureDetector( + onTap: () { setState(() => _currentStyle = i); Navigator.pop(ctx); }, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 10), + decoration: BoxDecoration( + color: selected ? colors.primary : colors.surfaceContainerHighest, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: selected ? colors.primary : colors.outline, width: 0.5), + ), + child: Text(_styleNames[i], style: TextStyle(fontSize: 14, fontWeight: selected ? FontWeight.w600 : FontWeight.w400, + color: selected ? colors.onPrimary : colors.onSurface.withValues(alpha: 0.6))), + ), + ); + })), + ]), + ), + ); + } + + // ─── 底部编辑栏 ─── + + Widget _buildBottomEditBar(ColorScheme colors) { + return Container( + padding: EdgeInsets.only(left: 24, right: 24, bottom: MediaQuery.of(context).padding.bottom + 12, top: 8), + color: colors.surface, + child: SizedBox( + width: double.infinity, + height: 44, + child: ElevatedButton.icon( + onPressed: _showEditSheet, + icon: const Icon(Icons.edit_outlined, size: 18), + label: const Text('编辑票根信息'), + style: ElevatedButton.styleFrom( + backgroundColor: colors.primary, + foregroundColor: colors.onPrimary, + elevation: 0, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), ), ), ); } - /// 构建海报 Widget + void _showEditSheet() { + final colors = Theme.of(context).colorScheme; + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: colors.surface, + shape: const RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(16))), + builder: (ctx) => Padding( + padding: EdgeInsets.fromLTRB(20, 16, 20, MediaQuery.of(ctx).viewInsets.bottom + 20), + child: SingleChildScrollView(child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('编辑票根信息', style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: colors.onSurface)), + const SizedBox(height: 16), + _sheetField('影院名称', _cinemaCtrl), + _sheetField('影厅', _hallCtrl), + Row(children: [ + Expanded(child: _sheetField('排', _seatRowCtrl)), + const SizedBox(width: 12), + Expanded(child: _sheetField('座', _seatNumCtrl)), + ]), + Row(children: [ + Expanded(child: _sheetField('票价 (¥)', _priceCtrl)), + const SizedBox(width: 12), + Expanded(child: _sheetField('服务费 (¥)', _serviceFeeCtrl)), + ]), + _sheetDatePicker('出票日期', _issueTimeCtrl, ctx), + _sheetCodeField(), + const SizedBox(height: 16), + SizedBox( + width: double.infinity, height: 44, + child: ElevatedButton( + onPressed: () { setState(() {}); Navigator.pop(ctx); }, + style: ElevatedButton.styleFrom( + backgroundColor: colors.primary, foregroundColor: colors.onPrimary, elevation: 0, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: const Text('完成'), + ), + ), + ], + )), + ), + ); + } + + Widget _sheetField(String label, TextEditingController ctrl) { + final colors = Theme.of(context).colorScheme; + return Padding( + padding: const EdgeInsets.only(bottom: 12), + child: TextField( + controller: ctrl, + style: TextStyle(fontSize: 14, color: colors.onSurface), + decoration: InputDecoration( + labelText: label, + labelStyle: TextStyle(fontSize: 12, color: colors.onSurface.withValues(alpha: 0.5)), + isDense: true, + contentPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12), + filled: true, fillColor: colors.surfaceContainerHighest, + border: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide.none), + focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: colors.primary, width: 1)), + ), + ), + ); + } + + Widget _sheetDatePicker(String label, TextEditingController ctrl, BuildContext sheetCtx) { + final colors = Theme.of(context).colorScheme; + return Padding( + padding: const EdgeInsets.only(bottom: 12), + child: GestureDetector( + onTap: () async { + final now = DateTime.now(); + final picked = await showDatePicker( + context: sheetCtx, + initialDate: now, + firstDate: DateTime(1900), + lastDate: DateTime(now.year + 10), + locale: const Locale('zh'), + ); + if (picked != null) { + ctrl.text = '${picked.year}-${picked.month.toString().padLeft(2, '0')}-${picked.day.toString().padLeft(2, '0')}'; + } + }, + child: AbsorbPointer(child: TextField( + controller: ctrl, + style: TextStyle(fontSize: 14, color: colors.onSurface), + decoration: InputDecoration( + labelText: label, + labelStyle: TextStyle(fontSize: 12, color: colors.onSurface.withValues(alpha: 0.5)), + isDense: true, + contentPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12), + filled: true, fillColor: colors.surfaceContainerHighest, + border: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide.none), + focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: colors.primary, width: 1)), + suffixIcon: Icon(Icons.calendar_today_outlined, size: 18, color: colors.onSurface.withValues(alpha: 0.4)), + ), + )), + ), + ); + } + + Widget _sheetCodeField() { + final colors = Theme.of(context).colorScheme; + return Padding( + padding: const EdgeInsets.only(bottom: 12), + child: Row(children: [ + Expanded(child: TextField( + controller: _ticketCodeCtrl, + style: TextStyle(fontSize: 14, color: colors.onSurface, fontFamily: 'monospace'), + decoration: InputDecoration( + labelText: '编码', + labelStyle: TextStyle(fontSize: 12, color: colors.onSurface.withValues(alpha: 0.5)), + isDense: true, + contentPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12), + filled: true, fillColor: colors.surfaceContainerHighest, + border: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide.none), + focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: colors.primary, width: 1)), + ), + )), + const SizedBox(width: 8), + GestureDetector( + onTap: () { + _ticketCodeCtrl.text = 'MK${DateTime.now().millisecondsSinceEpoch.toString().substring(1)}'; + }, + child: Container( + width: 40, height: 40, + decoration: BoxDecoration(color: colors.surfaceContainerHighest, borderRadius: BorderRadius.circular(8)), + child: Icon(Icons.casino_outlined, size: 20, color: colors.onSurface.withValues(alpha: 0.6)), + ), + ), + ]), + ); + } + + // ═══════════════════════════════════════════════════════════ + // 样式 0:海报 + // ═══════════════════════════════════════════════════════════ + Widget _buildPosterWidget() { final colors = Theme.of(context).colorScheme; final movie = widget.movie; @@ -85,240 +327,389 @@ class _MovieSharePageState extends State { return Container( width: 320, - decoration: BoxDecoration( - color: colors.surface, - borderRadius: BorderRadius.circular(16), + decoration: BoxDecoration(color: colors.surface, borderRadius: BorderRadius.circular(16), + boxShadow: [BoxShadow(color: Colors.black.withValues(alpha: 0.1), blurRadius: 20, offset: const Offset(0, 10))]), + child: Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ + if (hasPoster) + ClipRRect(borderRadius: const BorderRadius.vertical(top: Radius.circular(16)), + child: FadeInLocalImage(path: movie.posterPath, width: 320, height: 200, fit: BoxFit.cover)), + Padding(padding: const EdgeInsets.all(20), child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text(movie.title, style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold, color: colors.onSurface)), + if (movie.alternateTitles.isNotEmpty) ...[ + const SizedBox(height: 8), + Text(movie.alternateTitles.join(' / '), style: TextStyle(fontSize: 14, color: colors.onSurface.withValues(alpha: 0.6))), + ], + const SizedBox(height: 16), + if (movie.rating != null && movie.rating! > 0) ...[ + Row(children: [ + const Icon(Icons.star, size: 18, color: Color(0xFFFFB800)), + const SizedBox(width: 4), + Text(movie.rating!.toStringAsFixed(1), style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xFFFFB800))), + const SizedBox(width: 4), + Text('/ 10', style: TextStyle(fontSize: 12, color: colors.onSurface.withValues(alpha: 0.4))), + ]), + const SizedBox(height: 12), + ], + if (movie.directors.isNotEmpty) _infoRow('导演', movie.directors.join(' / '), colors), + if (movie.writers.isNotEmpty) _infoRow('编剧', movie.writers.join(' / '), colors), + if (movie.actors.isNotEmpty) _infoRow('主演', movie.actors.take(3).join(' / '), colors), + if (movie.genres.isNotEmpty) _infoRow('类型', movie.genres.join(' / '), colors), + if (movie.releaseDate != null) _infoRow('上映', _fmtDate(movie.releaseDate!), colors), + if (movie.summary != null && movie.summary!.isNotEmpty) ...[ + const SizedBox(height: 16), + Text('简介', style: TextStyle(fontSize: 12, color: colors.onSurface.withValues(alpha: 0.4))), + const SizedBox(height: 8), + Text(movie.summary!, style: TextStyle(fontSize: 13, color: colors.onSurface.withValues(alpha: 0.6), height: 1.6), maxLines: 5, overflow: TextOverflow.ellipsis), + ], + const SizedBox(height: 20), + Divider(height: 1, color: colors.outline), + const SizedBox(height: 12), + Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + Icon(Icons.movie_outlined, size: 14, color: colors.onSurface.withValues(alpha: 0.5)), + const SizedBox(width: 6), + Text('来自 MookNote', style: TextStyle(fontSize: 12, color: colors.onSurface.withValues(alpha: 0.5))), + ]), + ])), + ]), + ); + } + + Widget _infoRow(String label, String value, ColorScheme colors) { + return Padding(padding: const EdgeInsets.only(bottom: 8), child: Row(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text('$label:', style: TextStyle(fontSize: 13, color: colors.onSurface.withValues(alpha: 0.4))), + Expanded(child: Text(value, style: TextStyle(fontSize: 13, color: colors.onSurface.withValues(alpha: 0.75)))), + ])); + } + + // ═══════════════════════════════════════════════════════════ + // 样式 1:经典票根 + // ═══════════════════════════════════════════════════════════ + + Widget _buildTicketClassic() { + final movie = widget.movie; + final hasPoster = movie.posterPath != null && movie.posterPath!.isNotEmpty; + const c = Color(0xFF2D2D2D); + + return Container( + width: 300, + decoration: BoxDecoration(color: const Color(0xFFFFFBF5), borderRadius: BorderRadius.circular(8), + boxShadow: [BoxShadow(color: Colors.black.withValues(alpha: 0.08), blurRadius: 16, offset: const Offset(0, 6))]), + child: Column(mainAxisSize: MainAxisSize.min, children: [ + Padding(padding: const EdgeInsets.all(16), child: Column(children: [ + if (hasPoster) ClipRRect(borderRadius: BorderRadius.circular(4), + child: FadeInLocalImage(path: movie.posterPath, width: 268, height: 160, fit: BoxFit.cover)), + const SizedBox(height: 12), + Text(movie.title, textAlign: TextAlign.center, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold, color: c, letterSpacing: 1)), + if (movie.alternateTitles.isNotEmpty) ...[ + const SizedBox(height: 4), + Text(movie.alternateTitles.join(' / '), textAlign: TextAlign.center, style: TextStyle(fontSize: 11, color: c.withValues(alpha: 0.4))), + ], + ])), + _dashedLine(c.withValues(alpha: 0.15)), + Padding(padding: const EdgeInsets.fromLTRB(20, 14, 20, 16), child: Column(children: [ + _classicRow('DIRECTED BY', movie.directors.isNotEmpty ? movie.directors.join(', ') : '--'), + const SizedBox(height: 10), + _classicRow('STARRING', movie.actors.isNotEmpty ? movie.actors.take(3).join(', ') : '--'), + const SizedBox(height: 10), + _classicRow('GENRE', movie.genres.isNotEmpty ? movie.genres.join(' / ') : '--'), + const SizedBox(height: 10), + _classicRow('RELEASE', movie.releaseDate != null ? _fmtDate(movie.releaseDate!) : '--'), + if (movie.rating != null && movie.rating! > 0) ...[ + const SizedBox(height: 10), + _classicRow('RATING', '${movie.rating!.toStringAsFixed(1)} / 10'), + ], + const SizedBox(height: 14), + Row(children: [ + Container(padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3), + decoration: BoxDecoration(border: Border.all(color: c.withValues(alpha: 0.2), width: 0.5)), + child: Text(_statusEN(movie.status), style: TextStyle(fontSize: 9, fontWeight: FontWeight.w600, letterSpacing: 2, color: c.withValues(alpha: 0.5)))), + const Spacer(), + Icon(Icons.movie_outlined, size: 12, color: c.withValues(alpha: 0.3)), + const SizedBox(width: 4), + Text('MookNote', style: TextStyle(fontSize: 9, letterSpacing: 1, color: c.withValues(alpha: 0.3))), + ]), + ])), + ]), + ); + } + + Widget _classicRow(String label, String value) { + return Row(crossAxisAlignment: CrossAxisAlignment.start, children: [ + SizedBox(width: 80, child: Text(label, style: TextStyle(fontSize: 9, fontWeight: FontWeight.w600, letterSpacing: 1.5, color: const Color(0xFF2D2D2D).withValues(alpha: 0.35)))), + Expanded(child: Text(value, style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w500, color: Color(0xFF2D2D2D), height: 1.4))), + ]); + } + + // ═══════════════════════════════════════════════════════════ + // 样式 2:电影票(参考票根.html) + // ═══════════════════════════════════════════════════════════ + + Widget _buildTicketCinema() { + final movie = widget.movie; + const bg = Color(0xFFFFFDF7); + const text = Color(0xFF1A1A1A); + const muted = Color(0xFF999999); + + return Container( + width: 340, + decoration: BoxDecoration(color: bg, borderRadius: BorderRadius.circular(12), + boxShadow: [BoxShadow(color: Colors.black.withValues(alpha: 0.12), blurRadius: 24, offset: const Offset(0, 6))]), + child: Column(mainAxisSize: MainAxisSize.min, children: [ + // Header + Padding(padding: const EdgeInsets.fromLTRB(20, 16, 20, 14), child: Row(children: [ + Image.asset('assets/images/ticket/maoyan.png', width: 36, height: 36, errorBuilder: (_, __, ___) => Icon(Icons.local_movies, size: 36, color: text)), + const SizedBox(width: 10), + Text(_platformCtrl.text.isNotEmpty ? _platformCtrl.text : 'MookNote', style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w900, color: text, letterSpacing: 0.5)), + ])), + Container(height: 0.5, color: const Color(0xFFF0EDE5)), + + // Body + Padding(padding: const EdgeInsets.fromLTRB(20, 18, 20, 14), child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + // 影院 + Text(_cinemaCtrl.text, style: const TextStyle(fontSize: 15, fontWeight: FontWeight.w600, color: text, letterSpacing: 0.5)), + const SizedBox(height: 14), + // 片名 + Text(movie.title, style: const TextStyle(fontSize: 24, fontWeight: FontWeight.w700, color: text, letterSpacing: 0.5, height: 1.3)), + const SizedBox(height: 4), + Text(_subtitleText(movie), style: const TextStyle(fontSize: 12, color: Color(0xFF666666), letterSpacing: 0.5)), + const SizedBox(height: 16), + // 场次 + Row(children: [ + Icon(Icons.desktop_windows_outlined, size: 15, color: text.withValues(alpha: 0.6)), + const SizedBox(width: 8), + Text(_hallCtrl.text, style: TextStyle(fontSize: 14, fontWeight: FontWeight.w500, color: text.withValues(alpha: 0.8))), + ]), + const SizedBox(height: 8), + Row(children: [ + Text('${_seatRowCtrl.text}排${_seatNumCtrl.text}座', style: TextStyle(fontSize: 14, fontWeight: FontWeight.w500, color: text.withValues(alpha: 0.8))), + Padding(padding: const EdgeInsets.symmetric(horizontal: 8), child: Text('|', style: TextStyle(color: const Color(0xFFD0CCC0), fontWeight: FontWeight.w300))), + Text(widget.movie.releaseDate != null ? '${widget.movie.releaseDate!.year}年${widget.movie.releaseDate!.month}月${widget.movie.releaseDate!.day}日' : '待定', style: TextStyle(fontSize: 14, color: text.withValues(alpha: 0.6))), + ]), + ])), + + // 撕票线 + _tearScissors(bg), + + // Footer + Padding(padding: const EdgeInsets.fromLTRB(20, 10, 20, 16), child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [ + Container(width: 100, height: 100, decoration: BoxDecoration(border: Border.all(color: const Color(0xFFE8E4DA), width: 0.5)), + child: Image.asset('assets/images/ticket/qr.png', fit: BoxFit.contain, + errorBuilder: (_, __, ___) => const SizedBox.shrink())), + const SizedBox(width: 16), + Expanded(child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + _ticketDetail('票价', _priceCtrl.text, isPrice: true), + _ticketDetail('服务费', _serviceFeeCtrl.text), + _ticketDetail('出票日期', _issueTimeCtrl.text), + _ticketDetail(_platformCtrl.text.isNotEmpty ? _platformCtrl.text : '平台', '已出票'), + const SizedBox(height: 4), + Text(_ticketCodeCtrl.text, style: TextStyle(fontFamily: 'monospace', fontSize: 9, letterSpacing: 0.8, color: muted)), + ])), + ])), + ]), + ); + } + + Widget _ticketDetail(String label, String value, {bool isPrice = false}) { + return Padding(padding: const EdgeInsets.only(bottom: 4), child: Row(children: [ + Text(label, style: const TextStyle(fontSize: 11, color: Color(0xFF999999))), + const Spacer(), + Text(value, style: TextStyle( + fontSize: isPrice ? 16 : 12, + fontWeight: isPrice ? FontWeight.w700 : FontWeight.w500, + color: isPrice ? const Color(0xFFE5342F) : const Color(0xFF1A1A1A), + )), + ])); + } + + // ═══════════════════════════════════════════════════════════ + // 样式 3:收藏版票根(参考票根收藏版.html) + // ═══════════════════════════════════════════════════════════ + + Widget _buildTicketCollectible() { + final movie = widget.movie; + const red = Color(0xFFC0392B); + const text = Color(0xFF1A1A1A); + const light = Color(0xFF8C8C8C); + const line = Color(0xFFE8E2D8); + + return Container( + width: 360, + decoration: BoxDecoration(color: const Color(0xFFFFFFFB), boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.1), - blurRadius: 20, - offset: const Offset(0, 10), + BoxShadow(color: Colors.black.withValues(alpha: 0.05), blurRadius: 12, offset: const Offset(0, 2)), + BoxShadow(color: Colors.black.withValues(alpha: 0.10), blurRadius: 40, offset: const Offset(0, 8)), + ]), + child: Column(mainAxisSize: MainAxisSize.min, children: [ + // 红色头部 + Container( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12), + color: red, + child: Row(children: [ + const Text('MookNote', style: TextStyle(fontSize: 16, fontWeight: FontWeight.w700, color: Colors.white, letterSpacing: 0.5)), + const Spacer(), + Text('收藏纪念\nCOLLECTIBLE', textAlign: TextAlign.right, + style: TextStyle(fontSize: 8, color: Colors.white.withValues(alpha: 0.7), letterSpacing: 0.5, height: 1.5)), + ]), + ), + + // 主体 + Padding(padding: const EdgeInsets.fromLTRB(24, 22, 24, 0), child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + // 影院 + Row(children: [ + Icon(Icons.location_on_outlined, size: 14, color: red), + const SizedBox(width: 4), + Text(_cinemaCtrl.text, style: const TextStyle(fontSize: 13, fontWeight: FontWeight.w500, color: Color(0xFF6B6B6B), letterSpacing: 0.3)), + ]), + const SizedBox(height: 16), + // 标题 + Text(movie.title, style: const TextStyle(fontSize: 32, fontWeight: FontWeight.w700, color: text, letterSpacing: 0.5, height: 1.15)), + const SizedBox(height: 6), + // 标签 + Wrap(spacing: 8, runSpacing: 6, children: [ + if (movie.genres.isNotEmpty) ...movie.genres.take(3).map((g) => _tagChip(g)), + if (movie.releaseDate != null) _tagChip(_fmtDate(movie.releaseDate!)), + ]), + const SizedBox(height: 20), + // 三列网格 + Container( + decoration: BoxDecoration(border: Border(top: BorderSide(color: line, width: 0.5), bottom: BorderSide(color: line, width: 0.5))), + padding: const EdgeInsets.symmetric(vertical: 14), + child: Row(children: [ + _gridCol('影厅', _hallCtrl.text, red), + Container(width: 0.5, height: 36, color: const Color(0xFFF2EDE5)), + _gridCol('座位', '${_seatRowCtrl.text}排${_seatNumCtrl.text}座', text), + Container(width: 0.5, height: 36, color: const Color(0xFFF2EDE5)), + _gridCol('上映', movie.releaseDate != null ? _fmtDate(movie.releaseDate!) : '--', red), + ]), ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 海报图片 - if (hasPoster) - ClipRRect( - borderRadius: const BorderRadius.vertical(top: Radius.circular(16)), - child: FadeInLocalImage( - path: movie.posterPath, - width: 320, - height: 200, - fit: BoxFit.cover, - ), - ), + ])), - // 内容区域 - Padding( - padding: const EdgeInsets.all(20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 标题 - Text( - movie.title, - style: TextStyle( - fontSize: 22, - fontWeight: FontWeight.bold, - color: colors.onSurface, - ), - ), + // 撕票线(圆形缺口) + _tearCircles(), - // 别名 - if (movie.alternateTitles.isNotEmpty) ...[ - const SizedBox(height: 8), - Text( - movie.alternateTitles.join(' / '), - style: TextStyle( - fontSize: 14, - color: colors.onSurface.withValues(alpha: 0.6), - ), - ), - ], + // 底部信息 + Padding(padding: const EdgeInsets.fromLTRB(24, 10, 24, 0), child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [ + Container(width: 120, height: 120, decoration: BoxDecoration(borderRadius: BorderRadius.circular(6), border: Border.all(color: const Color(0xFFE8E2D8), width: 0.5)), + child: Image.asset('assets/images/ticket/qr.png', fit: BoxFit.contain, + errorBuilder: (_, __, ___) => const SizedBox.shrink())), + const SizedBox(width: 16), + Expanded(child: Column(children: [ + _collectInfo('票价', '¥${_priceCtrl.text}', isPrice: true), + _collectInfo('服务费', '¥${_serviceFeeCtrl.text}'), + _collectInfo('时间', _issueTimeCtrl.text), + _collectInfo('平台', 'MookNote'), + _collectInfo('编码', _ticketCodeCtrl.text, isCode: true), + ])), + ])), - const SizedBox(height: 16), - - // 评分 - if (movie.rating != null && movie.rating! > 0) ...[ - Row( - children: [ - const Icon( - Icons.star, - size: 18, - color: Color(0xFFFFB800), - ), - const SizedBox(width: 4), - Text( - movie.rating!.toStringAsFixed(1), - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - color: Color(0xFFFFB800), - ), - ), - const SizedBox(width: 4), - Text( - '/ 10', - style: TextStyle( - fontSize: 12, - color: colors.onSurface.withValues(alpha: 0.4), - ), - ), - ], - ), - const SizedBox(height: 12), - ], - - // 导演 - if (movie.directors.isNotEmpty) - _buildInfoRow('导演', movie.directors.join(' / '), colors), - - // 编剧 - if (movie.writers.isNotEmpty) - _buildInfoRow('编剧', movie.writers.join(' / '), colors), - - // 主演 - if (movie.actors.isNotEmpty) - _buildInfoRow('主演', movie.actors.take(3).join(' / '), colors), - - // 类型 - if (movie.genres.isNotEmpty) - _buildInfoRow('类型', movie.genres.join(' / '), colors), - - // 上映日期 - if (movie.releaseDate != null) - _buildInfoRow( - '上映', - '${movie.releaseDate!.year}.${movie.releaseDate!.month.toString().padLeft(2, '0')}.${movie.releaseDate!.day.toString().padLeft(2, '0')}', - colors, - ), - - const SizedBox(height: 16), - - // 简介 - if (movie.summary != null && movie.summary!.isNotEmpty) ...[ - Text( - '简介', - style: TextStyle( - fontSize: 12, - color: colors.onSurface.withValues(alpha: 0.4), - ), - ), - const SizedBox(height: 8), - Text( - movie.summary!, - style: TextStyle( - fontSize: 13, - color: colors.onSurface.withValues(alpha: 0.6), - height: 1.6, - ), - maxLines: 5, - overflow: TextOverflow.ellipsis, - ), - ], - - const SizedBox(height: 20), - - // 底部标识 - Divider(height: 1, color: colors.outline), - const SizedBox(height: 12), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.movie_outlined, - size: 14, - color: colors.onSurface.withValues(alpha: 0.5), - ), - const SizedBox(width: 6), - Text( - '来自 MookNote', - style: TextStyle( - fontSize: 12, - color: colors.onSurface.withValues(alpha: 0.5), - ), - ), - ], - ), - ], - ), - ), - ], - ), + // 底部条 + Padding(padding: const EdgeInsets.fromLTRB(24, 12, 24, 14), child: Row(children: [ + Text('MOOKNOTE MOVIE · TICKET', style: TextStyle(fontSize: 9, letterSpacing: 1, color: light.withValues(alpha: 0.7))), + const Spacer(), + Text(_ticketCodeCtrl.text, style: TextStyle(fontSize: 9, letterSpacing: 0.5, color: light.withValues(alpha: 0.7))), + ])), + ]), ); } - /// 构建信息行 - Widget _buildInfoRow(String label, String value, ColorScheme colors) { - return Padding( - padding: const EdgeInsets.only(bottom: 8), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - '$label:', - style: TextStyle( - fontSize: 13, - color: colors.onSurface.withValues(alpha: 0.4), - ), - ), - Expanded( - child: Text( - value, - style: TextStyle( - fontSize: 13, - color: colors.onSurface.withValues(alpha: 0.75), - ), - ), - ), - ], - ), - ); + Widget _tagChip(String text) { + return Container(padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3), + decoration: BoxDecoration(border: Border.all(color: const Color(0xFFEBE5D9), width: 0.5), borderRadius: BorderRadius.circular(3)), + child: Text(text, style: const TextStyle(fontSize: 10, color: Color(0xFF6B6B6B), letterSpacing: 0.5))); } - /// 生成并分享海报 + Widget _gridCol(String label, String value, Color valueColor) { + return Expanded(child: Column(children: [ + Text(label, style: const TextStyle(fontSize: 9, color: Color(0xFF8C8C8C), letterSpacing: 1)), + const SizedBox(height: 4), + Text(value, textAlign: TextAlign.center, style: TextStyle(fontSize: 13, fontWeight: FontWeight.w600, color: valueColor, letterSpacing: 0.5)), + ])); + } + + Widget _collectInfo(String label, String value, {bool isPrice = false, bool isCode = false}) { + return Padding(padding: const EdgeInsets.only(bottom: 3), child: Row(children: [ + SizedBox(width: 32, child: Text(label, style: const TextStyle(fontSize: 9, color: Color(0xFF8C8C8C), letterSpacing: 0.5))), + Expanded(child: Text(value, textAlign: TextAlign.right, style: TextStyle( + fontSize: isPrice ? 15 : 10, + fontWeight: isPrice ? FontWeight.w700 : FontWeight.w500, + color: isPrice ? const Color(0xFFC0392B) : const Color(0xFF1A1A1A).withValues(alpha: 0.8), + fontFamily: isCode ? 'monospace' : null, + letterSpacing: isCode ? 0.5 : 0, + ))), + ])); + } + + // ─── 通用组件 ─── + + Widget _dashedLine(Color color) { + return Padding(padding: const EdgeInsets.symmetric(horizontal: 8), + child: CustomPaint(size: const Size(double.infinity, 1), painter: _DashedLinePainter(color: color))); + } + + Widget _tearScissors(Color bg) { + return SizedBox(height: 28, child: Stack(children: [ + Positioned(left: 20, right: 20, top: 13, child: CustomPaint( + size: const Size(double.infinity, 1), painter: _DashedLinePainter(color: const Color(0xFFC8C4B8), dashWidth: 6, dashSpace: 8))), + Positioned(left: 2, top: 4, child: Icon(Icons.content_cut, size: 16, color: const Color(0xFF999999))), + ])); + } + + Widget _tearCircles() { + return Padding(padding: const EdgeInsets.symmetric(horizontal: 24), child: SizedBox(height: 24, child: Stack(children: [ + Positioned(left: 0, right: 0, top: 11, child: CustomPaint( + size: const Size(double.infinity, 1), painter: _DashedLinePainter(color: const Color(0xFFD8D0C0), dashWidth: 9, dashSpace: 9))), + Positioned(left: -30, top: 5.5, child: Container(width: 13, height: 13, decoration: BoxDecoration(color: const Color(0xFFEBE5DB), shape: BoxShape.circle))), + Positioned(right: -30, top: 5.5, child: Container(width: 13, height: 13, decoration: BoxDecoration(color: const Color(0xFFEBE5DB), shape: BoxShape.circle))), + ]))); + } + + String _fmtDate(DateTime d) => '${d.year}.${d.month.toString().padLeft(2, '0')}.${d.day.toString().padLeft(2, '0')}'; + + String _subtitleText(Movie m) { + final parts = []; + if (m.genres.isNotEmpty) parts.add(m.genres.join(' / ')); + return parts.join(' · '); + } + + String _statusEN(String s) { + switch (s) { case 'watched': return 'ADMITTED'; case 'watching': return 'NOW PLAYING'; default: return 'RESERVED'; } + } + + // ─── 生成分享 ─── + Future _generateAndShare() async { setState(() => _isGenerating = true); - try { - // 捕获海报图片 - final boundary = _posterKey.currentContext?.findRenderObject() - as RenderRepaintBoundary?; - if (boundary == null) { - throw Exception('无法获取海报边界'); - } - + final boundary = _posterKey.currentContext?.findRenderObject() as RenderRepaintBoundary?; + if (boundary == null) throw Exception('无法获取海报边界'); final image = await boundary.toImage(pixelRatio: 3.0); final byteData = await image.toByteData(format: ui.ImageByteFormat.png); - if (byteData == null) { - throw Exception('无法生成图片数据'); - } - - final bytes = byteData.buffer.asUint8List(); - - // 保存到临时文件 + if (byteData == null) throw Exception('无法生成图片数据'); final tempDir = await getTemporaryDirectory(); - final fileName = 'movie_poster_${DateTime.now().millisecondsSinceEpoch}.png'; - final file = File('${tempDir.path}/$fileName'); - await file.writeAsBytes(bytes); - - // 分享 - await Share.shareXFiles( - [XFile(file.path)], - text: '分享影视:${widget.movie.title}', - ); + final file = File('${tempDir.path}/movie_poster_${DateTime.now().millisecondsSinceEpoch}.png'); + await file.writeAsBytes(byteData.buffer.asUint8List()); + await Share.shareXFiles([XFile(file.path)], text: '分享影视:${widget.movie.title}'); } catch (e) { - if (mounted) { - ToastUtil.show(context, '生成海报失败:$e'); - } + if (mounted) ToastUtil.show(context, '生成海报失败:$e'); } finally { - if (mounted) { - setState(() => _isGenerating = false); - } + if (mounted) setState(() => _isGenerating = false); } } } + +class _DashedLinePainter extends CustomPainter { + final Color color; + final double dashWidth; + final double dashSpace; + _DashedLinePainter({required this.color, this.dashWidth = 4, this.dashSpace = 4}); + + @override + void paint(Canvas canvas, Size size) { + final paint = Paint()..color = color..strokeWidth = 1..style = PaintingStyle.stroke; + double x = 0; + while (x < size.width) { canvas.drawLine(Offset(x, 0), Offset(x + dashWidth, 0), paint); x += dashWidth + dashSpace; } + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} diff --git a/lib/widgets/book_status_bar.dart b/lib/widgets/book_status_bar.dart index a8749a8..93b7f1c 100644 --- a/lib/widgets/book_status_bar.dart +++ b/lib/widgets/book_status_bar.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/app_provider.dart'; -/// 阅读状态选择栏 - 水滴滑动动画 +/// 阅读状态选择栏 - 交叉渐变动画 class BookStatusBar extends StatelessWidget { const BookStatusBar({super.key}); @@ -15,9 +15,7 @@ class BookStatusBar extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), decoration: BoxDecoration( color: colors.surface, - border: Border( - bottom: BorderSide(color: colors.outline, width: 0.5), - ), + border: Border(bottom: BorderSide(color: colors.outline, width: 0.5)), ), child: Container( padding: const EdgeInsets.all(4), @@ -25,66 +23,13 @@ class BookStatusBar extends StatelessWidget { color: colors.surfaceContainerHighest, borderRadius: BorderRadius.circular(24), ), - child: LayoutBuilder( - builder: (context, constraints) { - final tabWidth = constraints.maxWidth / 3; - return SizedBox( - height: 40, - child: Stack( - children: [ - AnimatedPositioned( - duration: const Duration(milliseconds: 800), - curve: Curves.elasticOut, - left: provider.bookStatusIndex * tabWidth, - top: 0, - bottom: 0, - width: tabWidth, - child: Padding( - padding: const EdgeInsets.all(3), - child: Container( - decoration: BoxDecoration( - color: colors.primary, - borderRadius: BorderRadius.circular(20), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.1), - blurRadius: 8, - offset: const Offset(0, 2), - ), - ], - ), - ), - ), - ), - Row( - children: [ - _buildTab( - colors: colors, - label: '已读', - icon: Icons.check_circle_outline, - isSelected: provider.bookStatusIndex == 0, - onTap: () => provider.setBookStatusIndex(0), - ), - _buildTab( - colors: colors, - label: '在读', - icon: Icons.menu_book_outlined, - isSelected: provider.bookStatusIndex == 1, - onTap: () => provider.setBookStatusIndex(1), - ), - _buildTab( - colors: colors, - label: '想读', - icon: Icons.bookmark_outlined, - isSelected: provider.bookStatusIndex == 2, - onTap: () => provider.setBookStatusIndex(2), - ), - ], - ), - ], - ), - ); - }, + child: SizedBox( + height: 40, + child: Row(children: [ + _buildTab(colors, '已读', Icons.check_circle_outline, provider.bookStatusIndex == 0, () => provider.setBookStatusIndex(0)), + _buildTab(colors, '在读', Icons.menu_book_outlined, provider.bookStatusIndex == 1, () => provider.setBookStatusIndex(1)), + _buildTab(colors, '想读', Icons.bookmark_outlined, provider.bookStatusIndex == 2, () => provider.setBookStatusIndex(2)), + ]), ), ), ); @@ -92,39 +37,45 @@ class BookStatusBar extends StatelessWidget { ); } - Widget _buildTab({ - required ColorScheme colors, - required String label, - required IconData icon, - required bool isSelected, - required VoidCallback onTap, - }) { + Widget _buildTab(ColorScheme colors, String label, IconData icon, bool isSelected, VoidCallback onTap) { return Expanded( child: GestureDetector( behavior: HitTestBehavior.opaque, onTap: onTap, - child: Container( - height: double.infinity, + child: AnimatedContainer( + duration: const Duration(milliseconds: 400), + curve: Curves.easeInOut, + margin: const EdgeInsets.all(3), + decoration: BoxDecoration( + color: isSelected ? colors.primary : Colors.transparent, + borderRadius: BorderRadius.circular(20), + boxShadow: isSelected ? [BoxShadow(color: Colors.black.withValues(alpha: 0.1), blurRadius: 8, offset: const Offset(0, 2))] : null, + ), alignment: Alignment.center, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - icon, - size: 16, - color: isSelected ? colors.onPrimary : colors.onSurface.withValues(alpha: 0.6), - ), - const SizedBox(width: 6), - Text( - label, - style: TextStyle( - fontSize: 13, - fontWeight: isSelected ? FontWeight.w600 : FontWeight.w500, - color: isSelected ? colors.onPrimary : colors.onSurface.withValues(alpha: 0.6), + child: AnimatedDefaultTextStyle( + duration: const Duration(milliseconds: 400), + curve: Curves.easeInOut, + style: TextStyle( + fontSize: 13, + fontWeight: isSelected ? FontWeight.w600 : FontWeight.w500, + color: isSelected ? colors.onPrimary : colors.onSurface.withValues(alpha: 0.6), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + AnimatedSwitcher( + duration: const Duration(milliseconds: 350), + child: Icon(icon, key: ValueKey(isSelected), size: 16, + color: isSelected ? colors.onPrimary : colors.onSurface.withValues(alpha: 0.6)), ), - ), - ], + const SizedBox(width: 6), + AnimatedSwitcher( + duration: const Duration(milliseconds: 350), + child: Text(label, key: ValueKey('$label$isSelected')), + ), + ], + ), ), ), ), diff --git a/lib/widgets/movie_status_bar.dart b/lib/widgets/movie_status_bar.dart index 55c9573..ec36434 100644 --- a/lib/widgets/movie_status_bar.dart +++ b/lib/widgets/movie_status_bar.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/app_provider.dart'; -/// 观影状态选择栏 - 水滴滑动动画 +/// 观影状态选择栏 - 交叉渐变动画 class MovieStatusBar extends StatelessWidget { const MovieStatusBar({super.key}); @@ -15,9 +15,7 @@ class MovieStatusBar extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), decoration: BoxDecoration( color: colors.surface, - border: Border( - bottom: BorderSide(color: colors.outline, width: 0.5), - ), + border: Border(bottom: BorderSide(color: colors.outline, width: 0.5)), ), child: Container( padding: const EdgeInsets.all(4), @@ -25,66 +23,13 @@ class MovieStatusBar extends StatelessWidget { color: colors.surfaceContainerHighest, borderRadius: BorderRadius.circular(24), ), - child: LayoutBuilder( - builder: (context, constraints) { - final tabWidth = constraints.maxWidth / 3; - return SizedBox( - height: 40, - child: Stack( - children: [ - AnimatedPositioned( - duration: const Duration(milliseconds: 800), - curve: Curves.elasticOut, - left: provider.movieStatusIndex * tabWidth, - top: 0, - bottom: 0, - width: tabWidth, - child: Padding( - padding: const EdgeInsets.all(3), - child: Container( - decoration: BoxDecoration( - color: colors.primary, - borderRadius: BorderRadius.circular(20), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.1), - blurRadius: 8, - offset: const Offset(0, 2), - ), - ], - ), - ), - ), - ), - Row( - children: [ - _buildTab( - colors: colors, - label: '已看', - icon: Icons.check_circle_outline, - isSelected: provider.movieStatusIndex == 0, - onTap: () => provider.setMovieStatusIndex(0), - ), - _buildTab( - colors: colors, - label: '在看', - icon: Icons.play_circle_outline, - isSelected: provider.movieStatusIndex == 1, - onTap: () => provider.setMovieStatusIndex(1), - ), - _buildTab( - colors: colors, - label: '想看', - icon: Icons.bookmark_outline, - isSelected: provider.movieStatusIndex == 2, - onTap: () => provider.setMovieStatusIndex(2), - ), - ], - ), - ], - ), - ); - }, + child: SizedBox( + height: 40, + child: Row(children: [ + _buildTab(colors, '已看', Icons.check_circle_outline, provider.movieStatusIndex == 0, () => provider.setMovieStatusIndex(0)), + _buildTab(colors, '在看', Icons.play_circle_outline, provider.movieStatusIndex == 1, () => provider.setMovieStatusIndex(1)), + _buildTab(colors, '想看', Icons.bookmark_outline, provider.movieStatusIndex == 2, () => provider.setMovieStatusIndex(2)), + ]), ), ), ); @@ -92,39 +37,45 @@ class MovieStatusBar extends StatelessWidget { ); } - Widget _buildTab({ - required ColorScheme colors, - required String label, - required IconData icon, - required bool isSelected, - required VoidCallback onTap, - }) { + Widget _buildTab(ColorScheme colors, String label, IconData icon, bool isSelected, VoidCallback onTap) { return Expanded( child: GestureDetector( behavior: HitTestBehavior.opaque, onTap: onTap, - child: Container( - height: double.infinity, + child: AnimatedContainer( + duration: const Duration(milliseconds: 400), + curve: Curves.easeInOut, + margin: const EdgeInsets.all(3), + decoration: BoxDecoration( + color: isSelected ? colors.primary : Colors.transparent, + borderRadius: BorderRadius.circular(20), + boxShadow: isSelected ? [BoxShadow(color: Colors.black.withValues(alpha: 0.1), blurRadius: 8, offset: const Offset(0, 2))] : null, + ), alignment: Alignment.center, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - icon, - size: 16, - color: isSelected ? colors.onPrimary : colors.onSurface.withValues(alpha: 0.6), - ), - const SizedBox(width: 6), - Text( - label, - style: TextStyle( - fontSize: 13, - fontWeight: isSelected ? FontWeight.w600 : FontWeight.w500, - color: isSelected ? colors.onPrimary : colors.onSurface.withValues(alpha: 0.6), + child: AnimatedDefaultTextStyle( + duration: const Duration(milliseconds: 400), + curve: Curves.easeInOut, + style: TextStyle( + fontSize: 13, + fontWeight: isSelected ? FontWeight.w600 : FontWeight.w500, + color: isSelected ? colors.onPrimary : colors.onSurface.withValues(alpha: 0.6), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + AnimatedSwitcher( + duration: const Duration(milliseconds: 350), + child: Icon(icon, key: ValueKey(isSelected), size: 16, + color: isSelected ? colors.onPrimary : colors.onSurface.withValues(alpha: 0.6)), ), - ), - ], + const SizedBox(width: 6), + AnimatedSwitcher( + duration: const Duration(milliseconds: 350), + child: Text(label, key: ValueKey('$label$isSelected')), + ), + ], + ), ), ), ), diff --git a/pubspec.lock b/pubspec.lock index 8641285..2bed419 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: archive sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.6.1" args: @@ -14,7 +14,7 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.7.0" async: @@ -22,7 +22,7 @@ packages: description: name: async sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.13.1" boolean_selector: @@ -30,7 +30,7 @@ packages: description: name: boolean_selector sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" characters: @@ -38,7 +38,7 @@ packages: description: name: characters sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.1" checked_yaml: @@ -46,7 +46,7 @@ packages: description: name: checked_yaml sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.4" cli_util: @@ -54,7 +54,7 @@ packages: description: name: cli_util sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.4.2" clock: @@ -62,7 +62,7 @@ packages: description: name: clock sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.2" code_assets: @@ -70,7 +70,7 @@ packages: description: name: code_assets sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" collection: @@ -78,7 +78,7 @@ packages: description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.19.1" cross_file: @@ -86,7 +86,7 @@ packages: description: name: cross_file sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.3.5+2" crypto: @@ -94,7 +94,7 @@ packages: description: name: crypto sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.7" cupertino_icons: @@ -102,7 +102,7 @@ packages: description: name: cupertino_icons sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.9" equatable: @@ -110,7 +110,7 @@ packages: description: name: equatable sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.8" extended_text_field: @@ -118,7 +118,7 @@ packages: description: name: extended_text_field sha256: "3996195c117c6beb734026a7bc0ba80d7e4e84e4edd4728caa544d8209ab4d7d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "16.0.2" extended_text_library: @@ -126,7 +126,7 @@ packages: description: name: extended_text_library sha256: "13d99f8a10ead472d5e2cf4770d3d047203fe5054b152e9eb5dc692a71befbba" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "12.0.1" fake_async: @@ -134,7 +134,7 @@ packages: description: name: fake_async sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.3" ffi: @@ -142,7 +142,7 @@ packages: description: name: ffi sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" file: @@ -150,7 +150,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.0.1" file_picker: @@ -158,7 +158,7 @@ packages: description: name: file_picker sha256: ab13ae8ef5580a411c458d6207b6774a6c237d77ac37011b13994879f68a8810 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.3.7" file_selector_linux: @@ -166,7 +166,7 @@ packages: description: name: file_selector_linux sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.9.4" file_selector_macos: @@ -174,7 +174,7 @@ packages: description: name: file_selector_macos sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.7.0" file_selector_windows: @@ -190,7 +190,7 @@ packages: description: name: file_selector_windows sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.9.3+5" fixnum: @@ -198,7 +198,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" fl_chart: @@ -206,7 +206,7 @@ packages: description: name: fl_chart sha256: "74959b99b92b9eebeed1a4049426fd67c4abc3c5a0f4d12e2877097d6a11ae08" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.69.2" flutter: @@ -219,7 +219,7 @@ packages: description: name: flutter_launcher_icons sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.13.1" flutter_lints: @@ -227,7 +227,7 @@ packages: description: name: flutter_lints sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.0" flutter_localizations: @@ -240,7 +240,7 @@ packages: description: name: flutter_markdown_plus sha256: "039177906850278e8fb1cd364115ee0a46281135932fa8ecea8455522166d2de" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.0" flutter_test: @@ -274,7 +274,7 @@ packages: description: name: hooks sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.2" http: @@ -282,7 +282,7 @@ packages: description: name: http sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.6.0" http_parser: @@ -290,7 +290,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.1.2" image: @@ -298,7 +298,7 @@ packages: description: name: image sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.3.0" image_picker: @@ -306,7 +306,7 @@ packages: description: name: image_picker sha256: "91c025426c2881c551100bce834e201c835a170151545f58d17da5180ca7d9ac" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.2" image_picker_android: @@ -314,7 +314,7 @@ packages: description: name: image_picker_android sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.1" image_picker_ios: @@ -330,7 +330,7 @@ packages: description: name: image_picker_ios sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.2" image_picker_macos: @@ -346,7 +346,7 @@ packages: description: name: image_picker_macos sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.11.1" image_picker_windows: @@ -362,7 +362,7 @@ packages: description: name: image_picker_windows sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.2" intl: @@ -370,7 +370,7 @@ packages: description: name: intl sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.20.2" jni: @@ -378,7 +378,7 @@ packages: description: name: jni sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.0" jni_flutter: @@ -386,7 +386,7 @@ packages: description: name: jni_flutter sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.1" json_annotation: @@ -394,7 +394,7 @@ packages: description: name: json_annotation sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.12.0" leak_tracker: @@ -402,7 +402,7 @@ packages: description: name: leak_tracker sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.10" leak_tracker_testing: @@ -418,7 +418,7 @@ packages: description: name: leak_tracker_testing sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.2" lints: @@ -426,7 +426,7 @@ packages: description: name: lints sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.0" logging: @@ -434,7 +434,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" markdown: @@ -442,7 +442,7 @@ packages: description: name: markdown sha256: ee85086ad7698b42522c6ad42fe195f1b9898e4d974a1af4576c1a3a176cada9 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.3.1" matcher: @@ -450,7 +450,7 @@ packages: description: name: matcher sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.12.19" material_color_utilities: @@ -458,7 +458,7 @@ packages: description: name: material_color_utilities sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.13.0" meta: @@ -466,7 +466,7 @@ packages: description: name: meta sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.17.0" mime: @@ -474,7 +474,7 @@ packages: description: name: mime sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.0" nested: @@ -482,7 +482,7 @@ packages: description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.0" objective_c: @@ -490,7 +490,7 @@ packages: description: name: objective_c sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "9.4.1" package_config: @@ -498,7 +498,7 @@ packages: description: name: package_config sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" package_info_plus: @@ -506,7 +506,7 @@ packages: description: name: package_info_plus sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.1" path: @@ -522,7 +522,7 @@ packages: description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.9.1" path_provider: @@ -530,7 +530,7 @@ packages: description: name: path_provider sha256: a7f4874f987173da295a61c181b8ee71dab59b332a486b391babf26a1b884825 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.6" path_provider_android: @@ -538,7 +538,7 @@ packages: description: name: path_provider_android sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.1" path_provider_foundation: @@ -546,7 +546,7 @@ packages: description: name: path_provider_foundation sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.6.0" path_provider_linux: @@ -554,7 +554,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.3" path_provider_windows: @@ -570,7 +570,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" permission_handler: @@ -578,7 +578,7 @@ packages: description: name: permission_handler sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "11.4.0" permission_handler_android: @@ -586,7 +586,7 @@ packages: description: name: permission_handler_android sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "12.1.0" permission_handler_apple: @@ -594,7 +594,7 @@ packages: description: name: permission_handler_apple sha256: "79dfa1df734798aa3cfdad166d3a3698c206d8813de13516ea1071b5d7e2f420" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "9.4.10" permission_handler_html: @@ -602,7 +602,7 @@ packages: description: name: permission_handler_html sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.3.0" permission_handler_windows: @@ -618,7 +618,7 @@ packages: description: name: permission_handler_windows sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.1" petitparser: @@ -626,7 +626,7 @@ packages: description: name: petitparser sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.0.2" platform: @@ -634,7 +634,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.6" plugin_platform_interface: @@ -642,7 +642,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.8" provider: @@ -650,7 +650,7 @@ packages: description: name: provider sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.1.5+1" pub_semver: @@ -658,7 +658,7 @@ packages: description: name: pub_semver sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" record_use: @@ -666,7 +666,7 @@ packages: description: name: record_use sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.6.0" share_plus: @@ -674,7 +674,7 @@ packages: description: name: share_plus sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.0.2" shared_preferences: @@ -690,7 +690,7 @@ packages: description: name: shared_preferences sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.5" shared_preferences_android: @@ -698,7 +698,7 @@ packages: description: name: shared_preferences_android sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.23" shared_preferences_foundation: @@ -706,7 +706,7 @@ packages: description: name: shared_preferences_foundation sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.6" shared_preferences_linux: @@ -714,7 +714,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.2" shared_preferences_web: @@ -730,7 +730,7 @@ packages: description: name: shared_preferences_web sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.3" shared_preferences_windows: @@ -738,7 +738,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" sky_engine: @@ -751,7 +751,7 @@ packages: description: name: source_span sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.10.2" sqflite: @@ -759,7 +759,7 @@ packages: description: name: sqflite sha256: "564cfed0746fe53140c23b70b308e045c3b31f17778f2f326ccb7d804ea0250a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.2+1" sqflite_android: @@ -767,7 +767,7 @@ packages: description: name: sqflite_android sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.2+3" sqflite_common: @@ -775,7 +775,7 @@ packages: description: name: sqflite_common sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.8" sqflite_darwin: @@ -783,7 +783,7 @@ packages: description: name: sqflite_darwin sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.2" sqflite_platform_interface: @@ -791,7 +791,7 @@ packages: description: name: sqflite_platform_interface sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.0" stack_trace: @@ -799,7 +799,7 @@ packages: description: name: stack_trace sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.12.1" stream_channel: @@ -807,7 +807,7 @@ packages: description: name: stream_channel sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.4" string_scanner: @@ -815,7 +815,7 @@ packages: description: name: string_scanner sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.1" synchronized: @@ -823,7 +823,7 @@ packages: description: name: synchronized sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.4.0+1" term_glyph: @@ -831,7 +831,7 @@ packages: description: name: term_glyph sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.2" test_api: @@ -839,7 +839,7 @@ packages: description: name: test_api sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.10" typed_data: @@ -847,7 +847,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" url_launcher: @@ -855,7 +855,7 @@ packages: description: name: url_launcher sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.3.2" url_launcher_android: @@ -863,7 +863,7 @@ packages: description: name: url_launcher_android sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.3.30" url_launcher_ios: @@ -871,7 +871,7 @@ packages: description: name: url_launcher_ios sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.4.1" url_launcher_linux: @@ -879,7 +879,7 @@ packages: description: name: url_launcher_linux sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.2" url_launcher_macos: @@ -887,7 +887,7 @@ packages: description: name: url_launcher_macos sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.2" url_launcher_web: @@ -903,7 +903,7 @@ packages: description: name: url_launcher_web sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.3" url_launcher_windows: @@ -911,7 +911,7 @@ packages: description: name: url_launcher_windows sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.5" uuid: @@ -919,7 +919,7 @@ packages: description: name: uuid sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.5.3" vector_math: @@ -927,7 +927,7 @@ packages: description: name: vector_math sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" vm_service: @@ -935,7 +935,7 @@ packages: description: name: vm_service sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "15.2.0" web: @@ -943,7 +943,7 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" webview_flutter: @@ -951,7 +951,7 @@ packages: description: name: webview_flutter sha256: e4d3474277c5043f5f3100ed27d94ad693abfd5c602b0221c719a4497e4ba1e4 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.14.0" webview_flutter_android: @@ -959,7 +959,7 @@ packages: description: name: webview_flutter_android sha256: ad5182eff9a550925330cb9f0cb038eddfdd5712aba8b77aa0f0400e50f6e688 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" 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.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.15.1" webview_flutter_wkwebview: @@ -975,7 +975,7 @@ packages: description: name: webview_flutter_wkwebview sha256: "82648217f537573e1ca9ae9952d3eacedca6ab5aee69dc84445fc763766dcea2" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.25.1" win32: @@ -983,7 +983,7 @@ packages: description: name: win32 sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.15.0" xdg_directories: @@ -991,7 +991,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" xml: @@ -999,7 +999,7 @@ packages: description: name: xml sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.6.1" yaml: @@ -1007,7 +1007,7 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.3" sdks: diff --git a/pubspec.yaml b/pubspec.yaml index 0be5406..83d41df 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,3 +53,4 @@ flutter: assets: - assets/images/ - assets/icon/ + - assets/images/ticket/ diff --git a/参考/票根html/maoyan.png b/参考/票根html/maoyan.png new file mode 100644 index 0000000000000000000000000000000000000000..a0585d834f4293fb761d34ca10edac2ca7ece9fd GIT binary patch literal 49094 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 UKBoqw-2eap07*qoM6N<$f_ih!pa1{> literal 0 HcmV?d00001 diff --git a/参考/票根html/mookiletter.png b/参考/票根html/mookiletter.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab0463a03b8be36216d1637e6844d900ba37794 GIT binary patch literal 5978 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 E10HW>(EtDd literal 0 HcmV?d00001 diff --git a/参考/票根html/票根.html b/参考/票根html/票根.html new file mode 100644 index 0000000..08bfe46 --- /dev/null +++ b/参考/票根html/票根.html @@ -0,0 +1,395 @@ + + + + + +猫眼电影 · 票根 + + + + +
+
+ + +
+ +
猫眼电影
+
+ + +
+
+
万达影城(朝阳大悦城IMAX店)
+
+ +
+
流浪地球3
+
科幻 / 冒险 / 3D IMAX · 片长148分钟
+
+ +
+
+ + + + + + 3号IMAX厅 +
+
+
+ 8排12座 + | + 2026年6月18日 19:30 +
+
+ + +
+ +
+ + + + +
+
+ + + diff --git a/参考/票根html/票根收藏版.html b/参考/票根html/票根收藏版.html new file mode 100644 index 0000000..a95f3ee --- /dev/null +++ b/参考/票根html/票根收藏版.html @@ -0,0 +1,444 @@ + + + + + +猫眼电影 · 票根(收藏版) + + + + +
+ +
+
+ + 猫眼电影 +
+
收藏纪念
PASSENGER COPY
+
+ +
+
+ + + + + 万达影城(朝阳大悦城IMAX店) +
+ +
流浪地球3
+
+ 3D IMAX + 科幻 / 冒险 + 片长148分钟 +
+ +
+
+ 影厅 + 3号IMAX厅 +
+
+ 座位 + 8排12座 +
+
+ 时间 + 2026/06/18 19:30 +
+
+
+ +
+
+ + + + + + +
+
+ + + + + +
+ + + diff --git a/参考/票根html/票根样式三.html b/参考/票根html/票根样式三.html new file mode 100644 index 0000000..3679ab9 --- /dev/null +++ b/参考/票根html/票根样式三.html @@ -0,0 +1,386 @@ + + + + + +电影票根 · 收藏版 + + + + +
+ + +
+ 猫眼电影 + 收藏纪念
COLLECTIBLE
+
+ + +
+
+ + + + + 万达影城(朝阳大悦城IMAX店) +
+ +
流浪地球3
+
+ 3D IMAX + 科幻 / 冒险 + 片长148分钟 +
+ +
+
+ 影厅 + 3号IMAX厅 +
+
+ 座位 + 8排12座 +
+
+ 时间 + 2026.06.18 19:30 +
+
+
+ + +
+ + +
+ + +
+
+
+ 二维码 +
+
+ +
+
+ 票价 + ¥49.90 +
+
+ 服务费 + ¥5.00 +
+
+
+ 出票时间 + 2026-06-18 10:32 +
+
+ 淘票票 + 已出票 +
+
+ 取票码 + 8602 3100 0618 7251 +
+
+
+ + +
+ TICKET · COLLECTIBLE + NO. MY202606181930 +
+ +
+ + +