Flutter页面协调路由插件coordinated_page_route的使用

Flutter页面协调路由插件coordinated_page_route的使用

coordinated_page_route 是一个用于 Flutter 的 Dart 包,它允许在页面过渡时同时动画化前一个路由和新进入的路由。

特性

  • 允许完全自定义的动画效果,使得前一个页面和新页面之间的过渡能够同步。
  • 该包还包含一些示例,以覆盖一些常见的使用场景。

SlidingPushRoute

抽象类,表示新进入的页面会通过滑动方式将之前的页面推出。子类必须指定初始偏移量,这决定了进入页面的初始位置。退出页面会动画到与该偏移量相反的位置。这种效果在至少有一个方向(dx 或 dy)的绝对值为 1 时表现得特别好,以确保页面始终接触。

该包内置了四个实现,分别针对四个主要方向:

  • ForwardPushRoute
  • BackwardPushRoute
  • UpwardPushRoute
  • DownwardPushRoute

SlidingFadePushRoute

几乎与 SlidingPushRoute 相同,但增加了进入页面的淡入效果和退出页面的淡出效果。

同样有四个实现,分别对应四个方向:

  • ForwardFadePushRoute
  • BackwardFadePushRoute
  • UpwardFadePushRoute
  • DownwardFadePushRoute

CoordinatedZoomFadeRoute

一种更视觉上有趣的全自定义过渡效果。退出页面逐渐扩大并淡出,而进入页面则从小尺寸开始扩大并淡入。由于这种过渡是透明的,应该使用透明页面,并且导航器应放置在不透明背景上。

开始使用

请参阅 示例

使用方法

要在任何希望使用协调动画的 Navigator 中使用 CoordinatedPageRoute,你必须在 NavigatorObserver 列表中包含一个 CoordinatedRouteObserver

对于 MaterialApp,代码如下:

MaterialApp(
  navigatorObservers: 
  [
    CoordinatedRouteObserver() // 这里必须添加!
  ]
)

对于独立的 Navigator,代码如下:

Navigator(
  observers: 
  [
    CoordinatedRouteObserver() // 这里必须添加!
  ]
)

然后像往常一样推送你的路由:

Navigator.of(context).push(ForwardPushRoute((context) => MyPage())),

要创建自己的动画过渡,只需扩展 CoordinatedPageRoute 基类并实现以下方法:

  • getEntryTransition:一个函数,接收 BuildContextAnimation 和子 Widget,返回变换后的 Widget。这直接传递给 PageRouteBuildertransitionsBuilder,你应该对此比较熟悉。
  • getExitTransition:类似于 entryTransitionBuilder,但在实践中,BuildContext 将是 NavigatorBuildContext,而子 Widget 将从上一个路由捕获(或更具体地说,从包含上一个路由构建的页面的叠加层条目的 Widget)。

因为两个构建器都访问了从进入路由的 PageRouteBuilder 传递下来的相同 animation,所以动画是同步的。

额外信息

更多详细信息,请参阅 pub.dev


示例代码

import 'package:coordinated_page_route/coordinated_page_route.dart';
import 'package:example/src/on_generate_route.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

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

class MaterialAppExample extends StatelessWidget {
  const MaterialAppExample({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      color: Colors.black,
      child: MaterialApp(
        navigatorObservers: [
          CoordinatedRouteObserver() // 这里必须添加!
        ],
        initialRoute: 'home',
        onGenerateRoute: onGenerateRoute,
      ),
    );
  }
}

class NavigatorExample extends StatelessWidget {
  const NavigatorExample({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Navigator(
      observers: [
        CoordinatedRouteObserver() // 这里必须添加!
      ],
      initialRoute: 'home',
      onGenerateRoute: onGenerateRoute,
    ));
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用coordinated_page_route插件的一个基本示例。coordinated_page_route插件允许你在Flutter应用中协调页面路由和状态管理,使得页面之间的数据传递和状态同步更加便捷。

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

dependencies:
  flutter:
    sdk: flutter
  coordinated_page_route: ^最新版本号  # 请替换为最新的版本号

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

接下来,我们将展示如何使用coordinated_page_route进行页面路由和状态协调。

1. 创建一个简单的Flutter应用

假设我们有一个简单的Flutter应用,其中有两个页面:HomePageDetailPage

主文件:main.dart

import 'package:flutter/material.dart';
import 'package:coordinated_page_route/coordinated_page_route.dart';
import 'home_page.dart';
import 'detail_page.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CoordinatorLayout(
        // 定义协调器,用于管理状态
        coordinator: Coordinator(),
        child: HomePage(),
      ),
      routes: {
        '/detail': (context) => CoordinatorLayout(
          coordinator: context.coordinator, // 使用相同的coordinator实例
          child: DetailPage(),
        ),
      },
    );
  }
}

主页:home_page.dart

import 'package:flutter/material.dart';
import 'package:coordinated_page_route/coordinated_page_route.dart';
import 'detail_page.dart';

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final coordinator = context.coordinator;

    return Scaffold(
      appBar: AppBar(
        title: Text('Home Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 传递数据到DetailPage
            coordinator.navigate(
              context,
              '/detail',
              arguments: {'data': 'Hello from Home Page!'},
            );
          },
          child: Text('Go to Detail Page'),
        ),
      ),
    );
  }
}

详情页:detail_page.dart

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

class DetailPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final coordinator = context.coordinator;
    final routeArguments = coordinator.routeArguments<Map<String, String>>(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('Detail Page'),
      ),
      body: Center(
        child: Text(routeArguments?['data'] ?? 'No data provided'),
      ),
    );
  }
}

2. 运行应用

现在,当你运行这个Flutter应用时,你应该能够看到HomePage,点击按钮后会导航到DetailPage,并显示从HomePage传递过来的数据。

关键点总结

  • 使用CoordinatorLayoutcoordinator来管理路由和状态协调。
  • 使用coordinator.navigate进行页面导航,并传递数据。
  • 使用coordinator.routeArguments在目标页面中获取传递的数据。

这个示例展示了如何使用coordinated_page_route插件进行基本的页面协调和状态管理。根据你的具体需求,你可以进一步扩展和自定义这些功能。

回到顶部