首页 > 其他分享 >26、Flutter中命名路由

26、Flutter中命名路由

时间:2023-12-25 15:01:44浏览次数:45  
标签:26 const arguments context return contxt Flutter 路由

Flutter 中的命名路由

main.dart中配置路由

void main() {
  runApp(MaterialApp(
    theme: ThemeData(
      appBarTheme: const AppBarTheme(
        color: Colors.blue, // 设置导航栏颜色 (新版本的设置方法)
      ),
    ),
    // home: Scaffold(body: MyFlutter1())
    initialRoute: "/", //初始化路由
    routes: {
      "/": (contxt) => const MyFlutter1(),
      "/form": (contxt) => const FormPage(),
      // "/news": (contxt)=>const SearchMyApp(),
      "/news": (contxt) {
        return const SearchMyApp();
      }, //类似
    },
  ));
}

跳转路由

class TimePag extends StatefulWidget {
  const TimePag({super.key});

  @override
  State<TimePag> createState() => _TimePagState();
}
class _TimePagState extends State<TimePag> {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        ElevatedButton(
            onPressed: () {
              Navigator.pushNamed(context, "/news"); //命名路由跳转
            },
            child: const Text("命名路由跳转"))
      ],
    );
  }
}

Flutter 中的命名路由传值

配置onGenerateRoute

class MyApp1 extends StatelessWidget {
  //1.配置路由
  Map routes = {
    "/": (contxt) => const MyFlutter1(),
    "/form": (contxt) => const FormPage(),
    // "/news": (contxt)=>const SearchMyApp(),
    "/news": (contxt, {arguments}) {
      return SearchMyApp(arguments: arguments); //命名路由传参
    }, //类似
  };
  MyApp1({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        appBarTheme: const AppBarTheme(
          color: Colors.blue, // 设置导航栏颜色 (新版本的设置方法)
        ),
      ),
      // home: Scaffold(body: MyFlutter1())
      initialRoute: "/", //初始化路由
      //2、调用onGenerateRoute处理(固定写法)
      onGenerateRoute: (RouteSettings settings) {
        // 统一处理
        final String? name = settings.name; //获取命名路由的名称
        final Function? pageContentBuilder = routes[name];
        if (pageContentBuilder != null) {
          if (settings.arguments != null) {
            final Route route = MaterialPageRoute(
                builder: (context) =>
                    pageContentBuilder(context, arguments: settings.arguments));
            return route;
          } else {
            final Route route = MaterialPageRoute(
                builder: (context) => pageContentBuilder(context));
            return route;
          }
        }
        return null;
      },
    );
  }
}

定义页面接收arguments传参

//其他页面跳转到本页面进行传参
class SearchMyApp extends StatefulWidget {

  final Map arguments;

 const  SearchMyApp({super.key,required this.arguments});  //必须传入

  @override
  State<SearchMyApp> createState() => _SearchMyAppState();
}

class _SearchMyAppState extends State<SearchMyApp> {

  @override
  void initState() {
    super.initState();
    print(widget.arguments);  //参数
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("新闻页面"),
      ),
      body: Center(child: Text("内容")),
    );
  }
}

跳转页面实现传参

class TimePag extends StatefulWidget {
  const TimePag({super.key});

  @override
  State<TimePag> createState() => _TimePagState();
}

class _TimePagState extends State<TimePag> {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        ElevatedButton(
            onPressed: () {
              Navigator.pushNamed(context, "/news",
                  arguments: {"title": "我是命名路由传的值", "id": 5}); //命名路由跳转
            },
            child: const Text("命名路由跳转传值"))
      ],
    );
  }
}

Flutter 中的命名路由单独抽离到一个文件

新建routers/routers.dart 配置路由

import 'package:app_flutter01/pages/form.dart';
import 'package:app_flutter01/pages/news.dart';
import 'package:app_flutter01/pages/tabs.dart';
import 'package:flutter/material.dart';


  //1.配置路由
  Map routes = {
    "/": (contxt) => const MyFlutter1(),
    "/form": (contxt) => const FormPage(),
    // "/news": (contxt)=>const SearchMyApp(),
    "/news": (contxt, {arguments}) {
      return SearchMyApp(arguments: arguments); //命名路由传参
    }, //类似
  };

