Flutter单页路由管理插件singel_page_route的使用

Flutter单页路由管理插件singel_page_route的使用

single_page_route 是一个用于管理所有小部件的单页路由插件。例如,如果你在每个页面都需要调用 AppBar,使用 single_page_route,你可以在主页面 MasterPage 中仅调用一次 AppBar。另一个优点是你不需要重定向页面,即使这些页面之间存在一些相似性。

开始使用

首先,你需要将 single_page_route 添加到你的项目中:

flutter pub add single_page_route

示例代码

以下是一个完整的示例代码,展示了如何使用 single_page_route 插件。

主文件 (main.dart)

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

import 'package:flutter/services.dart';
import 'package:single_page_route/single_page_route.dart';

const HOME = "HOME";
const SEARCH = "SEARCH";

var routes = {
  HOME: const Home(),
  SEARCH: const Search()
};

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MasterRoom(),
    );
  }
}

class MasterRoom extends StatefulWidget {
  const MasterRoom({Key? key}) : super(key: key);

  [@override](/user/override)
  _MasterRoomState createState() => _MasterRoomState();
}

class _MasterRoomState extends State<MasterRoom> {
  late Widget view;
  late StreamSubscription _subscription;

  [@override](/user/override)
  void initState() {
    super.initState();

    SinglePageRoute.initSinglePageRoute(HOME, routes);

    if (!SinglePageRoute.histories.isNotEmpty) {
      SinglePageRoute.pushNamedWithoutTrigger(HOME);
      view = SinglePageRoute.current;
    } else {
      SinglePageRoute.pushNamedWithoutTrigger(SinglePageRoute.currentName);
      view = SinglePageRoute.current;
    }

    _subscription = SinglePageRoute.listen((data) {
      setState(() {
        view = data;
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return SafeArea(
        child: Scaffold(
          appBar: AppBar(
            title: const Text("EXAMPLE SINGLE ROUTE"),
            leading: SinglePageRoute.histories.length > 1 ? IconButton(
              icon: const Icon(Icons.arrow_back),
              onPressed: () {
                SinglePageRoute.previous();
              },
            ) : null,
          ),
          body: view,
        )
    );
  }
}

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  [@override](/user/override)
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: FlatButton(
          color: Colors.blue,
          child: const Text(
            "Go To Search",
            style: TextStyle(
                color: Colors.white
            ),
          ),
          onPressed: () {
            SinglePageRoute.pushAndReplaceName(SEARCH);
          },
        ),
      ),
    );
  }
}

class Search extends StatefulWidget {
  const Search({Key? key}) : super(key: key);

  [@override](/user/override)
  _SearchState createState() => _SearchState();
}

class _SearchState extends State<Search> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
        child: Center(
          child: MaterialButton(
            color: Colors.blue,
            child: const Text(
              "Back to home",
              style: TextStyle(
                  color: Colors.white
              ),
            ),
            onPressed: () {
              SinglePageRoute.pushName(HOME);
            },
          ),
        )
    );
  }
}

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

1 回复

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


single_page_route 是一个用于 Flutter 的单页路由管理插件,它可以帮助你更轻松地管理单页应用中的路由。使用这个插件,你可以避免在应用中引入复杂的多页路由管理,从而简化代码结构。

1. 安装插件

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

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

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

2. 基本使用

2.1 创建路由管理器

在你的应用中,首先需要创建一个路由管理器来管理单页路由:

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

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

class MyApp extends StatelessWidget {
  final RouteManager routeManager = RouteManager();

  MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SinglePageRoute(
        routeManager: routeManager,
        initialPage: HomePage(),
      ),
    );
  }
}

2.2 定义页面

你可以定义多个页面,每个页面都是一个 Widget

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 导航到另一个页面
            SinglePageRoute.of(context)?.push(SecondPage());
          },
          child: Text('Go to Second Page'),
        ),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 返回到上一个页面
            SinglePageRoute.of(context)?.pop();
          },
          child: Text('Go Back'),
        ),
      ),
    );
  }
}

2.3 导航操作

你可以使用 SinglePageRoute.of(context) 来获取当前的路由管理器,并进行页面导航:

// 导航到新页面
SinglePageRoute.of(context)?.push(SecondPage());

// 返回到上一个页面
SinglePageRoute.of(context)?.pop();

3. 高级功能

3.1 页面切换动画

你可以自定义页面切换动画,通过 SinglePageRoutetransitionsBuilder 参数:

SinglePageRoute(
  routeManager: routeManager,
  initialPage: HomePage(),
  transitionsBuilder: (context, animation, secondaryAnimation, child) {
    return SlideTransition(
      position: Tween<Offset>(
        begin: const Offset(1.0, 0.0),
        end: Offset.zero,
      ).animate(animation),
      child: child,
    );
  },
);

3.2 页面生命周期

你可以通过 RouteManager 监听页面的生命周期事件,例如页面进入和退出:

routeManager.addListener((event) {
  if (event is RoutePushedEvent) {
    print('Page pushed: ${event.page}');
  } else if (event is RoutePoppedEvent) {
    print('Page popped: ${event.page}');
  }
});
回到顶部