Flutter路由管理插件baserouter的使用

Flutter路由管理插件baserouter的使用

baserouter 是一个用于管理 Flutter 应用路由的新包。通过使用 baserouter,您可以更方便地管理应用内的页面跳转和状态传递。

开始使用

此项目是一个 Dart 包的起点,可用于多个 Flutter 或 Dart 项目的共享代码库。对于如何开始使用 Flutter,您可以查看我们的在线文档,其中包含教程、示例、移动开发指南以及完整的 API 参考。

完整示例代码

以下是一个使用 baserouter 的完整示例代码,展示如何在 Flutter 应用中实现页面跳转和数据传递。

import 'package:baserouter/baserouter.dart';
import 'package:example/second_screen.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  // 这个小部件是你的应用的根。
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter 示例',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BaseContainerEntry(
          entry: MyHomePage(
        title: 'Sas',
      )),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '你已经点击了按钮这么多次:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => {
          // 使用 route 方法添加到路由栈中
          route(context).addToStack(Second()),
          // 使用 bridge 方法加载数据
          bridge(context).load('First Data', 'Saaftal', String)
        },
        tooltip: '增加计数',
        child: Icon(Icons.add),
      ),
    );
  }
}

代码解释

  1. 导入包

    import 'package:baserouter/baserouter.dart';
    import 'package:example/second_screen.dart';
    import 'package:flutter/material.dart';
    
  2. 主入口点

    void main() {
      runApp(MyApp());
    }
    
  3. 创建 Material App

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter 示例',
          debugShowCheckedModeBanner: false,
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: BaseContainerEntry(
              entry: MyHomePage(
            title: 'Sas',
          )),
        );
      }
    }
    
  4. 定义首页

    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
      final String title;
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
  5. 实现首页状态

    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void _incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  '你已经点击了按钮这么多次:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.headline4,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () => {
              route(context).addToStack(Second()),
              bridge(context).load('First Data', 'Saaftal', String)
            },
            tooltip: '增加计数',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    

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

1 回复

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


BaseRouter 是一个基于 Flutter 的路由管理插件,旨在简化路由的配置和跳转。它提供了一种声明式的方式来定义路由,并支持路由拦截、参数传递、嵌套路由等功能。下面是一个简单的使用指南,帮助你快速上手 BaseRouter

1. 添加依赖

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

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

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

2. 定义路由

接下来,你需要在项目中定义路由。你可以通过继承 BaseRouter 类来创建自定义的路由管理器。

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

class MyAppRouter extends BaseRouter {
  MyAppRouter() : super();

  [@override](/user/override)
  Map<String, WidgetBuilder> get routes => {
        '/': (context) => HomePage(),
        '/details': (context) => DetailsPage(),
        '/settings': (context) => SettingsPage(),
      };
}

在这个例子中,我们定义了一个 MyAppRouter 类,并重写了 routes 方法,返回一个包含路由路径和对应页面的 Map

3. 使用路由

在你的 main.dart 文件中,使用 MaterialAppCupertinoApp 来初始化路由管理器。

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

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

class MyApp extends StatelessWidget {
  final MyAppRouter _router = MyAppRouter();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      onGenerateRoute: _router.generator,
      initialRoute: '/',
    );
  }
}

在这里,onGenerateRoute 属性被设置为 _router.generator,这样 Flutter 就会使用 BaseRouter 来管理路由。

4. 路由跳转

你可以使用 Navigator.pushNamedBaseRouter 提供的方法来进行路由跳转。

Navigator.pushNamed(context, '/details');

如果你需要传递参数,可以使用 arguments 参数:

Navigator.pushNamed(context, '/details', arguments: {'id': 123});

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

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

    return Scaffold(
      appBar: AppBar(
        title: Text('Details Page'),
      ),
      body: Center(
        child: Text('Details for item $id'),
      ),
    );
  }
}

5. 路由拦截

BaseRouter 还支持路由拦截功能。你可以通过重写 onBeforeRoute 方法来实现自定义的路由拦截逻辑。

class MyAppRouter extends BaseRouter {
  MyAppRouter() : super();

  [@override](/user/override)
  Map<String, WidgetBuilder> get routes => {
        '/': (context) => HomePage(),
        '/details': (context) => DetailsPage(),
        '/settings': (context) => SettingsPage(),
      };

  [@override](/user/override)
  FutureOr<bool> onBeforeRoute(String routeName, BuildContext context) async {
    if (routeName == '/settings') {
      // 检查用户是否登录
      bool isLoggedIn = await checkIfUserIsLoggedIn();
      if (!isLoggedIn) {
        Navigator.pushNamed(context, '/login');
        return false; // 阻止路由跳转
      }
    }
    return true; // 允许路由跳转
  }

  Future<bool> checkIfUserIsLoggedIn() async {
    // 模拟检查用户登录状态
    await Future.delayed(Duration(seconds: 1));
    return false;
  }
}

在这个例子中,当用户尝试访问 /settings 页面时,会先检查用户是否已登录。如果未登录,则跳转到登录页面,并阻止原始路由的跳转。

6. 嵌套路由

BaseRouter 还支持嵌套路由,你可以在一个页面中定义子路由。

class MyAppRouter extends BaseRouter {
  MyAppRouter() : super();

  [@override](/user/override)
  Map<String, WidgetBuilder> get routes => {
        '/': (context) => HomePage(),
        '/details': (context) => DetailsPage(),
        '/settings': (context) => SettingsPage(),
        '/profile': (context) => ProfilePage(),
      };

  [@override](/user/override)
  Map<String, WidgetBuilder> get nestedRoutes => {
        '/profile': {
          '/edit': (context) => EditProfilePage(),
          '/security': (context) => SecurityPage(),
        },
      };
}

在这个例子中,/profile 页面有两个子路由:/edit/security。你可以在 ProfilePage 中使用 Navigator.pushNamed 来跳转到这些子路由。

7. 路由监听

BaseRouter 还提供了路由监听功能,你可以在路由发生变化时执行一些操作。

class MyAppRouter extends BaseRouter {
  MyAppRouter() : super();

  [@override](/user/override)
  Map<String, WidgetBuilder> get routes => {
        '/': (context) => HomePage(),
        '/details': (context) => DetailsPage(),
        '/settings': (context) => SettingsPage(),
      };

  [@override](/user/override)
  void onRouteChanged(String routeName, BuildContext context) {
    print('Route changed to: $routeName');
  }
}
回到顶部