flutter 路由配置

get用法

  • 进入新页面
    Get.to(NextScreen());
  • back回退操作

使用场景: 关闭Dialogs、SnackBars或者退出当前页面

Get.back();

  • off类似于replace操作

它会替拿当新页面换掉当前页面,并且新页面左上角没有返回按钮,

Get.off(NextScreen());

  • offAll清空历史路由

该方法会清空我们之前打开过的页面,只留下新的页面

Get.offAll(NextScreen());

  • 接收新返回信息
    var data = await Get.to(Payment());

别名路由导航

// toNamed 导航到下一个页面

Get.toNamed("/NextScreen");
// 浏览并删除前一个页面

Get.offNamed("/NextScreen");
// 浏览并删除所有以前的页面

Get.offAllNamed("/NextScreen")

别名路由需要配置

这里的配置下方的动态路由配置类似,如果麻烦可以用下方的动态路由

复制代码
目录 router/index.dart
import 'package:flutter/material.dart';
import 'package:shuiagechen/pages/login/index.dart';
import 'package:shuiagechen/pages/toolbar.dart';
import 'package:shuiagechen/splash.dart';
// 路由
class GlobalRouter{
  /// 路由
  /// 从非toolbar页面(子页面)跳转到toolbar页面(主页)实现:
  /// pushName到对应的路由,因为Toolbar是单例模式,所以只会创建一个
  /// pushName之后,在ToolBar,initState中获取当前的路由,实现切换页面
  static final _routes={
    // 过渡页
    "/":(BuildContext context,{Object? args})=>const SplashPage(),
    /// 主页面
    '/home': (BuildContext context, { Object? args}) => const Toolbar(),
    // 登录页
    '/login':(BuildContext context,{Object? args})=> login(),
  };
  static GlobalRouter? _singleton;
   GlobalRouter._internal();
    factory GlobalRouter() {
    return _singleton??GlobalRouter._internal();
  }
   /// 监听route
  Route? getRoutes(RouteSettings settings) {
    String? routeName = settings.name;
    final Function builder = GlobalRouter._routes[routeName] as Function;
    return MaterialPageRoute(
        settings: settings,
        builder: (BuildContext context) => builder(context, args: settings.arguments)
    );
  }
}

mian.dart中引入
GetMaterialApp(
             key: navigatorKey,
            title: 'APP模板',
            // 不显示debug标签
            debugShowCheckedModeBanner: false,
            initialRoute: '/',
            onGenerateRoute: router.getRoutes,
          )
		  这样就可以在使用的页面使用别名路由跳转页面了
		  Get.offNamed("/login"); //跳转到登录页

路由传参数

  • arguments传参
  • 问号传参(跟URL地址一样)
  • 动态路由(/:xxx)

发送任何参数都可以接收,不论是什么类型!甚至是类的实例!

Get.toNamed("/NextScreen", arguments: '这是一个字符串参数');

  • 接收参数
    print(Get.arguments); // out: 这是一个字符串参数

问号参数

  • 只能接收字符串
    Get.offAllNamed("/NextScreen?device=phone&id=111&name=liang");
  • 通过Get.parameters获取值
    print(Get.parameters'id'); // out: 111

动态路由

咱们在配置表中配置动态路由,他是通过Get.parameters接收

复制代码
void main() {
  runApp(
    GetMaterialApp(
      initialRoute: '/',
      getPages: [
      GetPage(
        name: '/',
        page: () => MyHomePage(),
      ),
      GetPage(
        name: '/profile/', // 没值匹配就写 / 在后面
        page: () => MyProfile(),
      ),
      GetPage(
        name: '/profile/:user', // 如果有值 /:xxx 在后面
        page: () => UserProfile(),
      ),
      GetPage(
        name: '/third',
        page: () => Third(),
        transition: Transition.cupertino  
      ),
     ],
    )
  );
}
  • 发送别名路由数据:

    Get.toNamed("/profile/34954");

    // 在第二个页面上,通过参数获取数据
    print(Get.parameters['user']);
    // out: 34954

混合发送参数:

复制代码
Get.toNamed("/profile/34954?flag=true");

// 在第二个页面上,通过参数获取数据
print(Get.parameters['user']);
print(Get.parameters['flag']);
// out: 34954 true