// onGenerateRoute处理(固定写法)  这个方法也相当于一个中间件,这里可以做权限判断
  var onGenerateRoute = (RouteSettings settings) {
        // 统一处理
        final String? name = settings.name; //获取命名路由的名称
        final Function? pageContentBuilder = routes[name];
        if (pageContentBuilder != null) {
          if (settings.arguments != null) {
            final Route route = MaterialPageRoute(
                builder: (context) =>
                    pageContentBuilder(context, arguments: settings.arguments));
            return route;
          } else {
            final Route route = MaterialPageRoute(
                builder: (context) => pageContentBuilder(context));
            return route;
          }
        }
        return null;
      };

修改main.dart

class MyApp1 extends StatelessWidget {
  MyApp1({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        appBarTheme: const AppBarTheme(
          color: Colors.blue, // 设置导航栏颜色 (新版本的设置方法)
        ),
      ),
      // home: Scaffold(body: MyFlutter1())
      initialRoute: "/", //初始化路由
      //2、调用onGenerateRoute处理(固定写法)
      onGenerateRoute: onGenerateRoute,
    );
  }
}

实现页面跳转传值

class TimePag extends StatefulWidget {
  const TimePag({super.key});

  @override
  State<TimePag> createState() => _TimePagState();
}

class _TimePagState extends State<TimePag> {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        ElevatedButton(
            onPressed: () {
              Navigator.pushNamed(context, "/news",
                  arguments: {"title": "我是命名路由传的值", "id": 5}); //命名路由跳转
            },
            child: const Text("命名路由跳转传值"))
      ],
    );
  }
}
Flutter 返回上一级路由
Navigator.of(context).pop();

Flutter 中替换路由

比如我们从用户中心页面跳转到了registerFirst页面,然后从registerFirst页面通过 pushReplacementNamed跳转到了registerSecond页面。这个时候当我们点击registerSecond的返回 按钮的时候它会直接返回到用户中心。
Navigator.of(context).pushReplacementNamed('/registerSecond');

Flutter 返回到根路由

比如我们从用户中心跳转到registerFirst页面,然后从registerFirst页面跳转到registerSecond页面,然 后从registerSecond跳转到了registerThird页面。这个时候我们想的是registerThird注册成功后返回到 用户中心。 这个时候就用到了返回到根路由的方法。
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (BuildContext context) {
return const Tabs();
}), (route) => false);

Flutter Android 和Ios使用同样风格的路由跳转

Material组件库中提供了一个MaterialPageRoute组件,它可以使用和平台风格一致的路由切换动画, 如在iOS上会左右滑动切换,而在Android上会上下滑动切换 , CupertinoPageRoute是Cupertino组件 库提供的iOS风格的路由切换组件如果在Android上也想使用左右切换风格,可以使用 CupertinoPageRoute。
import 'package:app_flutter01/pages/form.dart';
import 'package:app_flutter01/pages/news.dart';
import 'package:app_flutter01/pages/tabs.dart';
import 'package:flutter/material.dart';

//配置ios fen
import 'package:flutter/cupertino.dart';

/**
 配置ios风格的路由
1、删掉material.dart引入
cupertino.dartimport 'package:flutter/cupertino.dart';
2、把MaterialPageRoute替换成CupertinoPageRoute
 */

//1.配置路由
Map routes = {
  "/": (contxt) => const MyFlutter1(),
  "/form": (contxt) => const FormPage(),
  "/time": (contxt) => const MyFlutter1(),

  // "/news": (contxt)=>const SearchMyApp(),
  "/news": (contxt, {arguments}) {
    return SearchMyApp(arguments: arguments); //命名路由传参
  }, //类似
};

// onGenerateRoute处理(固定写法)  这个方法也相当于一个中间件,这里可以做权限判断
var onGenerateRoute = (RouteSettings settings) {
  // 统一处理
  final String? name = settings.name; //获取命名路由的名称
  final Function? pageContentBuilder = routes[name];
  if (pageContentBuilder != null) {
    if (settings.arguments != null) {
      // final Route route = MaterialPageRoute(  //路由效果
      final Route route = CupertinoPageRoute(
          builder: (context) =>
              pageContentBuilder(context, arguments: settings.arguments));
      return route;
    } else {
      final Route route =
          MaterialPageRoute(builder: (context) => pageContentBuilder(context));
      return route;
    }
  }
  return null;
};

