Flutter路由管理插件sunny_fluro的使用

(基于)最亮、最时髦、最酷的Flutter路由管理器。

最大的变化是引入了(可选的)类型化路由参数。你仍然可以使用URL进行解析和路由,但也可以通过复杂的类型化参数加载路由。

为了减少样板代码,类型化路由系统包含了一个代码生成器。

版本 构建状态 覆盖率

版本 1.6.0 需要 Flutter >= 1.12.0 和 Dart >= 2.6.0。如果你使用的Flutter版本较旧,请使用版本 < 1.6.0

功能

  • 简单的路由导航
  • 函数处理器(将函数映射到处理器而不是路由)
  • 通配符参数匹配
  • 查询字符串参数解析
  • 内置常见过渡效果
  • 简单自定义过渡效果创建

版本兼容性

查看CHANGELOG以了解所有破坏性和非破坏性更改。

开始使用

你应该确保在你的Flutter项目中将路由器作为依赖项添加。

dependencies:
  sunny_fluro: "^1.6.0"

如果你想直接引用git仓库,也可以这样做:

dependencies:
  sunny_fluro:
    git: git://github.com/SunnyApp/fluro.git

然后运行 flutter packages upgrade 或在IntelliJ中更新包。

示例项目

example 文件夹中有一个相当不错的示例项目。查看它。否则,继续阅读以快速上手。

设置

首先,你应该通过初始化一个新的 Router 对象来定义一个 Router 对象:

final router = Router();

对你来说,将路由器存储为全局/静态可能很方便,这样你可以在应用程序的其他部分访问路由器。

实例化路由器后,你需要定义你的路由和路由处理器:

var usersHandler = Handler(handlerFunc: (BuildContext context, Map<String, dynamic> params) {
  return UsersScreen(params["id"][0]);
});

void defineRoutes(Router router) {
  router.define("/users/:id", handler: usersHandler);

  // 你还可以定义路由过渡效果
  // router.define("users/:id", handler: usersHandler, transitionType: TransitionType.inFromLeft);
}

在上面的例子中,路由器会拦截像 /users/1234 这样的路由,并将应用程序路由到 UsersScreen,并将值 1234 作为参数传递给该屏幕。

导航

你可以通过 MaterialApp.onGenerateRoute 参数使用 Router,方法是通过 Router.generator 函数。为此,将函数引用传递给 onGenerate 参数,例如:onGenerateRoute: router.generator

然后你可以使用 Navigator.push,并且Flutter的路由机制会为你匹配路由。

你还可以手动推送到路由。要做到这一点:

router.navigateTo(context, "/users/1234", transition: TransitionType.fadeIn);

Fluro 是Yakka原创。

示例代码

以下是完整的示例代码:

/*
 * fluro
 * Created by Yakka
 * https://theyakka.com
 * 
 * Copyright (c) 2019 Yakka, LLC. All rights reserved.
 * See LICENSE for distribution and usage details.
 */
import 'package:flutter/material.dart';

import 'components/app/app_component.dart';

void main() {
  runApp(AppComponent());
}

解释

  1. 导入必要的库

    import 'package:flutter/material.dart';
    

    导入Flutter的基本库。

  2. 定义主应用组件

    void main() {
      runApp(AppComponent());
    }
    

    运行 AppComponent 作为应用程序的根组件。

  3. 运行应用程序

    runApp(AppComponent());

更多关于Flutter路由管理插件sunny_fluro的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter路由管理插件sunny_fluro的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


sunny_fluro 是一个基于 Fluro 的 Flutter 路由管理插件,它提供了更简洁的 API 和更强大的功能来管理 Flutter 应用中的路由。Fluro 本身是一个流行的 Flutter 路由库,而 sunny_fluro 在此基础上进行了封装和优化,使得路由管理更加方便。

1. 安装 sunny_fluro

首先,你需要在 pubspec.yaml 文件中添加 sunny_fluro 依赖:

dependencies:
  flutter:
    sdk: flutter
  sunny_fluro: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 初始化 sunny_fluro

在你的 Flutter 应用中,首先需要初始化 sunny_fluro。通常,你可以在 main.dart 文件中进行初始化。

import 'package:flutter/material.dart';
import 'package:sunny_fluro/sunny_fluro.dart';

void main() {
  // 初始化 SunnyFluro
  SunnyFluro.initialize();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Fluro Example',
      // 使用 SunnyFluro 的路由生成器
      onGenerateRoute: SunnyFluro.router.generator,
      initialRoute: '/',
    );
  }
}

3. 定义路由

接下来,你需要定义应用中的路由。你可以使用 SunnyFluro.define 方法来定义路由。

import 'package:flutter/material.dart';
import 'package:sunny_fluro/sunny_fluro.dart';

class HomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 导航到详情页
            SunnyFluro.navigateTo(context, '/detail', transition: TransitionType.fadeIn);
          },
          child: Text('Go to Detail'),
        ),
      ),
    );
  }
}

class DetailPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Detail Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 返回上一页
            Navigator.pop(context);
          },
          child: Text('Go Back'),
        ),
      ),
    );
  }
}

void defineRoutes() {
  SunnyFluro.define(
    '/',
    handler: Handler(
      handlerFunc: (BuildContext? context, Map<String, dynamic> params) {
        return HomePage();
      },
    ),
  );

  SunnyFluro.define(
    '/detail',
    handler: Handler(
      handlerFunc: (BuildContext? context, Map<String, dynamic> params) {
        return DetailPage();
      },
    ),
  );
}

void main() {
  SunnyFluro.initialize();
  defineRoutes();  // 定义路由

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Fluro Example',
      onGenerateRoute: SunnyFluro.router.generator,
      initialRoute: '/',
    );
  }
}

4. 导航到其他页面

你可以使用 SunnyFluro.navigateTo 方法来导航到其他页面。这个方法支持传递参数和自定义转场动画。

SunnyFluro.navigateTo(
  context,
  '/detail',
  transition: TransitionType.fadeIn,  // 自定义转场动画
  routeSettings: RouteSettings(arguments: {'id': 123}),  // 传递参数
);

5. 处理路由参数

在目标页面中,你可以通过 ModalRoute.of(context)!.settings.arguments 来获取传递的参数。

class DetailPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final Map<String, dynamic> args = ModalRoute.of(context)!.settings.arguments as Map<String, dynamic>;
    final int id = args['id'];

    return Scaffold(
      appBar: AppBar(
        title: Text('Detail Page - $id'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text('Go Back'),
        ),
      ),
    );
  }
}
回到顶部