中间件

  • 触发路由事件的时候,会回调GetMaterialApp里的一个回调方法routingCallback

    GetMaterialApp(
    routingCallback: (routing) {
    if(routing.current == '/user') {
    openAds();
    }
    }
    )

  • 如果没有使用GetMaterialApp,那么可以使用API来附加Middleware观察器。

    void main() {
    runApp(
    MaterialApp(
    onGenerateRoute: Router.generateRoute,
    initialRoute: "/",
    navigatorKey: Get.key,
    navigatorObservers: [ // 基于这个来观察路由变化
    GetObserver(MiddleWare.observer), // HERE !!!
    ],
    ),
    );
    }

三、免context导航

复制代码
final snackBar = SnackBar(
  content: Text('Hi!'),
  action: SnackBarAction(
    label: 'I am a old and ugly snackbar :(',
    onPressed: (){}
  ),
);
// 在小组件树中找到脚手架并使用它显示一个SnackBars。
Scaffold.of(context).showSnackBar(snackBar);
Get.snackbar('Hi', 'i am a modern snackbar');

// 定制你的需求,随处可使用
Get.snackbar(
  "Hey i'm a Get SnackBar!", // title
  "It's unbelievable! I'm using SnackBar without context, without boilerplate, without Scaffold, it is something truly amazing!", // message
  icon: Icon(Icons.alarm),
  shouldIconPulse: true,
  onTap:(){},
  barBlur: 20,
  isDismissible: true,
  duration: Duration(seconds: 3),
);


// 定制一个 Dialog
Get.dialog(YourDialogWidget());

Get的路由嵌套非常简单,不需要context而是通过id寻找导航栈

复制代码
Navigator(
  key: Get.nestedKey(1), // 创建一个key
  initialRoute: '/',
  onGenerateRoute: (settings) {
    if (settings.name == '/') {
      return GetPageRoute(
        page: () => Scaffold(
          appBar: AppBar(
            title: Text("Main"),
          ),
          body: Center(
            child: TextButton(
              color: Colors.blue,
              onPressed: () {
                Get.toNamed('/second', id:1); // 按照key以及路由来路径来导航,如果没找到会报错
              },
              child: Text("Go to second"),
            ),
          ),
        ),
      );
    } else if (settings.name == '/second') {
      return GetPageRoute(
        page: () => Center(
          child: Scaffold(
            appBar: AppBar(
              title: Text("Main"),
            ),
            body: Center(
              child:  Text("second")
            ),
          ),
        ),
      );
    }
  }
),

GetMaterialApp的常用配置

复制代码
void main() {
  runApp(
    GetMaterialApp(
      // 初始路径
      initialRoute: '/',
      
      // 404页面
      unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()),

      // 中间件
      routingCallback: (routing) {
        if(routing.current == '/user') {
          openAds();
        }
      },
      
      // 路由配置表
      getPages: [
        GetPage(name: '/', page: () => MyHomePage()),
        GetPage(name: '/second', page: () => Second()),
      ],
    )
  );
}
相关推荐
wgc2k11 小时前
Nest.js 基础-8-Hello,NestJS
开发语言·javascript·ecmascript
Larcher11 小时前
从 0 到 1:用 Bun + axios 快速搭建 LLM API 客户端
前端·javascript
子午12 小时前
基于DeepSeek的酒店客房管理系统~Python+DeepSeek智能问答+Vue3+Web网站系统
开发语言·前端·python
bkspiderx12 小时前
Boa Web服务器HTTPS支持的源码改造方案
服务器·前端·https·web服务器·boa·https支持
贺今宵12 小时前
Vue 3 + Capacitor 使用jeep-sqlite,web端使用本地sqlite数据库
前端·数据库·vue.js·sqlite·web
taocarts_bidfans12 小时前
Google Indexing API 外贸独立站主动推送收录实战开发
前端·独立站·外贸独立站·taoify
lichenyang45312 小时前
鸿蒙 Stage 模型到底是什么?一篇讲清 Ability、EntryAbility 和入口文件为什么这么设计
前端
JSMSEMI1112 小时前
JSM12N60C 600V N沟道增强型功率MOSFET
开发语言·javascript·ecmascript
brycegao12 小时前
Flutter Dart JSON 解析必坑!金额精度丢失为什么必须在网络层处理?附工业级解决方案
flutter·dart
ihuyigui12 小时前
国际商超零售短信接口
大数据·前端·后端·架构·零售