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),
)
相关推荐
爱滑雪的码农23 分钟前
详细说说React大型项目结构以及日常开发核心语法
前端·javascript·react.js
七牛开发者1 小时前
HTML is the new Markdown:来自 Claude Code 团队的实践
前端·人工智能·语言模型·html
@大迁世界1 小时前
43.HTML 事件处理和 React 事件处理有什么区别?
前端·javascript·react.js·html·ecmascript
CloneCello1 小时前
AI时代程序员认知调整指南
前端
ZC跨境爬虫2 小时前
跟着 MDN 学 HTML day_38:(DocumentFragment 文档片段接口详解)
前端·javascript·ui·html·音视频
@大迁世界3 小时前
41.ShadCN 是什么?它如何和 Tailwind CSS 集成,从而更容易构建可访问且可自定义的 React 组件?
前端·javascript·css·react.js·前端框架
千叶风行3 小时前
Text-to-SQL 技术设计与注意事项
前端·人工智能·后端
软件开发技术深度爱好者4 小时前
HTML5+JavaScript读取DOCX 文档完整内容
前端·html5
90后的晨仔4 小时前
SwiftUI高级特性之高级主题系统设计与实现
ios
90后的晨仔4 小时前
swiftUI 手势完全指南:让你的界面学会“倾听”
ios