Flutter第十七节-----路由管理(3)
一.路由管理-动态路由与高级控制●场景更复杂的场景如需根据参数动态生成页面或实现路由拦截可以使用onGenerateRoute和onUnknownRoute。●onGenerateRoute:允许你根据RouteSettings(包含路由名称和参数)动态创建不同的Route代码实例import package:flutter/material.dart; import package:flutter/widgets.dart; void main(ListString args) { runApp(Mainpage()); } class Mainpage extends StatelessWidget { const Mainpage({Key? key}) : super(key: key); override Widget build(BuildContext context) { return MaterialApp( initialRoute: /goodsList, routes: {/goodsList: (context) GoodsList()}, onGenerateRoute: (settings) { print(settings.name); if (settings.name /cardList) { bool isLogin true; if (isLogin) { return MaterialPageRoute(builder: (context) cardList()); } else { return MaterialPageRoute(builder: (context) Loginpage()); } } }, ); } } class GoodsList extends StatefulWidget { GoodsList({Key? key}) : super(key: key); override _GoodsListState createState() _GoodsListState(); } class _GoodsListState extends StateGoodsList { override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(商品列表)), body: Center( child: TextButton( onPressed: () { Navigator.pushNamed(context, /cardList); }, child: Text(加入购物车), ), ), ); } } class cardList extends StatefulWidget { cardList({Key? key}) : super(key: key); override _cardListState createState() _cardListState(); } class _cardListState extends StatecardList { override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(购物车列表)), body: Center( child: TextButton(onPressed: () {}, child: Text(去支付)), ), ); } } class Loginpage extends StatefulWidget { Loginpage({Key? key}) : super(key: key); override _LoginpageState createState() _LoginpageState(); } class _LoginpageState extends StateLoginpage { override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(登录页面)), body: Center( child: TextButton(onPressed: () {}, child: Text(去登录)), ), ); } }》当isLogin为false时》二.404页面●onUnknownRoute:跳转一个未在路由表中注册、也未在onGenerateRoute中处理的路由会调用此回调。通常显示404页面import package:flutter/material.dart; import package:flutter/widgets.dart; void main(ListString args) { runApp(Mainpage()); } class Mainpage extends StatelessWidget { const Mainpage({Key? key}) : super(key: key); override Widget build(BuildContext context) { return MaterialApp( initialRoute: /goodsList, routes: {/goodsList: (context) GoodsList()}, onGenerateRoute: (settings) { print(settings.name); if (settings.name /cardList) { bool isLogin false; if (isLogin) { return MaterialPageRoute(builder: (context) cardList()); } else { return MaterialPageRoute(builder: (context) Loginpage()); } } }, onUnknownRoute: (settings) { return MaterialPageRoute(builder: (context) NotFound()); }, ); } } class GoodsList extends StatefulWidget { GoodsList({Key? key}) : super(key: key); override _GoodsListState createState() _GoodsListState(); } class _GoodsListState extends StateGoodsList { override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(商品列表)), body: Center( child: TextButton( onPressed: () { Navigator.pushNamed(context, /abc); }, child: Text(加入购物车), ), ), ); } } class cardList extends StatefulWidget { cardList({Key? key}) : super(key: key); override _cardListState createState() _cardListState(); } class _cardListState extends StatecardList { override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(购物车列表)), body: Center( child: TextButton(onPressed: () {}, child: Text(去支付)), ), ); } } class Loginpage extends StatefulWidget { Loginpage({Key? key}) : super(key: key); override _LoginpageState createState() _LoginpageState(); } class _LoginpageState extends StateLoginpage { override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(登录页面)), body: Center( child: TextButton(onPressed: () {}, child: Text(去登录)), ), ); } } class NotFound extends StatefulWidget { NotFound({Key? key}) : super(key: key); override _NotFoundState createState() _NotFoundState(); } class _NotFoundState extends StateNotFound { override Widget build(BuildContext context) { return Container( child: Center( child: Image.asset(lib/image/1.png, width: 300, height: 400), ), ); } }现在我们点击按钮跳转到了一个随便写的不存在的地址abc当中则会加载我们的图片正常业务中图片显示404》