Flutter路由管理插件flutter_router_forzzh的使用

Flutter路由管理插件flutter_router_forzzh的使用

前言:

在Flutter开发中,很多时候需要你的页面像Android中的Activity/Fragment一样具备生命周期的特性,以便进行懒加载以提升部分性能和用户体验。然而,在Flutter中,StatelessWidgetStatefulWidget 并不具备检测页面是否运行在前台、后台或被销毁的功能。尽管StatefulWidget中有销毁时的dispose()回调,但这对于检查前后台状态来说仍然不够。因此,我们引入了flutter_router_forzzh插件,它可以让StatelessWidgetStatefulWidget具备类似Android中Activity/Fragment的onResumeonPauseonDestroy生命周期。

该库已经将原来的页面跳转工具和生命周期功能独立拆开,不再耦合,可以分别使用。

pubspec.yaml 依赖

dependencies:
  flutter_router_forzzh: ^0.0.6

导包

import 'package:flutter_router_forzzh/router_lib.dart';

功能1:路由功能实现界面跳转

顶层定义router方便全局使用

RouterProxy router = RouterProxy.getInstance(
    routePathCallBack: (routeInformation) {
      /// 自定义的动态路由 跳转
      if (routeInformation.location == 'TaoBaoPageDetail1') {
        return TaoBaoPageDetail();
      }
    },
    pageMap: {
      '/': const Login(),
      'TaoBaoPageDetail':  TaoBaoPageDetail(),
    },
    exitStyleCallBack: (context) {
      return _confirmExit(context);
    }
);

MaterialApp.router 注册RouterProxy

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp.router(
      title: 'router_lifecycle',
      debugShowCheckedModeBanner: false,
      routerDelegate: router, // 绑定路由跳转工具
      routeInformationParser: router.defaultParser(), // 路由解析器, 可自定义传入
    );
  }
}

// 页面的跳转使用 router.push(); router.pushNamed()等
// 页面的关闭使用 router.pop();

功能2:对需要监听生命周期的页面做任务

StatefulWidget页面

StatelessWidget页面

class Login extends StatelessWidget {
  const Login({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return LifeCycle(
      onCreate: () {
        print("--------Login onCreate");
      },
      onStart: () {
        print("--------Login onStart");
      },
      onResume: () {
        print("--------Login onResume");
      },
      onPause: () {
        print("--------Login onPause");
      },
      onDestroy: () {
        print("--------Login onDestroy");
      },
      child: Scaffold(
        body: Stack(
          children: [
            Container(
              constraints: const BoxConstraints.expand(),
              padding: const EdgeInsets.symmetric(horizontal: 16),
              child: Column(
                mainAxisSize: MainAxisSize.min,
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      const SizedBox(
                        width: 16,
                      ),
                      ElevatedButton(
                        style: ElevatedButton.styleFrom(
                          primary: Theme.of(context).primaryColor,
                          shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(4.0),
                          ),
                          side: BorderSide(
                              color: Theme.of(context).primaryColor),
                        ),
                        onPressed: () {},
                        child: const Text(
                          '注册',
                          style: TextStyle(color: Colors.white),
                        ),
                      ),
                      const SizedBox(
                        width: 16,
                      ),
                      ElevatedButton(
                        style: ElevatedButton.styleFrom(
                          primary: Colors.white,
                          shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(4.0),
                          ),
                          side: const BorderSide(color: Colors.black),
                        ),
                        onPressed: () {
                          router.push(page: NavPage());
                        },
                        child: const Text('登录', style: TextStyle(color: Colors.black),),
                      ),
                      const SizedBox(
                        width: 16,
                      ),
                    ],
                  ),
                ],
              ),
            ),
          ],
        )
      ),
    );
  }
}

其他注意事项

  1. exitStyleCallBack 可自定义退出程序提示框。
  2. 在Web端,如果需要支持浏览器直接跳转访问某页面,需要自定义 routeInformationParser 并继承 RouteParser 类作为解析器。

效果展示

效果

完整示例Demo

import 'package:flutter/material.dart';
import 'package:flutter_router_forzzh/router_lib.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp.router(
      title: 'router_lifecycle',
      debugShowCheckedModeBanner: false,
      routerDelegate: router,
      routeInformationParser: router.defaultParser(),
    );
  }
}

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

1 回复

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


flutter_router_forzzh 是一个用于 Flutter 应用的路由管理插件,它提供了一种简单且灵活的方式来管理应用中的页面导航。以下是如何使用 flutter_router_forzzh 插件的基本步骤:

1. 添加依赖

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

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

然后运行 flutter pub get 来获取依赖。

2. 初始化路由器

在你的 main.dart 文件中,初始化路由器并定义路由表。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Router Example',
      // 初始化路由器
      onGenerateRoute: Router.generateRoute,
      initialRoute: '/',
    );
  }
}

3. 定义路由表

在你的 router.dart 文件中,定义路由表和相应的页面。

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

class Router {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    switch (settings.name) {
      case '/':
        return MaterialPageRoute(builder: (_) => HomePage());
      case '/details':
        return MaterialPageRoute(builder: (_) => DetailsPage());
      default:
        return MaterialPageRoute(
          builder: (_) => Scaffold(
            body: Center(
              child: Text('No route defined for ${settings.name}'),
            ),
          ),
        );
    }
  }
}

class HomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 导航到详情页
            Navigator.pushNamed(context, '/details');
          },
          child: Text('Go to Details'),
        ),
      ),
    );
  }
}

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

4. 使用路由导航

在你的应用中,你可以使用 Navigator.pushNamed 方法来导航到不同的页面。例如:

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

你也可以使用 Navigator.pop 方法返回到上一个页面。

5. 传递参数

如果你需要传递参数到下一个页面,可以在 Navigator.pushNamed 方法中传递参数,并在目标页面中获取这些参数。

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

在目标页面中,你可以通过 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;

    return Scaffold(
      appBar: AppBar(
        title: Text('Details'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('ID: ${args['id']}'),
            Text('Name: ${args['name']}'),
            ElevatedButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: Text('Go back'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部