Flutter启动页路由插件splash_route的使用
Flutter启动页路由插件splash_route的使用
Splash Route
Splash Route
是一个带有炫酷动画的路由,用于在导航到另一页面时显示启动动画。
Demo
安装
在 pubspec.yaml
文件中添加 splash_route
依赖:
dependencies:
splash_route: ^0.0.2
然后在 Dart 文件中导入该包:
import 'package:splash_route/splash_route.dart';
使用方法
通过在 Navigator
中添加 SplashRoute
来实现启动页动画。以下是一个完整的示例代码,展示了如何使用 splash_route
插件创建带有启动动画的页面切换效果。
示例代码
import 'package:flutter/material.dart';
import 'package:splash_route/splash_route.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Splash Route',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.green,
),
home: const MyHomePage(title: 'Splash Route'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
// 定义跳转到下一页的方法
void _goToNextPage(
BuildContext context,
FractionalOffset position,
Color splashColor,
Duration duration,
) {
Navigator.of(context).push(
SplashRoute(
targetPage: TargetPage(
appBarColor: splashColor, // 设置目标页面的AppBar颜色
),
splashColor: splashColor, // 设置启动动画的颜色
startFractionalOffset: position, // 设置动画起始位置
transitionDuration: duration, // 设置动画持续时间
),
);
}
// 定义按钮组件
Widget _goNextButton(
BuildContext context,
FractionalOffset position,
Color splashColor,
Duration duration,
) {
return InkWell(
onTap: () => _goToNextPage(
context,
position,
splashColor,
duration,
),
child: Container(
height: 50,
width: 50,
decoration: BoxDecoration(
shape: BoxShape.circle, // 圆形按钮
color: splashColor, // 按钮背景色
),
child: const Center(
child: Icon(
Icons.arrow_forward, // 按钮内的图标
color: Colors.white, // 图标颜色
),
),
),
);
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
centerTitle: true, // 居中标题
),
body: Stack(
children: [
// 中心按钮
Center(
child: _goNextButton(
context,
FractionalOffset.center, // 中心位置
Colors.blue, // 蓝色
const Duration(milliseconds: 2000), // 动画持续2秒
),
),
// 右下角按钮
Positioned(
bottom: 20,
right: 20,
child: _goNextButton(
context,
FractionalOffset.bottomRight, // 右下角位置
const Color.fromARGB(255, 121, 71, 6), // 棕色
const Duration(milliseconds: 1500), // 动画持续1.5秒
),
),
// 左下角按钮
Positioned(
bottom: 20,
left: 20,
child: _goNextButton(
context,
FractionalOffset.bottomLeft, // 左下角位置
Colors.orange, // 橙色
const Duration(milliseconds: 1500), // 动画持续1.5秒
),
),
// 右上角按钮
Positioned(
top: 20,
right: 20,
child: _goNextButton(
context,
const FractionalOffset(0.9, 0.2), // 右上角位置
Colors.red, // 红色
const Duration(milliseconds: 1500), // 动画持续1.5秒
),
),
// 左上角按钮
Positioned(
top: 20,
left: 20,
child: _goNextButton(
context,
const FractionalOffset(0.1, 0.2), // 左上角位置
Colors.purple, // 紫色
const Duration(milliseconds: 1500), // 动画持续1.5秒
),
),
],
),
);
}
}
// 目标页面
class TargetPage extends StatelessWidget {
final Color appBarColor;
const TargetPage({Key? key, required this.appBarColor}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Target Page'),
backgroundColor: appBarColor, // 使用传入的颜色作为AppBar背景色
),
body: const Center(
child: Text('This is the target page!'),
),
);
}
}
更多关于Flutter启动页路由插件splash_route的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter启动页路由插件splash_route的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用splash_route
插件来实现启动页路由的示例代码。splash_route
插件可以帮助你在Flutter应用中更方便地管理启动页及其路由逻辑。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加splash_route
依赖:
dependencies:
flutter:
sdk: flutter
splash_route: ^最新版本号 # 请替换为实际最新版本号
然后运行flutter pub get
来安装依赖。
2. 配置启动页路由
接下来,你需要配置你的启动页路由。这里假设你有一个SplashScreen
和一个HomePage
。
示例代码
import 'package:flutter/material.dart';
import 'package:splash_route/splash_route.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Splash Route Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
// 使用SplashRouteBuilder来配置启动页和路由
builder: SplashRouteBuilder(
splash: SplashScreenWidget(), // 启动页Widget
routes: {
'/': (context) => HomePage(), // 主页路由
'/other': (context) => OtherPage(), // 其他页面路由
},
navigatorBuilders: {
'/': (context, state) => Navigator(
key: state.navigatorKey,
onGenerateRoute: (settings) {
switch (settings.name) {
case '/':
return MaterialPageRoute(builder: (context) => HomePage());
case '/other':
return MaterialPageRoute(builder: (context) => OtherPage());
default:
return null;
}
},
),
},
splashDuration: 3000, // 启动页显示时长(毫秒)
onSplashComplete: (context, state) {
// 启动页完成后跳转的路由,默认为'/'
Navigator.pushReplacementNamed(context, '/');
},
),
);
}
}
// 启动页Widget
class SplashScreenWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Image.asset('assets/splash.png'), // 启动页图片
Text(
'Loading...',
style: TextStyle(fontSize: 24),
),
],
),
),
);
}
}
// 主页
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home Page'),
),
body: Center(
child: Text('Welcome to Home Page!'),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.pushNamed(context, '/other');
},
tooltip: 'Go to Other Page',
child: Icon(Icons.navigate_next),
),
);
}
}
// 其他页面
class OtherPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Other Page'),
),
body: Center(
child: Text('Welcome to Other Page!'),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.pop(context);
},
tooltip: 'Go Back',
child: Icon(Icons.arrow_back),
),
);
}
}
3. 运行应用
确保你已经有一个assets/splash.png
的图片文件作为启动页的背景图。然后运行你的Flutter应用,你应该会看到启动页在指定的时间内显示,然后跳转到主页。
这个示例展示了如何使用splash_route
插件来配置启动页和后续的页面路由。你可以根据项目的具体需求进一步定制和扩展。