首页 > 其他分享 >Flutter 定义局部路由 Navigator

Flutter 定义局部路由 Navigator

时间:2024-03-01 14:48:55浏览次数:21  
标签:settings 局部 BuildContext context Navigator Flutter 路由

Flutter 中,通常我们使用 Navigator 来管理全局的页面路由,在整个应用中维护一个路由堆栈。但是,有些情况下你可能需要一个局部路由,也就是在应用的某个部分内部维护一个独立的路由堆栈,而不影响全局路由。为了实现这一点,你可以在你的应用中创建一个新的 Navigator
局部路由简单使用

  1. 代码
import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(home: AppHome()));
}

class AppHome extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('局部 Navigator 示例')),
      body: Container(
        // 给局部路由设置一个唯一的 key
        child: Navigator(
          key: GlobalKey<NavigatorState>(),
          // 定义局部路由的页面
          onGenerateRoute: (RouteSettings settings) {
            WidgetBuilder builder;
            switch (settings.name) {
              case '/':
                builder = (BuildContext context) => FirstScreen();
                break;
              case '/second':
                builder = (BuildContext context) => SecondScreen();
                break;
              default:
                throw Exception('Invalid route: ${settings.name}');
            }
            return MaterialPageRoute(builder: builder, settings: settings);
          },
        ),
      ),
    );
  }
}

class FirstScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        child: Text('打开第二页'),
        onPressed: () {
          // 使用局部 Navigator 进行页面跳转
          Navigator.of(context).pushNamed('/second');
        },
      ),
    );
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('第二页')),
      body: Center(
        child: ElevatedButton(
          child: Text('返回第一页'),
          onPressed: () {
            // 使用局部 Navigator 返回到上一页
            Navigator.of(context).pop();
          },
        ),
      ),
    );
  }
}
  1. 效果
  • 第一页效果
  • 点击第二页效果

标签:settings,局部,BuildContext,context,Navigator,Flutter,路由
From: https://www.cnblogs.com/sqmw/p/18047003

相关文章

  • Taurus.MVC WebMVC 入门开发教程6:路由配置与路由映射
    前言:在本篇Taurus.MVCWebMVC入门开发教程的第六篇文章中,我们将讨论如何配置路由并映射到控制器和操作方法。路由是决定应用程序如何响应客户端请求的重要组成部分,因此在Web开发中非常重要。我们将继续使用Taurus.Mvc命名空间,并探讨如何在应用程序中配置路由。步骤1:了......
  • Isolate线程通信 flutter
    A、B互传消息A、B都创建自己的接收端口和发送端口A将自己的发送端口发送给对面B,B才能拿到A的发送端口,给A发送消息A监听自己的接收端口,拿到B发给自己的消息B监听自己的接收端口,拿到A发给自己的消息voidfunction_main()async{print("当前线程:"+Isolate.current.debu......
  • Vue Router系列之(一)路由
    路由1.SPA应用单页Web应用(singlepagewebapplication,SPA)。整个应用只有一个完整的页面(index.html)。点击页面中的导航链接不会刷新页面,页面不会跳转,只会做页面的局部更新。数据需要通过ajax请求获取。注:多页面应用,多个页面来回跳来跳去2.什么是路由?一个路由(route......
  • Vue Router系列之(四)嵌套路由
    嵌套(多级)路由展示区中包含了新的导航区和展示区配置路由规则,使用children配置项:routes:[ //routes中直接配置的是一级路由 { path:'/about', component:About, }, { path:'/home', component:Home, children:[//通过children配置子级路由 { path:'n......
  • Vue Router系列之(七)路由的props配置项
    路由的props配置项​ 路由组件读取其他组件传递的参数时,是通过$route.params.id这种方式读取的,$route.params部分代码冗余度高,如何能够降低这种冗余?props配置项可以做到​ 作用:让路由组件更方便的收到参数{ name:'xiangqing', path:'detail/:id', component:Detail,/......
  • Vue Router系列之(六)命名路由
    命名路由命名路由:给你的路由规则起个名字作用:可以简化路由的跳转【路由层级比较多时】。如何使用给路由规则命名:{ path:'/demo', component:Demo, children:[ { path:'test', component:Test, children:[ {name:'hello'//通......
  • Vue Router系列之(五)路由传参
    路由传参如何给路由组件传递参数点击导航区的时候将数据带给路由组件,展示区根据数据渲染组件,渲染的都是同一个组件,只不过数据不同路由组件可以接收两种参数:query参数和params参数这两种参数的写法与Ajax中query参数和params参数的写法是一样的1.query参数传递参数<!--......
  • Vue Router系列之(十)缓存路由组件
    缓存路由组件完善路由的技巧作用:让不展示的路由组件保持挂载,不被销毁。​ 正常情况下,进行了路由跳转后,之前的组件会被销毁,如果之前的组件中存在input框之类的表单类组件,输入的内容也就消失了,也就是说,要保证路由跳转后不销毁之前的组件具体编码://缓存的对象:并不是所有路......
  • Vue Router系列之(九)编程式路由导航
    编程式路由导航作用:不借助<router-link>实现路由跳转,让路由跳转更加灵活。为什么需要除了<router-link>标签之外实现路由跳转的方式?<router-link>标签最后变为<a>标签,无法实现button按钮的跳转触发路由跳转可能需要异步触发,<router-link>标签也无法实现具体编码://$ro......
  • Vue Router系列之(十二)路由守卫
    路由守卫作用:对路由进行权限控制,满足一定条件才能看到跳转到的路由组件分类:全局守卫、独享守卫、组件内守卫全局守卫://src/router/index.js//router:我们创建的路由器实例//router.beforeEach(function):每一次进行路由跳转之前都会帮我们调用我们传入的函数//全......