flutter路由之flutro配置

flutter路由之flutro

原文地址

我这里使用的是fluro作为路由框架,下面是配置步骤。

依赖安装
yaml 复制代码
# 版本为 2.0.5
fluro: ^2.0.5
路由配置

在项目中新建 routes 文件夹,分别下面新建以下文件。

dart 复制代码
// application.dart
import 'package:fluro/fluro.dart';

// 创建 fluro 实例,用于处理后续的逻辑
class Application {
  static late final FluroRouter router;
}
dart 复制代码
// routes.dart
import 'package:flutter/material.dart';
import 'package:fluro/fluro.dart';

// 需要配置的页面
import 'package:test_drive/pages/home.dart';
import 'package:test_drive/pages/mine.dart';
import 'package:test_drive/pages/listview.dart';

// 页面实例,可以配置传参
var _homeHandler = Handler(
    handlerFunc: (BuildContext? context, Map<String, List<String>> params) {
  return const HomaPage();
});
var _mineHandler = Handler(
    handlerFunc: (BuildContext? context, Map<String, List<String>> params) {
  return const MinePage();
});

var _listviewHandler = Handler(
    handlerFunc: (BuildContext? context, Map<String, List<String>> params) {
  return const ListViewPage();
});

class Routes {

  // 页面路由地址,后面会使用到(路由跳转)
  static String home = '/';
  static String mine = '/mine';
  static String listview = '/listview';

  static void configureRoutes(FluroRouter router) {
    router.notFoundHandler = Handler(
        handlerFunc: (BuildContext? context, Map<String, List<String>> params) {
      return;
    });

    // 生成配置实例
    router.define(home, handler: _homeHandler);
    router.define(mine, handler: _mineHandler);
    router.define(listview, handler: _listviewHandler);
  }
}

上面的配置做好以后,我们再项目入口函数 main.dart 里面,进行如下配置

dart 复制代码
// main.dart
import 'package:fluro/fluro.dart';
import 'package:flutter/material.dart';

import 'package:test_drive/routes/application.dart';
import 'package:test_drive/routes/navigator_util.dart';
import 'package:test_drive/routes/routes.dart';

void main() {
  runApp(const MyApp());
}

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // 挂载路由
  @override
  void initState() {
    super.initState();
    final router = FluroRouter();
    Application.router = router;
    Routes.configureRoutes(router);
  }

  @override
  Widget build(BuildContext context) {
    final app = MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.amber,
      ),
      onGenerateRoute: Application.router.generator, //全局注册
      navigatorKey: navigatorKey,
    );
    return app;
  }
}

新增 navigator_util.dart 工具类

dart 复制代码
import 'package:fluro/fluro.dart';
import 'package:flutter/material.dart';
import 'package:test_drive/routes/application.dart';

final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

class NavigatorUtil {
  static void push(
    String path, {
    bool replace = false, // 替换当前页面
    bool clearStack = false, // 是否清空路由栈
    Object? arguments,
    TransitionType? transition, // 页面进入动效
  }) {
    Application.router.navigateTo(
      navigatorKey.currentContext!,
      path,
      replace: replace,
      clearStack: clearStack,
      transition: transition ?? TransitionType.native,
      routeSettings: RouteSettings(
        arguments: arguments,
      ),
    );
  }

  static void replase(String path,
      {bool replase = true, bool clearStack = false, Object? arguments}) {
    Application.router.navigateTo(navigatorKey.currentContext!, path,
        replace: replase,
        clearStack: clearStack,
        transition: TransitionType.native,
        routeSettings: RouteSettings(arguments: arguments));
  }

  static void switchTab(String path,
      {bool replase = true, bool clearStack = true, Object? arguments}) {
    Application.router.navigateTo(navigatorKey.currentContext!, path,
        replace: replase,
        clearStack: clearStack,
        transition: TransitionType.native,
        routeSettings: RouteSettings(arguments: arguments));
  }

  static void back({int count = 1, Object? params}) {
    NavigatorState state = Navigator.of(navigatorKey.currentContext!);
    while (count-- > 0) {
      state = state..pop(params);
    }
  }
}
使用

在页面中使用, 示例如下:

dart 复制代码
ElevatedButton.icon(
    onPressed: () {
        NavigatorUtil.push("/listview"); // 需要跳转的页面
    },
    label: const Text("列表加载"),
    icon: const Icon(Icons.nat_outlined),
)
相关推荐
东风破_6 小时前
danci 项目(三):从 JSON 数据到 AI Coding,真实项目里的数据清洗、Prompt 和工程规范
前端·后端·node.js
y = xⁿ6 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
东风破_7 小时前
danci 项目(一):从需求到架构,一个单词学习系统为什么会这样设计
前端·后端·node.js
蒲公英eric7 小时前
从客户端到服务端:DVWA DOM 型 XSS 模块完整漏洞分析教程
前端·web安全·ai·xss·dvwa·ai安全
单线程_017 小时前
从案例分析 Vue3 Tokenizer+Parser 源码三
前端·javascript·vue.js
顶点多余8 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
Setsuna_F_Seiei8 小时前
前端转型 Agent 开发 03 之 Agent Tools - 给 Agent 装上手脚
前端·agent·ai编程
jay神8 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
2601_962066499 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
小磊哥er9 小时前
深入解构Claude Code - 第 8 篇 · 数据放哪、钱怎么算
javascript·ai编程