cruiser 2.1.0 cruiser: ^2.1.0 copied to clipboard
Cruiser is a fully featured router library for Flutter applications.
import 'dart:math';
import 'package:cruiser/cruiser.dart';
import 'package:cruiser_example/example_args.dart';
import 'package:cruiser_example/utils/color_converter.dart';
import 'package:cruiser_example/utils/cruiser_transition_extensions.dart';
import 'package:flutter/material.dart';
const colors = [
Colors.blue,
Colors.green,
Colors.purple,
Colors.orange,
Colors.pink,
Colors.amber,
Colors.cyan
];
const routeName = '/example';
//const routeNameSecond = '/second-example';
final router = Cruiser();
final random = Random();
//bool isSecondRoute = false;
void main() {
router.addRoute(CruiserRoute(
name: routeName, builder: (context, args) => ExamplePage(args: args)));
// router.addRoute(CruiserRoute(name: routeNameSecond, builder: (context, args) => SecondExamplePage(args: args)));
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Cruiser Example',
initialRoute: routeName,
navigatorKey: router.navigatorKey,
onGenerateRoute: router.generator,
navigatorObservers: [router.observer],
);
}
}
class SecondExamplePage extends ExamplePage {
final ExampleArgs args;
SecondExamplePage({@required this.args}) : super(args: args);
@override
ExamplePageState createState() => new ExamplePageState();
}
class ExamplePage extends StatefulWidget {
final ExampleArgs args;
ExamplePage({@required this.args});
@override
ExamplePageState createState() => new ExamplePageState();
}
class ExamplePageState extends State<ExamplePage> {
Color nextColor;
TransitionType nextTransition;
@override
void initState() {
super.initState();
nextColor = _getNextColor(widget.args?.color);
nextTransition = _getNextTransition(widget.args?.transition);
}
@override
Widget build(BuildContext context) {
return WillPopScope(
child: Scaffold(
resizeToAvoidBottomInset: true,
body: DefaultTextStyle(
style: TextStyle(fontSize: 16, color: Colors.white),
child: Container(
color: widget.args?.color ?? Colors.white,
child: SafeArea(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ExampleButton(
text:
'${nextTransition.name}', // '${isSecondRoute ? 'Second': 'First'}
color: ColorConverter.darken(
widget.args?.color ?? Colors.blue, 0.1),
onPressed: () async => await _toNextRoute(context))
]))),
))),
onWillPop: () async {
router.pop();
return Future.value(false);
});
}
Future _toNextRoute(BuildContext context) async {
await router.navigate(routeName,
transition: nextTransition,
args: ExampleArgs(color: nextColor, transition: nextTransition));
}
TransitionType _getNextTransition(TransitionType previousTransition) {
if (previousTransition == null) return TransitionType.values[0];
var index = TransitionType.values.indexOf(previousTransition) + 1;
return TransitionType
.values[index < TransitionType.values.length ? index : 0];
}
Color _getNextColor(Color previousColor) {
var available = previousColor != null
? colors.where((x) => x != previousColor).toList()
: colors;
return available[random.nextInt(available.length)];
}
}
class ExampleButton extends StatelessWidget {
final VoidCallback onPressed;
final String text;
final Color color;
ExampleButton({this.text, this.onPressed, this.color});
@override
Widget build(BuildContext context) {
return ButtonTheme(
height: 47,
padding: EdgeInsets.symmetric(horizontal: 25),
child: FlatButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(4.0),
),
color: color,
textColor: Colors.white,
onPressed: onPressed,
child: Text(text, style: TextStyle(fontSize: 14))));
}
}