Flutter插件meili_flutter的介绍与使用方法

Flutter插件meili_flutter的介绍与使用方法

Meili Flutter 插件简介

Meili Flutter 插件允许您将 Meili 的体验集成到您的 Flutter 应用程序中。通过该插件,您可以轻松实现卡支付、预订管理等功能。

功能特点

  • 跨平台支持:Meili 插件支持 iOS 和 Android 平台。
  • 可定制化 UI:提供强大的、可自定义的 UI 屏幕和元素,用于收集用户详细信息。
  • 直接集成:与 Meili 直接集成,确保无缝的用户体验。
  • 平台特定实现:为 iOS 和 Android 提供不同的实现,以确保每个平台的最佳性能。

安装

在 pubspec.yaml 文件中添加以下依赖项:

dependencies:
    meili_flutter: ^1.0.0

运行以下命令以安装包:

flutter pub get

要求

  • iOS 版本:16.0 或更高版本
  • Android 版本:根据项目的最低 SDK 要求

iOS

与目标 iOS 16 或更高版本的 App 兼容。

在 project.pbxproj 中更新 iOS 部署目标为 13.0,或者在 Xcode 的 Build Settings 中进行设置。

更新 Podfile:

source 'https://github.com/meili-travel-tech/meili-ios-pods'

platform :ios, '16.0'

使用

卡支付

有三种处理卡支付的方法:

方法 易用性 描述 文档链接
Meili Sheet View 简单 打开一个包含 Meili 流程的表单视图 Meili 支持
Meili Connect Widget 简单 原生 Flutter 小部件,可以与其他 Flutter 小部件一起嵌入 Meili 支持

Meili Direct

要打开 Meili 的直接流视图,使用以下代码片段:

import 'package:meili_flutter/meili_flutter.dart';

void _openMeiliView() async {
    final params = MeiliParams(
      ptid: 'ptid',
      currentFlow: FlowType.direct,
      env: 'dev',
    );

    try {
      await Meili.openMeiliView(params);
    } catch (e) {
      print("Failed to open MeiliView: $e");
    }
}

Meili Booking Manager

要打开 Meili 的预订管理流视图,使用以下代码片段:

import 'package:meili_flutter/meili_flutter.dart';

void _openMeiliView() async {
    final params = MeiliParams(
      ptid: 'ptid',
      currentFlow: FlowType.bookingManager,
      env: 'dev',
      bookingParams: BookingParams(
        confirmationId: "1234ABCD",
        lastName: "Doe"
      )
    );

    try {
      await Meili.openMeiliView(params);
    } catch (e) {
      print("Failed to open MeiliView: $e");
    }
}

Meili Connect

要使用 MeiliConnectWidget,将其集成到您的小部件树中,并传递必要的参数:

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

MeiliConnectWidget(
  ptid: '100.10',
  env: 'dev',
  availParams: AvailParams(
    pickupLocation: 'BCN',
    dropoffLocation: 'BCN',
    pickupDate: '2025-01-01',
    pickupTime: '12:00',
    dropoffDate: '2025-01-07',
    dropoffTime: '12:00',
    driverAge: 25,
    currencyCode: 'EUR',
    residency: 'IE',
  )
);

错误处理

如果在尝试打开 Meili 视图时发生错误,将抛出 PlatformException,并且错误消息将打印到控制台。

平台支持

iOS

Meili 视图在 iOS 上受支持。iOS 的 MethodChannel 为 meili_flutter_ios。

Android

我们正在努力将 Meili Android SDK 集成到 Meili Flutter 插件中。Meili 视图对 Android 的支持很快就会可用。在此期间,尝试在 Android 上打开 Meili 视图可能会导致 PlatformException,错误消息为 “Android platform view is not yet supported”。

示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 Meili 插件:

import 'package:flutter/cupertino.dart';
import 'package:meili_flutter/meili_flutter.dart';

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

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

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

class TabHomePage extends StatefulWidget {
  const TabHomePage({super.key});

  [@override](/user/override)
  State<TabHomePage> createState() => _TabHomePageState();
}

class _TabHomePageState extends State<TabHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return CupertinoTabScaffold(
      tabBar: CupertinoTabBar(
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            label: 'Direct',
            icon: Icon(CupertinoIcons.arrow_right),
          ),
          BottomNavigationBarItem(
            label: 'Connect',
            icon: Icon(CupertinoIcons.link),
          ),
          BottomNavigationBarItem(
            label: 'Booking Manager',
            icon: Icon(CupertinoIcons.person),
          ),
        ],
      ),
      tabBuilder: (context, index) {
        switch (index) {
          case 0:
            return const MeiliDirectFlowButton();
          case 1:
            return const HomePage();
          case 2:
            return const MeiliBookingManagerFlowButton();
          default:
            return Container();
        }
      },
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: const CupertinoNavigationBar(
        middle: Text('IN PATH BOOKING'),
      ),
      child: SafeArea(
        child: SingleChildScrollView(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'Welcome to the Flutter Example App',
                  style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
                ),
              ),
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'This is some dummy content above the MeiliView widget.',
                  style: TextStyle(fontSize: 16),
                ),
              ),
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'More dummy content above the MeiliView widget.',
                  style: TextStyle(fontSize: 16),
                ),
              ),
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'Even more dummy content above the MeiliView widget.',
                  style: TextStyle(fontSize: 16),
                ),
              ),

              // MeiliConnectWidget
              MeiliConnectWidget(
                ptid: '125.10',
                env: 'prod',
                availParams: AvailParams(
                  pickupLocation: 'MUC',
                  dropoffLocation: 'MUC',
                  pickupDate: '2025-01-01',
                  pickupTime: '12:00',
                  dropoffDate: '2025-01-07',
                  dropoffTime: '12:00',
                  driverAge: 25,
                  currencyCode: 'EUR',
                  residency: 'IE',
                ),
              ),

              // Dummy content below the MeiliView
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'This is some dummy content below the MeiliView widget.',
                  style: TextStyle(fontSize: 16),
                ),
              ),
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'Enjoy exploring the app!',
                  style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
                ),
              ),
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'Even more dummy content below the MeiliView widget.',
                  style: TextStyle(fontSize: 16),
                ),
              ),
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'More dummy content below the MeiliView widget.',
                  style: TextStyle(fontSize: 16),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

  Future<void> _openMeiliView() async {
    final params = MeiliParams(
      ptid: '100.9',
      flow: FlowType.direct,
      env: 'dev',
    );

    try {
      await Meili.openMeiliView(params);
    } catch (e) {
      print('Failed to open MeiliView: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return CupertinoButton(
      onPressed: _openMeiliView,
      child: const Text('Open Meili Direct'),
    );
  }
}

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

  Future<void> _openMeiliView() async {
    final params = MeiliParams(
      ptid: '100.9',
      flow: FlowType.bookingManager,
      env: 'dev',
    );

    try {
      await Meili.openMeiliView(params);
    } catch (e) {
      print('Failed to open MeiliView: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return CupertinoButton(
      onPressed: _openMeiliView,
      child: const Text('Open Meili Booking Manager'),
    );
  }
}

更多关于Flutter插件meili_flutter的介绍与使用方法的实战教程也可以访问 https://www.itying.com/category-92-b0.html

回到顶部