Flutter第十七节-----路由管理(3)

一.路由管理-动态路由与高级控制

●场景:更复杂的场景,如需根据参数动态生成页面,或实现路由拦截,可以使用onGenerateRoute和onUnknownRoute。

●onGenerateRoute:允许你根据RouteSettings(包含路由名称和参数)动态创建不同的Route

代码实例:

Dart 复制代码
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';

void main(List<String> 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 State<GoodsList> {
  @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 State<cardList> {
  @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 State<Loginpage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("登录页面")),
      body: Center(
        child: TextButton(onPressed: () {}, child: Text('去登录')),
      ),
    );
  }
}

==========》

当isLogin为false时:

==========》

二.404页面

●onUnknownRoute::跳转一个未在路由表中注册、也未在onGenerateRoute中处理的路由,会调用此回调。通常显示"404"页面

Dart 复制代码
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';

void main(List<String> 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 State<GoodsList> {
  @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 State<cardList> {
  @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 State<Loginpage> {
  @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 State<NotFound> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: Image.asset("lib/image/1.png", width: 300, height: 400),
      ),
    );
  }
}

现在我们点击按钮跳转到了一个随便写的不存在的地址abc当中,则会加载我们的图片(正常业务中图片显示404):

============》

相关推荐
qz_Serene6 分钟前
C++:类和对象(上)
开发语言·c++
西安景驰电子34 分钟前
《PTP精确时间协议系列》第一篇:从原理到应用,全面解读IEEE 1588
linux·运维·服务器·开发语言·网络·windows·php
Android-Flutter35 分钟前
android 动画详解
android·kotlin
ctlover1 小时前
Python文件操作
开发语言·python
luj_17681 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
ZJU_统一阿萨姆1 小时前
【DSH】如何将 DeepSeek Harness 嵌入生产环境?万字解构 DeepSeek Agent Harness 的运行机制与安全边界
前端·javascript·安全
用户921080262861 小时前
4. 前端地图大量点位实时更新优化:后端推增量,前端做 diff
前端
wuyk5551 小时前
3.链表:用指针串联的动态数据结构
c语言·开发语言·数据结构·链表
SoaringHeart1 小时前
Flutter最佳实践:Web项目中文字体首次加载乱码问题解决
前端·flutter
程序员老刘1 小时前
Flutter 3.47 更新要点:Material 正式分家,老项目先别急着更新
flutter·ai编程·客户端