全局配置主题

return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
appBarTheme: const AppBarTheme(
centerTitle: true,  //标题居中
)
),
initialRoute: "/",
onGenerateRoute: onGenerateRoute,
);

 

 

 

 

标签:26,const,arguments,context,return,contxt,Flutter,路由
From: https://www.cnblogs.com/xbinbin/p/17877931.html

相关文章

  • 25、Flutter中基本路由
    Flutter路由介绍Flutter中的路由通俗的讲就是页面跳转。在Flutter中通过Navigator组件管理路由导航。并提供了管理堆栈的方法。如:Navigator.push和Navigator.popFlutter中给我们提供了两种配置路由跳转的方式:1、基本路由2、命名路由Flutter中的基本路由使用想从HomePage......
  • flutter中背景图片(动态图片)
    单页面设置背景图片使用 Container 组件和 decoration 属性:优点:简单易用,适用于大多数情况下的页面背景设置。缺点:无法控制背景图片的位置和层级。classMyBookextendsStatelessWidget{constMyBook({super.key});@overrideWidgetbuild(BuildContextcontex......
  • VUE框架CLI组件化配置全局Router路由实现前置守卫鉴权效果------VUE框架
    //导入vue-router对象importVueRouterfrom"vue-router";importHebeifrom"../pages/hebei.vue";importHenanfrom"../pages/henan.vue";importCityfrom"../pages/city.vue";//创建路由器对象(在这个路由器对象中配置路由)constrouter=ne......
  • Flutter中 关于package:flutter/cupertino.dart和package:flutter/material.dart的区
    import'package:flutter/cupertino.dart';和import'package:flutter/material.dart';这两个语句分别用于导入Flutter框架中的不同部分,而且它们通常用于创建不同风格的用户界面。1.import'package:flutter/material.dart';:这是导入Material部分的语句,Material是一种设计......
  • flutter 桌面通知 气泡消息数量
    先上效果原理Android操作系统提供的NotificationManager接口来设置应用程序图标上的徽章iOS操作系统提供的UIApplication.shared.applicationIconBadgeNumber使用flutterflutterpubaddflutter_app_badger通过在启动退出时候更新气泡import'package......
  • 2023-2024-1 20231326《计算机基础与程序设计》第十三周学习总结
    2023-2024-120231326《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2022-2023-1计算机基础与程序设计第X周作业这个作业的目标《C语言程序设计》第十二章作业正文https://www.cn......
  • [ABC265F] Manhattan Cafe 题解
    [ABC265F]ManhattanCafe题解思路解析很有思维难度的一道题。思路是dp,\(f[i][j][k]\)表示已经计算了\(i\)维,距离点\(p\)的距离为\(j\),距离点\(q\)的距离为\(k\)时的整点\(r\)个数,由此可见我们的每一维都可以从上一维推出来,也即\(f[i][j][k]\)可以由\(f[i-1][j......
  • java 判断某个英文字母在26个英文字母的哪个位置
    判断某个英文字母在26个英文字母的哪个位置介绍在Java中,我们可以通过一些简单的操作来判断一个英文字母在26个英文字母中的位置。在本文中,我们将详细介绍如何实现这一功能,并提供相应的代码示例。实现步骤以下是判断某个英文字母在26个英文字母中位置的步骤:将字母转换为小写字......
  • 使用office打开word文档时候提示错误:0x426-0x0的解决方案
    在使用office打开word文档时候提示错误:0x426-0x0。如下图:昨天还用的好好的,怎么今天就不行了?为什么呢?这个错误导致office无法启动通常是由于office软件所依赖的服务无法正常运行导致。为什么会无法启动呢?突然想到,凯哥昨天手贱,昨天电脑重启时候,提示有需要优化的启动项,于是在wind+R,运......
  • 学期:2023-2024-1 学号:20231426 《计算机基础与程序设计》第十三周学习总结
    作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里2022-2023-1计算机基础与程序设计作业这个作业的目标通过教材内容了解结构体作业正文https://www.cnblogs.com/hhaxx/p/17923969.html教材学习内容总结《计算科学概论》......