Flutter路由管理插件route_pilot的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter路由管理插件route_pilot的使用

RoutePilot 是一个强大的Flutter包,它简化了在您的Flutter应用中的导航和URL处理。它提供了一个易于使用的界面来在屏幕之间导航、启动URL以及处理各种系统意图,如拨打电话或发送电子邮件。

目录

  1. 功能
  2. 安装
  3. 使用
  4. API参考
  5. 配置
  6. 示例
  7. 许可证

功能

  • 简单直观的导航API
  • 自定义页面过渡
  • URL启动(浏览器、内置浏览器、WebView)
  • 拨打电话
  • 发送短信
  • 编写邮件
  • 在路由之间传递参数

安装

pubspec.yaml文件中添加route_pilot依赖:

dependencies:
  route_pilot: ^0.0.3

然后运行:

flutter pub get

使用

设置

为了使用RoutePilot,需要在MaterialApp中设置navigatorKeyonGenerateRoute

import 'package:flutter/material.dart';
import 'package:route_pilot/route_pilot.dart';
import 'package:your_app/routes/pilot_pages.dart';
import 'package:your_app/routes/pilot_routes.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'RoutePilot Demo',
      navigatorKey: routePilot.navigatorKey,
      onGenerateRoute: (settings) {
        final page = PilotPages.onGenerateRoute(settings);
        return page.createRoute(context);
      },
      initialRoute: PilotRoutes.Home,
    );
  }
}

定义你的路由:

abstract class PilotRoutes {
  static const String Home = '/';
  static const String ScreenOne = '/screen_one';
  static const String ScreenTwo = '/screen_two';
  static const String ScreenThree = '/screen_three';
  static const String ScreenFour = '/screen_four';
}

设置你的PilotPages

import 'package:flutter/material.dart';
import 'package:route_pilot/route_pilot.dart';
import 'package:your_app/screens/home_screen.dart';
import 'package:your_app/screens/screen_one.dart';
// 导入其他屏幕...

class PilotPages {
  static PilotPage onGenerateRoute(RouteSettings settings) {
    switch (settings.name) {
      case PilotRoutes.Home:
        return PilotPage(
          name: PilotRoutes.Home,
          page: (context) => HomeScreen(),
          transition: Transition.ios,
        );
      case PilotRoutes.ScreenOne:
        return PilotPage(
          name: PilotRoutes.ScreenOne,
          page: (context) => ScreenOne(),
          transition: Transition.ios,
        );
      // 定义其他路由...
      default:
        return PilotPage(
          name: 'error',
          page: (context) => ErrorPage(),
        );
    }
  }
}

导航

在屏幕之间导航:

// 导航到命名路由
routePilot.toNamed('/screen_one');

// 返回上一页
routePilot.back();

// 替换当前路由
routePilot.off('/screen_two');

// 移除所有现有路由并导航
routePilot.offAll('/home');

传递参数

当导航时传递参数:

routePilot.toNamed('/screen_three', arguments: {'name': 'John Doe', 'age': 25});

在目标屏幕检索参数:

final name = routePilot.arg<String>('name');
final age = routePilot.arg<int>('age');

URL启动

使用RoutePilot启动URL:

// 在默认浏览器中启动
routePilot.launchInBrowser(Uri.parse('https://flutter.dev'));

// 在应用内浏览器中启动
routePilot.launchInAppBrowser(Uri.parse('https://dart.dev'));

// 在WebView中启动
routePilot.launchInAppWebView(Uri.parse('https://pub.dev'));

系统意图

触发系统意图:

// 拨打电话
routePilot.makePhoneCall('123-456-7890');

// 发送短信
routePilot.sendSms('123-456-7890', body: 'Hello from Flutter!');

// 发送电子邮件
routePilot.sendEmail(
  'example@example.com',
  subject: 'Test Email',
  body: 'This is a test email sent from a Flutter app.',
);

API参考

RoutePilot类

主要的导航和URL处理类。

方法:

  • to(Widget page, {dynamic arguments})
  • toNamed(String routeName, {dynamic arguments})
  • back()
  • offAll(String routeName, {dynamic arguments})
  • off(String routeName, {dynamic arguments})
  • launchInBrowser(Uri url)
  • launchInAppBrowser(Uri url)
  • launchInAppWebView(Uri url)
  • launchInAppWithCustomHeaders(Uri url, Map<String, String> headers)
  • launchInAppWithoutJavaScript(Uri url)
  • launchInAppWithoutDomStorage(Uri url)
  • launchUniversalLinkIOS(Uri url)
  • makePhoneCall(String phoneNumber)
  • sendSms(String phoneNumber, {String? body})
  • sendEmail(String email, {String? subject, String? body})
  • canLaunchUrl(Uri url)

PilotPage类

用于更精细地控制过渡的自定义Page实现。

属性:

  • page: 构建页面内容的函数。
  • name: 路由名称。
  • fullscreenDialog: 路由是否为全屏对话框。
  • transitionDuration: 过渡动画的持续时间。
  • transition: 过渡动画类型。
  • maintainState: 是否在非活动状态时保持路由状态。
  • opaque: 路由是否不透明。
  • parameters: 传递给路由的可选参数。
  • arguments: 传递给路由的可选参数。

Transition枚举

可用的过渡类型:

  • fadeIn
  • rightToLeft
  • leftToRight
  • topToBottom
  • bottomToTop
  • scale
  • rotate
  • size
  • ios

配置

iOS配置

将通过canLaunchUrl传递的任何URL方案作为LSApplicationQueriesSchemes条目添加到您的Info.plist文件中:

<key>LSApplicationQueriesSchemes</key>
<array>
  <string>sms</string>
  <string>tel</string>
</array>

Android配置

将通过canLaunchUrl传递的任何URL方案作为<queries>条目添加到您的AndroidManifest.xml文件中:

<queries>
  <!-- 如果您的应用检查SMS支持 -->
  <intent>
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="sms" />
  </intent>
  <!-- 如果您的应用检查电话支持 -->
  <intent>
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="tel" />
  </intent>
  <!-- 如果您的应用程序检查inAppBrowserView启动模式支持 -->
  <intent>
    <action android:name="android.support.customtabs.action.CustomTabsService" />
  </intent>
</queries>

示例

这是一个简单的示例,展示如何在Flutter应用中使用RoutePilot:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: routePilot.navigatorKey,
      onGenerateRoute: (settings) {
        final page = PilotPages.onGenerateRoute(settings);
        return page.createRoute(context);
      },
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('RoutePilot Example')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              child: Text('Go to ScreenOne'),
              onPressed: () => routePilot.toNamed('/screen_one'),
            ),
            ElevatedButton(
              child: Text('Launch URL in Browser'),
              onPressed: () => routePilot.launchInBrowser(Uri.parse('https://flutter.dev')),
            ),
            ElevatedButton(
              child: Text('Make Phone Call'),
              onPressed: () => routePilot.makePhoneCall('123-456-7890'),
            ),
          ],
        ),
      ),
    );
  }
}

class PilotPages {
  static PilotPage onGenerateRoute(RouteSettings settings) {
    switch (settings.name) {
      case '/':
        return PilotPage(
          name: '/',
          page: (context) => HomeScreen(),
        );
      case '/screen_one':
        return PilotPage(
          name: '/screen_one',
          page: (context) => ScreenOne(),
          transition: Transition.fadeIn,
        );
      default:
        return PilotPage(
          name: 'error',
          page: (context) => Scaffold(body: Center(child: Text('Page not found'))),
        );
    }
  }
}

class ScreenOne extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Screen One')),
      body: Center(
        child: Text('This is Screen One'),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用route_pilot插件进行路由管理的示例代码。route_pilot是一个用于简化Flutter路由管理的插件,它提供了一种声明式的方式来定义应用程序的路由。

首先,确保你已经在pubspec.yaml文件中添加了route_pilot依赖:

dependencies:
  flutter:
    sdk: flutter
  route_pilot: ^最新版本号  # 替换为当前最新版本号

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

接下来,我们将配置route_pilot来管理我们的路由。

1. 创建路由配置

创建一个新的Dart文件,比如route_config.dart,来定义我们的路由配置:

import 'package:flutter/material.dart';
import 'package:route_pilot/route_pilot.dart';
import 'package:your_app/screens/home_screen.dart';  // 替换为你的实际屏幕文件路径
import 'package:your_app/screens/detail_screen.dart'; // 替换为你的实际屏幕文件路径

class MyRouteConfig extends RouteConfig {
  @override
  Map<String, WidgetBuilder> get routes => {
    '/': (context) => HomeScreen(),
    '/detail': (context, args) => DetailScreen(args: args as Map<String, dynamic>),
  };
}

2. 使用RoutePilot进行路由管理

在你的main.dart文件中,使用RoutePilot来管理路由:

import 'package:flutter/material.dart';
import 'package:route_pilot/route_pilot.dart';
import 'route_config.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routeInformationParser: RouteInformationParser<RoutePath>(
        parseRouteInformation: _parseRouteInformation,
        restoreState: null,  // 如果需要状态恢复,可以实现此方法
      ),
      routerDelegate: RoutePilotDelegate<RoutePath>(
        routeConfig: MyRouteConfig(),
        initialPath: '/',
      ),
    );
  }

  RoutePath _parseRouteInformation(RouteInformation routeInformation) {
    final uri = Uri.parse(routeInformation.location ?? '/');
    final pathSegments = uri.pathSegments;

    if (pathSegments.isEmpty || pathSegments.first == '') {
      return RoutePath.home();
    } else if (pathSegments.first == 'detail') {
      final queryParameters = Map<String, dynamic>.from(uri.queryParameters);
      return RoutePath.detail(queryParameters);
    } else {
      // 处理未知路径,可以重定向到首页或显示错误页面
      return RoutePath.home();
    }
  }
}

// 定义路由路径类
class RoutePath {
  final String? path;
  final Map<String, dynamic>? queryParameters;

  RoutePath.home() : path = '/';

  RoutePath.detail(this.queryParameters) : path = '/detail';

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;

    return other is RoutePath &&
        other.path == path &&
        MapEquality().equals(other.queryParameters, queryParameters);
  }

  @override
  int get hashCode {
    return path.hashCode ^ queryParameters.hashCode;
  }
}

3. 定义屏幕组件

例如,home_screen.dartdetail_screen.dart可以像这样定义:

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

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home Screen')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pushNamed(context, '/detail', arguments: {'id': 123});
          },
          child: Text('Go to Detail'),
        ),
      ),
    );
  }
}

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

class DetailScreen extends StatelessWidget {
  final Map<String, dynamic> args;

  DetailScreen({required this.args});

  @override
  Widget build(BuildContext context) {
    final id = args['id'] as int?;
    return Scaffold(
      appBar: AppBar(title: Text('Detail Screen')),
      body: Center(
        child: Text('Detail ID: $id'),
      ),
    );
  }
}

这样,你就完成了使用route_pilot插件进行Flutter路由管理的配置。这个示例展示了如何定义路由配置、使用RoutePilotDelegate管理路由,并在屏幕组件之间进行导航。

回到顶部