generated from dellevin/template
动画效果美化
This commit is contained in:
@@ -7,85 +7,62 @@ import '../pages/movies/movie_detail_page.dart';
|
||||
import '../pages/book/book_detail_page.dart';
|
||||
import '../pages/note/note_detail_page.dart';
|
||||
import '../pages/movies/douban_webview_page.dart';
|
||||
import 'slide_up_page_route.dart';
|
||||
|
||||
/// 路由生成器
|
||||
class AppRouter {
|
||||
static Route<dynamic> generateRoute(RouteSettings settings) {
|
||||
switch (settings.name) {
|
||||
case '/movie-form':
|
||||
// 处理不同参数类型:Movie 对象或 Map(包含 initialStatus)
|
||||
final args = settings.arguments;
|
||||
Movie? movie;
|
||||
String? initialStatus;
|
||||
|
||||
if (args is Movie) {
|
||||
movie = args;
|
||||
} else if (args is Map<String, dynamic>) {
|
||||
initialStatus = args['initialStatus'] as String?;
|
||||
}
|
||||
|
||||
return MaterialPageRoute(
|
||||
builder: (_) => MovieFormPage(
|
||||
movie: movie,
|
||||
initialStatus: initialStatus,
|
||||
),
|
||||
return SlideUpPageRoute(
|
||||
page: MovieFormPage(movie: movie, initialStatus: initialStatus),
|
||||
);
|
||||
|
||||
|
||||
case '/book-form':
|
||||
// 处理不同参数类型:Book 对象或 Map(包含 initialStatus)
|
||||
final args = settings.arguments;
|
||||
Book? book;
|
||||
String? initialStatus;
|
||||
|
||||
if (args is Book) {
|
||||
book = args;
|
||||
} else if (args is Map<String, dynamic>) {
|
||||
initialStatus = args['initialStatus'] as String?;
|
||||
}
|
||||
|
||||
return MaterialPageRoute(
|
||||
builder: (_) => BookFormPage(
|
||||
book: book,
|
||||
initialStatus: initialStatus,
|
||||
),
|
||||
return SlideUpPageRoute(
|
||||
page: BookFormPage(book: book, initialStatus: initialStatus),
|
||||
);
|
||||
|
||||
|
||||
case '/note-form':
|
||||
final note = settings.arguments as Note?;
|
||||
return MaterialPageRoute(
|
||||
builder: (_) => NoteFormPage(note: note),
|
||||
);
|
||||
|
||||
return SlideUpPageRoute(page: NoteFormPage(note: note));
|
||||
|
||||
case '/movie-detail':
|
||||
final movie = settings.arguments as Movie;
|
||||
return MaterialPageRoute(
|
||||
builder: (_) => MovieDetailPage(movie: movie),
|
||||
);
|
||||
|
||||
return SlideUpPageRoute(page: MovieDetailPage(movie: movie));
|
||||
|
||||
case '/book-detail':
|
||||
final book = settings.arguments as Book;
|
||||
return MaterialPageRoute(
|
||||
builder: (_) => BookDetailPage(book: book),
|
||||
);
|
||||
|
||||
return SlideUpPageRoute(page: BookDetailPage(book: book));
|
||||
|
||||
case '/note-detail':
|
||||
final note = settings.arguments as Note;
|
||||
return MaterialPageRoute(
|
||||
builder: (_) => NoteDetailPage(note: note),
|
||||
);
|
||||
|
||||
return SlideUpPageRoute(page: NoteDetailPage(note: note));
|
||||
|
||||
case '/douban-webview':
|
||||
final url = settings.arguments as String;
|
||||
return MaterialPageRoute(
|
||||
builder: (_) => DoubanWebViewPage(url: url),
|
||||
);
|
||||
|
||||
return SlideUpPageRoute(page: DoubanWebViewPage(url: url));
|
||||
|
||||
default:
|
||||
return MaterialPageRoute(
|
||||
builder: (_) => Scaffold(
|
||||
body: Center(
|
||||
child: Text('未找到页面:${settings.name}'),
|
||||
),
|
||||
body: Center(child: Text('未找到页面:${settings.name}')),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
28
lib/utils/slide_up_page_route.dart
Normal file
28
lib/utils/slide_up_page_route.dart
Normal file
@@ -0,0 +1,28 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
/// 自定义页面过渡动画 — 向上滑入 + 淡入
|
||||
class SlideUpPageRoute extends PageRouteBuilder {
|
||||
SlideUpPageRoute({required Widget page})
|
||||
: super(
|
||||
pageBuilder: (context, animation, secondaryAnimation) => page,
|
||||
transitionsBuilder: (context, animation, secondaryAnimation, child) {
|
||||
const begin = Offset(0.0, 0.08);
|
||||
const end = Offset.zero;
|
||||
final tween = Tween(begin: begin, end: end).chain(
|
||||
CurveTween(curve: Curves.easeOutCubic),
|
||||
);
|
||||
final fadeTween = Tween<double>(begin: 0.0, end: 1.0).chain(
|
||||
CurveTween(curve: const Interval(0.0, 0.3, curve: Curves.easeOut)),
|
||||
);
|
||||
return SlideTransition(
|
||||
position: animation.drive(tween),
|
||||
child: FadeTransition(
|
||||
opacity: animation.drive(fadeTween),
|
||||
child: child,
|
||||
),
|
||||
);
|
||||
},
|
||||
transitionDuration: const Duration(milliseconds: 350),
|
||||
reverseTransitionDuration: const Duration(milliseconds: 250),
|
||||
);
|
||||
}
|
||||
@@ -68,10 +68,18 @@ class UserPrefs {
|
||||
int get defaultMainTabIndex => prefs.getInt('defaultMainTabIndex') ?? 0;
|
||||
Future<bool> setDefaultMainTabIndex(int value) => prefs.setInt('defaultMainTabIndex', value);
|
||||
|
||||
/// 笔记布局样式 (0: 列表, 1: 瀑布流)
|
||||
/// 笔记布局样式 (0: 列表, 1: 瀑布流, 2: 时间线)
|
||||
int get noteLayoutStyle => prefs.getInt('noteLayoutStyle') ?? 0;
|
||||
Future<bool> setNoteLayoutStyle(int value) => prefs.setInt('noteLayoutStyle', value);
|
||||
|
||||
/// 影视布局样式 (0: 海报网格, 1: 列表)
|
||||
int get movieLayoutStyle => prefs.getInt('movieLayoutStyle') ?? 0;
|
||||
Future<bool> setMovieLayoutStyle(int value) => prefs.setInt('movieLayoutStyle', value);
|
||||
|
||||
/// 阅读布局样式 (0: 封面网格, 1: 列表)
|
||||
int get bookLayoutStyle => prefs.getInt('bookLayoutStyle') ?? 0;
|
||||
Future<bool> setBookLayoutStyle(int value) => prefs.setInt('bookLayoutStyle', value);
|
||||
|
||||
// ========== 应用图标设置 ==========
|
||||
|
||||
/// Markdown 阅读器最近选择的目录
|
||||
|
||||
Reference in New Issue
Block a user